Annotation of 43BSDReno/contrib/mh/uip/prompter.c, revision 1.1

1.1     ! root        1: /* prompter.c - prompting editor front-end */
        !             2: 
        !             3: #include "../h/mh.h"
        !             4: #include <stdio.h>
        !             5: #include <errno.h>
        !             6: #ifndef        SYS5
        !             7: #include <sgtty.h>
        !             8: #else  SYS5
        !             9: #include <sys/types.h>
        !            10: #include <termio.h>
        !            11: #include <sys/ioctl.h>
        !            12: #endif SYS5
        !            13: #ifdef BSD42
        !            14: #include <setjmp.h>
        !            15: #endif BSD42
        !            16: #include <signal.h>
        !            17: 
        !            18: 
        !            19: #define        QUOTE   '\\'
        !            20: #ifndef        CKILL
        !            21: #define CKILL   '@'
        !            22: #endif not CKILL
        !            23: #ifndef        CERASE
        !            24: #define CERASE  '#'
        !            25: #endif not CERASE
        !            26: 
        !            27: /*  */
        !            28: 
        !            29: static struct swit switches[] = {
        !            30: #define        ERASESW 0
        !            31:     "erase chr", 0,
        !            32: #define        KILLSW  1
        !            33:     "kill chr", 0,
        !            34: 
        !            35: #define        PREPSW  2
        !            36:     "prepend", 0,
        !            37: #define        NPREPSW 3
        !            38:     "noprepend", 0,
        !            39: 
        !            40: #define        RAPDSW  4
        !            41:     "rapid", 0,
        !            42: #define        NRAPDSW 5
        !            43:     "norapid", 0,
        !            44: 
        !            45: #define        BODYSW  6
        !            46:     "body", -4,
        !            47: #define        NBODYSW 7
        !            48:     "nobody", -6,
        !            49: 
        !            50: #define        HELPSW  8
        !            51:     "help", 4,
        !            52: 
        !            53:     NULL, NULL
        !            54: };
        !            55: 
        !            56: /*  */
        !            57: 
        !            58: extern int  errno;
        !            59: 
        !            60: 
        !            61: #ifndef        SYS5
        !            62: #define        ERASE   sg.sg_erase
        !            63: #define        KILL    sg.sg_kill
        !            64: static struct sgttyb    sg;
        !            65: 
        !            66: #define        INTR    tc.t_intrc
        !            67: static struct tchars    tc;
        !            68: #else  SYS5
        !            69: #define        ERASE   sg.c_cc[VERASE]
        !            70: #define        KILL    sg.c_cc[VKILL]
        !            71: #define        INTR    sg.c_cc[VINTR]
        !            72: static struct termio    sg;
        !            73: #endif SYS5
        !            74: 
        !            75: 
        !            76: static int  wtuser = 0;
        !            77: static int  sigint = 0;
        !            78: 
        !            79: #ifdef BSD42
        !            80: static jmp_buf sigenv;
        !            81: #endif BSD42
        !            82: 
        !            83: static SIGDECL intrser();
        !            84: 
        !            85: /*  */
        !            86: 
        !            87: /* ARGSUSED */
        !            88: 
        !            89: main(argc, argv)
        !            90:        int argc;
        !            91:        char *argv[];
        !            92: {
        !            93:     int     body = 1,
        !            94:            prepend = 1,
        !            95:            rapid = 0,
        !            96:            fdi,
        !            97:            fdo,
        !            98:             i,
        !            99:             state;
        !           100:     char   *cp,
        !           101:            *drft = NULL,
        !           102:            *erasep = NULL,
        !           103:            *killp = NULL,
        !           104:             name[NAMESZ],
        !           105:             field[BUFSIZ],
        !           106:             buffer[BUFSIZ],
        !           107:             tmpfil[BUFSIZ],
        !           108:           **ap,
        !           109:            *arguments[MAXARGS],
        !           110:           **argp;
        !           111:     FILE *in, *out;
        !           112: 
        !           113:     invo_name = r1bindex (argv[0], '/');
        !           114:     if ((cp = m_find (invo_name)) != NULL) {
        !           115:        ap = brkstring (cp = getcpy (cp), " ", "\n");
        !           116:        ap = copyip (ap, arguments);
        !           117:     }
        !           118:     else
        !           119:        ap = arguments;
        !           120:     (void) copyip (argv + 1, ap);
        !           121:     argp = arguments;
        !           122: 
        !           123: /*  */
        !           124: 
        !           125:     while (cp = *argp++)
        !           126:        if (*cp == '-')
        !           127:            switch (smatch (++cp, switches)) {
        !           128:                case AMBIGSW:
        !           129:                    ambigsw (cp, switches);
        !           130:                    done (1);
        !           131:                case UNKWNSW:
        !           132:                    adios (NULLCP, "-%s unknown", cp);
        !           133:                case HELPSW:
        !           134:                    (void) sprintf (buffer, "%s [switches] file", invo_name);
        !           135:                    help (buffer, switches);
        !           136:                    done (1);
        !           137: 
        !           138:                case ERASESW:
        !           139:                    if (!(erasep = *argp++) || *erasep == '-')
        !           140:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !           141:                    continue;
        !           142:                case KILLSW:
        !           143:                    if (!(killp = *argp++) || *killp == '-')
        !           144:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !           145:                    continue;
        !           146: 
        !           147:                case PREPSW:
        !           148:                    prepend++;
        !           149:                    continue;
        !           150:                case NPREPSW:
        !           151:                    prepend = 0;
        !           152:                    continue;
        !           153: 
        !           154:                case RAPDSW:
        !           155:                    rapid++;
        !           156:                    continue;
        !           157:                case NRAPDSW:
        !           158:                    rapid = 0;
        !           159:                    continue;
        !           160: 
        !           161:                case BODYSW:
        !           162:                    body++;
        !           163:                    continue;
        !           164:                case NBODYSW:
        !           165:                    body = 0;
        !           166:                    continue;
        !           167:            }
        !           168:        else
        !           169:            if (!drft)
        !           170:                drft = cp;
        !           171: 
        !           172: /*  */
        !           173: 
        !           174:     if (!drft)
        !           175:        adios (NULLCP, "usage: %s [switches] file", invo_name);
        !           176:     if ((in = fopen (drft, "r")) == NULL)
        !           177:        adios (drft, "unable to open");
        !           178: 
        !           179:     (void) strcpy (tmpfil, m_tmpfil (invo_name));
        !           180:     if ((out = fopen (tmpfil, "w")) == NULL)
        !           181:        adios (tmpfil, "unable to create");
        !           182:     (void) chmod (tmpfil, 0600);
        !           183: 
        !           184:     if (killp || erasep) {
        !           185: #ifndef        SYS5
        !           186:        int    serase,
        !           187:               skill;
        !           188: #else  SYS5
        !           189:        char   serase,
        !           190:               skill;
        !           191: #endif SYS5
        !           192: 
        !           193: #ifndef        SYS5
        !           194:        (void) ioctl (0, TIOCGETP, (char *) &sg);
        !           195:        (void) ioctl (0, TIOCGETC, (char *) &tc);
        !           196: #else  SYS5
        !           197:        (void) ioctl(0, TCGETA, &sg);
        !           198: #endif SYS5
        !           199:        skill = KILL;
        !           200:        serase = ERASE;
        !           201:        KILL = killp ? chrcnv (killp) : skill;
        !           202:        ERASE = erasep ? chrcnv (erasep) : serase;
        !           203: #ifndef        SYS5
        !           204:        (void) ioctl (0, TIOCSETN, (char *) &sg);
        !           205: #else  SYS5
        !           206:        (void) ioctl(0, TCSETAW, &sg);
        !           207: #endif SYS5
        !           208: 
        !           209:        chrdsp ("erase", ERASE);
        !           210:        chrdsp (", kill", KILL);
        !           211:        chrdsp (", intr", INTR);
        !           212:        (void) putchar ('\n');
        !           213:        (void) fflush (stdout);
        !           214: 
        !           215:        KILL = skill;
        !           216:        ERASE = serase;
        !           217:     }
        !           218: 
        !           219: /*  */
        !           220: 
        !           221:     sigint = 0;
        !           222:     setsig (SIGINT, intrser);
        !           223: 
        !           224:     for (state = FLD;;) {
        !           225:        switch (state = m_getfld (state, name, field, sizeof field, in)) {
        !           226:            case FLD:
        !           227:            case FLDEOF:
        !           228:            case FLDPLUS:
        !           229:                for (cp = field; *cp; cp++)
        !           230:                    if (*cp != ' ' && *cp != '\t')
        !           231:                        break;
        !           232:                if (*cp++ != '\n' || *cp != NULL) {
        !           233:                    printf ("%s:%s", name, field);
        !           234:                    fprintf (out, "%s:%s", name, field);
        !           235:                    while (state == FLDPLUS) {
        !           236:                        state =
        !           237:                            m_getfld (state, name, field, sizeof field, in);
        !           238:                        printf ("%s", field);
        !           239:                        fprintf (out, "%s", field);
        !           240:                    }
        !           241:                }
        !           242:                else {
        !           243:                    printf ("%s: ", name);
        !           244:                    (void) fflush (stdout);
        !           245:                    i = getln (field, sizeof field);
        !           246:                    if (i == -1) {
        !           247: abort: ;
        !           248:                        if (killp || erasep)
        !           249: #ifndef        SYS5
        !           250:                            (void) ioctl (0, TIOCSETN, (char *) &sg);
        !           251: #else  SYS5
        !           252:                            (void) ioctl (0, TCSETA, &sg);
        !           253: #endif SYS5
        !           254:                        (void) unlink (tmpfil);
        !           255:                        done (1);
        !           256:                    }
        !           257:                    if (i != 0 || (field[0] != '\n' && field[0] != NULL)) {
        !           258:                        fprintf (out, "%s:", name);
        !           259:                        do {
        !           260:                            if (field[0] != ' ' && field[0] != '\t')
        !           261:                                (void) putc (' ', out);
        !           262:                            fprintf (out, "%s", field);
        !           263:                        } while (i == 1
        !           264:                                    && (i = getln (field, sizeof field)) >= 0);
        !           265:                        if (i == -1)
        !           266:                            goto abort;
        !           267:                    }
        !           268:                }
        !           269:                if (state == FLDEOF) {/* moby hack */
        !           270:                    fprintf (out, "--------\n");
        !           271:                    printf ("--------\n");
        !           272:                    if (!body)
        !           273:                        break;
        !           274:                    goto no_body;
        !           275:                }
        !           276:                continue;
        !           277: 
        !           278:            case BODY:
        !           279:            case BODYEOF:
        !           280:            case FILEEOF:
        !           281:                fprintf (out, "--------\n");
        !           282:                if (field[0] == NULL || !prepend)
        !           283:                    printf ("--------\n");
        !           284:                if (field[0]) {
        !           285:                    if (prepend && body) {
        !           286:                        printf ("\n--------Enter initial text\n\n");
        !           287:                        (void) fflush (stdout);
        !           288:                        for (;;) {
        !           289:                            (void) getln (buffer, sizeof buffer);
        !           290:                            if (buffer[0] == NULL)
        !           291:                                break;
        !           292:                            fprintf (out, "%s", buffer);
        !           293:                        }
        !           294:                    }
        !           295: 
        !           296:                    do {
        !           297:                        fprintf (out, "%s", field);
        !           298:                        if (!rapid && !sigint)
        !           299:                            printf ("%s", field);
        !           300:                    } while (state == BODY &&
        !           301:                            (state = m_getfld (state, name, field, sizeof field, in)));
        !           302:                    if (prepend || !body)
        !           303:                        break;
        !           304:                    else
        !           305:                        printf ("\n--------Enter additional text\n\n");
        !           306:                }
        !           307: no_body: ;
        !           308:                (void) fflush (stdout);
        !           309:                for (;;) {
        !           310:                    (void) getln (field, sizeof field);
        !           311:                    if (field[0] == NULL)
        !           312:                        break;
        !           313:                    fprintf (out, "%s", field);
        !           314:                }
        !           315:                break;
        !           316: 
        !           317:            default:
        !           318:                adios (NULLCP, "skeleton is poorly formatted");
        !           319:        }
        !           320:        break;
        !           321:     }
        !           322: 
        !           323:     if (body)
        !           324:        printf ("--------\n");
        !           325:     (void) fflush (stdout);
        !           326: 
        !           327:     (void) fclose (in);
        !           328:     (void) fclose (out);
        !           329: 
        !           330:     (void) signal (SIGINT, SIG_IGN);
        !           331: 
        !           332: /*  */
        !           333: 
        !           334:     if (killp || erasep)
        !           335: #ifndef        SYS5
        !           336:        (void) ioctl (0, TIOCSETN, (char *) &sg);
        !           337: #else  SYS5
        !           338:        (void) ioctl (0, TCSETAW, &sg);
        !           339: #endif SYS5
        !           340: 
        !           341:     if ((fdi = open (tmpfil, 0)) == NOTOK)
        !           342:        adios (tmpfil, "unable to re-open");
        !           343:     if ((fdo = creat (drft, m_gmprot ())) == NOTOK)
        !           344:        adios (drft, "unable to write");
        !           345:     cpydata (fdi, fdo, tmpfil, drft);
        !           346:     (void) close (fdi);
        !           347:     (void) close (fdo);
        !           348:     (void) unlink (tmpfil);
        !           349: 
        !           350:     m_update ();
        !           351: 
        !           352:     done (0);
        !           353: }
        !           354: 
        !           355: /*  */
        !           356: 
        !           357: getln(buffer, n)
        !           358:        register char *buffer;
        !           359:        register int n;
        !           360: {
        !           361:     int     c;
        !           362:     char   *cp;
        !           363: 
        !           364:     cp = buffer;
        !           365:     *cp = NULL;
        !           366: 
        !           367: #ifndef        BSD42
        !           368:     wtuser = 1;
        !           369: #else  BSD42
        !           370:     switch (setjmp (sigenv)) {
        !           371:        case OK:
        !           372:            wtuser = 1;
        !           373:            break;
        !           374: 
        !           375:        case DONE:
        !           376:            wtuser = 0;
        !           377:            return 0;
        !           378: 
        !           379:        default:
        !           380:            wtuser = 0;
        !           381:            return NOTOK;
        !           382:     }
        !           383: #endif BSD42
        !           384: 
        !           385:     for (;;)
        !           386:        switch (c = getchar ()) {
        !           387:            case EOF:
        !           388: #ifndef BSD42
        !           389:                wtuser = 0;
        !           390:                return (errno != EINTR ? 0 : NOTOK);
        !           391: #else  BSD42
        !           392:                clearerr (stdin);
        !           393:                longjmp (sigenv, DONE);
        !           394: #endif BSD42
        !           395: 
        !           396:            case '\n':
        !           397:                if (cp[-1] == QUOTE) {
        !           398:                    cp[-1] = c;
        !           399:                    wtuser = 0;
        !           400:                    return 1;
        !           401:                }
        !           402:                *cp++ = c;
        !           403:                *cp = NULL;
        !           404:                wtuser = 0;
        !           405:                return 0;
        !           406: 
        !           407:            default:
        !           408:                if (cp < buffer + n)
        !           409:                    *cp++ = c;
        !           410:                *cp = NULL;
        !           411:        }
        !           412: }
        !           413: 
        !           414: /*  */
        !           415: 
        !           416: /* ARGSUSED */
        !           417: 
        !           418: static SIGDECL
        !           419: intrser(i)
        !           420:        int i;
        !           421: {
        !           422: #ifndef        BSD42
        !           423:     (void) signal (SIGINT, intrser);
        !           424:     if (!wtuser)
        !           425:        sigint++;
        !           426: #else  BSD42
        !           427:     if (wtuser)
        !           428:        longjmp (sigenv, NOTOK);
        !           429:     sigint++;
        !           430: #endif BSD42
        !           431: }
        !           432: 
        !           433: 
        !           434: chrcnv(cp)
        !           435:        register char *cp;
        !           436: {
        !           437:     return (*cp != QUOTE ? *cp : m_atoi (++cp));
        !           438: }
        !           439: 
        !           440: 
        !           441: chrdsp(s, c)
        !           442:        char *s, c;
        !           443: {
        !           444:     printf ("%s ", s);
        !           445:     if (c < ' ' || c == 0177)
        !           446:        printf ("^%c", c ^ 0100);
        !           447:     else
        !           448:        printf ("%c", c);
        !           449: }
        !           450: 
        !           451: /*
        !           452:  * XXX We need to force config.o to be linked in to get around
        !           453:  * library order problems
        !           454:  */
        !           455: /* XXX don't bother if linking with the shared library */
        !           456: #ifndef SHARED
        !           457: static void
        !           458: kludge()
        !           459: {
        !           460:        (void)libpath((char *)0);
        !           461: }
        !           462: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.