Annotation of researchv10no/cmd/troff/Old/n1.c, revision 1.1.1.1

1.1       root        1: #include <ctype.h>
                      2: #include <sys/types.h>
                      3: #include <sys/stat.h>
                      4: #include "tdef.h"
                      5: extern
                      6: #include "d.h"
                      7: extern
                      8: #include "v.h"
                      9: #ifdef NROFF
                     10: extern
                     11: #include "tw.h"
                     12: #endif
                     13: #include "s.h"
                     14: #include <setjmp.h>
                     15: jmp_buf sjbuf;
                     16: #include       <sgtty.h>
                     17: /*
                     18: troff1.c
                     19: 
                     20: consume options, initialization, main loop,
                     21: input routines, escape function calling
                     22: */
                     23: 
                     24: #include "ext.h"
                     25: 
                     26: char   *sprintf();
                     27: tchar  inchar[LNSIZE], *pinchar = inchar;      /* XXX */
                     28: filep ipl[NSO];
                     29: long   offl[NSO];
                     30: long   ioff;
                     31: char   *ttyp;
                     32: extern struct contab {
                     33:        int     rq;
                     34:        union {
                     35:                int     (*f)();
                     36:                unsigned        mx;
                     37:        } x;
                     38: } contab[NM];
                     39: 
                     40: main(argc, argv)
                     41: int    argc;
                     42: char   **argv;
                     43: {
                     44:        register char   *p, *q;
                     45:        register j;
                     46:        tchar i;
                     47:        extern catch(), kcatch();
                     48:        int     oargc;
                     49:        char    **oargv;
                     50: 
                     51:        signal(SIGHUP, catch);
                     52:        if (signal(SIGINT, catch) == SIG_IGN) {
                     53:                signal(SIGHUP, SIG_IGN);
                     54:                signal(SIGINT, SIG_IGN);
                     55:                signal(SIGQUIT, SIG_IGN);
                     56:        }
                     57:        signal(SIGPIPE, catch);
                     58:        signal(SIGTERM, kcatch);
                     59:        oargc = argc;
                     60:        oargv = argv;
                     61:        init0();
                     62: options:
                     63:        while (--argc > 0 && (++argv)[0][0] == '-')
                     64:                switch (argv[0][1]) {
                     65: 
                     66:                case 'F':       /* switch font tables from default */
                     67:                        if (argv[0][2] != '\0') {
                     68:                                strcpy(termtab, &argv[0][2]);
                     69:                                strcpy(fontfile, &argv[0][2]);
                     70:                        } else {
                     71:                                argv++; argc--;
                     72:                                strcpy(termtab, argv[0]);
                     73:                                strcpy(fontfile, argv[0]);
                     74:                        }
                     75:                        continue;
                     76:                case 0:
                     77:                        goto start;
                     78:                case 'i':
                     79:                        stdi++;
                     80:                        continue;
                     81:                case 'q':
                     82:                        quiet++;
                     83:                        if (gtty(0, &ttys) >= 0)
                     84:                                ttysave = ttys.sg_flags;
                     85:                        continue;
                     86:                case 'n':
                     87:                        npn = ctoi(&argv[0][2]);
                     88:                        continue;
                     89:                case 'u':       /* set emboldening amount */
                     90:                        bdtab[3] = ctoi(&argv[0][2]);
                     91:                        if (bdtab[3] < 0 || bdtab[3] > 50)
                     92:                                bdtab[3] = 0;
                     93:                        continue;
                     94:                case 's':
                     95:                        if (!(stop = ctoi(&argv[0][2])))
                     96:                                stop++;
                     97:                        continue;
                     98:                case 'r':
                     99:                        eibuf = sprintf(ibuf+strlen(ibuf), ".nr %c %s\n",
                    100:                                argv[0][2], &argv[0][3]);
                    101:                        continue;
                    102:                case 'm':
                    103:                        p = &nextf[nfi];
                    104:                        q = &argv[0][2];
                    105:                        while ((*p++ = *q++) != 0)
                    106:                                ;
                    107:                        mflg++;
                    108:                        continue;
                    109:                case 'o':
                    110:                        getpn(&argv[0][2]);
                    111:                        continue;
                    112: #ifdef NROFF
                    113:                case 'h':
                    114:                        hflg++;
                    115:                        continue;
                    116:                case 'z':
                    117:                        no_out++;
                    118:                        continue;
                    119:                case 'e':
                    120:                        eqflg++;
                    121:                        continue;
                    122:                case 'T':
                    123:                        strcat(termtab, &argv[0][2]);
                    124:                        dotT++;
                    125:                        continue;
                    126: #endif
                    127: #ifndef NROFF
                    128:                case 'T':
                    129:                        strcpy(devname, &argv[0][2]);
                    130:                        dotT++;
                    131:                        continue;
                    132:                case 'z':
                    133:                        no_out++;
                    134:                case 'a':
                    135:                        ascii = 1;
                    136:                        nofeed++;
                    137:                case 't':
                    138:                        ptid = 1;
                    139:                        continue;
                    140:                case 'f':
                    141:                        nofeed++;
                    142:                        continue;
                    143: #endif
                    144:                default:
                    145:                        fprintf(stderr, "troff: unknown option %s\n", argv[0]);
                    146:                        done(02);
                    147:                }
                    148: 
                    149: start:
                    150:        init1(oargv[0][0]);
                    151:        argp = argv;
                    152:        rargc = argc;
                    153:        init2();
                    154:        setjmp(sjbuf);
                    155: loop:
                    156:        copyf = lgf = nb = nflush = nlflg = 0;
                    157:        if (ip && rbf0(ip) == 0 && ejf && frame->pframe <= ejl) {
                    158:                nflush++;
                    159:                trap = 0;
                    160:                eject((struct s *)0);
                    161:                goto loop;
                    162:        }
                    163:        i = getch();
                    164:        if (pendt)
                    165:                goto lt;
                    166:        if ((j = cbits(i)) == XPAR) {
                    167:                copyf++;
                    168:                tflg++;
                    169:                while (cbits(i) != '\n')
                    170:                        pchar(i = getch());
                    171:                tflg = 0;
                    172:                copyf--;
                    173:                goto loop;
                    174:        }
                    175:        if (j == cc || j == c2) {
                    176:                if (j == c2)
                    177:                        nb++;
                    178:                copyf++;
                    179:                while ((j = cbits(i = getch())) == ' ' || j == '\t')
                    180:                        ;
                    181:                ch = i;
                    182:                copyf--;
                    183:                control(getrq(), 1);
                    184:                flushi();
                    185:                goto loop;
                    186:        }
                    187: lt:
                    188:        ch = i;
                    189:        text();
                    190:        goto loop;
                    191: }
                    192: 
                    193: 
                    194: catch()
                    195: {
                    196:        done3(01);
                    197: }
                    198: 
                    199: 
                    200: kcatch()
                    201: {
                    202:        signal(SIGTERM, SIG_IGN);
                    203:        done3(01);
                    204: }
                    205: 
                    206: 
                    207: init0()
                    208: {
                    209:        eibuf = ibufp = ibuf;
                    210:        ibuf[0] = 0;
                    211:        v.nl = -1;
                    212: }
                    213: 
                    214: 
                    215: init1(a)
                    216: char   a;
                    217: {
                    218:        register char   *p;
                    219:        char    *mktemp();
                    220:        register i;
                    221: 
                    222:        p = mktemp("/usr/tmp/trtmpXXXXX");
                    223:        if (a == 'a')
                    224:                p = &p[9];
                    225:        if ((close(creat(p, 0600))) < 0) {
                    226:                fprintf(stderr, "troff: cannot create temp file.\n");
                    227:                exit(-1);
                    228:        }
                    229:        ibf = open(p, 2);
                    230:        unlkp = p;
                    231:        for (i = NTRTAB; --i; )
                    232:                trtab[i] = i;
                    233:        trtab[UNPAD] = ' ';
                    234: }
                    235: 
                    236: 
                    237: init2()
                    238: {
                    239:        register i, j;
                    240:        register char *p;
                    241:        tchar *t;
                    242:        extern int      block;
                    243:        extern char     *setbrk();
                    244:        extern char     *ttyname();
                    245: 
                    246:        ttyod = 2;
                    247:        if ((ttyp=ttyname(j=0)) != 0 || (ttyp=ttyname(j=1)) != 0 || (ttyp=ttyname(j=2)) != 0)
                    248:                ;
                    249:        else 
                    250:                ttyp = "notty";
                    251:        iflg = j;
                    252:        if (ascii)
                    253:                mesg(0);
                    254:        obufp = obuf;
                    255:        ptinit();
                    256:        mchbits();
                    257:        cvtime();
                    258:        v.pid = getpid();
                    259:        olinep = oline;
                    260:        ioff = 0;
                    261:        v.hp = init = 0;
                    262:        pinchar = inchar;       /* XXX */
                    263:        v.nl = -1;
                    264:        nfo = 0;
                    265:        ifile = 0;
                    266:        copyf = raw = 0;
                    267:        level = 0;
                    268:        eibuf = sprintf(ibuf+strlen(ibuf), ".ds .T %s\n", devname);
                    269:        for (p=ibuf, t=cbuf; *t++ = *p++; )
                    270:                ;
                    271:        cp = cbuf;
                    272:        eibuf = ibuf;
                    273:        ibufp = ibuf;
                    274:        nx = mflg;
                    275:        frame = stk = (struct s *)setbrk(DELTA);
                    276:        dip = &d[0];
                    277:        nxf = frame + 1;
                    278:        for (i = NEV; i--; )
                    279:                write(ibf, (char *) & block, EVS);
                    280: }
                    281: 
                    282: 
                    283: cvtime()
                    284: {
                    285:        long    tt;
                    286:        register i;
                    287:        static int ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
                    288: 
                    289:        time(&tt);
                    290:        tt -= 3600 * ZONE;      /* 5hrs for EST */
                    291:        v.dy = (tt / 86400L) + 1;
                    292:        v.dw = (v.dy + 3) % 7 + 1;
                    293:        for (v.yr = 70; ; v.yr++) {
                    294:                if ((v.yr) % 4)
                    295:                        ms[1] = 28;
                    296:                else 
                    297:                        ms[1] = 29;
                    298:                for (i = 0; i < 12; ) {
                    299:                        if (v.dy <= ms[i]) {
                    300:                                v.mo = i + 1;
                    301:                                return;
                    302:                        }
                    303:                        v.dy -= ms[i++];
                    304:                }
                    305:        }
                    306: }
                    307: 
                    308: 
                    309: ctoi(s)
                    310:        register char *s;
                    311: {
                    312:        register n;
                    313: 
                    314:        while (*s == ' ')
                    315:                s++;
                    316:        n = 0;
                    317:        while (isdigit(*s))
                    318:                n = 10 * n + *s++ - '0';
                    319:        return n;
                    320: }
                    321: 
                    322: 
                    323: mesg(f)
                    324: int    f;
                    325: {
                    326:        static int      mode;
                    327: 
                    328:        if (!f) {
                    329:                stat(ttyp, cbuf);
                    330:                mode = ((struct stat *)(cbuf))->st_mode;
                    331:                chmod(ttyp, mode & ~0122);      /* turn off writing for others */
                    332:        } else {
                    333:                chmod(ttyp, mode);
                    334:        }
                    335: }
                    336: 
                    337: 
                    338: /*
                    339:  * Scaled down version of C Library printf.
                    340:  * Only %s %u %d (==%u) %o %c %x %D are recognized.
                    341:  */
                    342: #define        putchar(n)      (*pfbp++ = (n)) /* NO CHECKING! */
                    343: 
                    344: static char    pfbuf[NTM];
                    345: static char    *pfbp = pfbuf;
                    346: int    stderr   = 2;   /* NOT stdio value */
                    347: 
                    348: /* VARARGS */
                    349: fprintf(fd, fmt, x1)
                    350: int    fd;
                    351: char   *fmt;
                    352: unsigned       x1;
                    353: {
                    354:        register c;
                    355:        register unsigned int   *adx;
                    356:        char    *s;
                    357:        register i;
                    358: 
                    359:        pfbp = pfbuf;
                    360:        adx = &x1;
                    361: loop:
                    362:        while ((c = *fmt++) != '%') {
                    363:                if (c == '\0') {
                    364:                        if (fd == stderr)
                    365:                                write(stderr, pfbuf, pfbp - pfbuf);
                    366:                        else {
                    367:                                *pfbp = 0;
                    368:                                pfbp = pfbuf;
                    369:                                while (*pfbp) {
                    370:                                        *obufp++ = *pfbp++;
                    371:                                        if (obufp >= &obuf[OBUFSZ])
                    372:                                                flusho();
                    373:                                }
                    374:                        }
                    375:                        return;
                    376:                }
                    377:                putchar(c);
                    378:        }
                    379:        c = *fmt++;
                    380:        if (c == 'd') {
                    381:                i = *adx;
                    382:                if (i < 0) {
                    383:                        putchar('-');
                    384:                        i = -i;
                    385:                }
                    386:                printn((long)i, 10);
                    387:        } else if (c == 'u' || c == 'o' || c == 'x')
                    388:                printn((long)*adx, c == 'o' ? 8 : (c == 'x' ? 16 : 10));
                    389:        else if (c == 'c') {
                    390:                if (c > 0177 || c < 040)
                    391:                        putchar('\\');
                    392:                putchar(*adx & 0177);
                    393:        } else if (c == 's') {
                    394:                s = (char *) * adx;
                    395:                while (c = *s++)
                    396:                        putchar(c);
                    397:        } else if (c == 'D') {
                    398:                printn(*(long *)adx, 10);
                    399:                adx += (sizeof(long) / sizeof(int)) - 1;
                    400:        } else if (c == 'O') {
                    401:                printn(*(long *)adx, 8);
                    402:                adx += (sizeof(long) / sizeof(int)) - 1;
                    403:        }
                    404:        adx++;
                    405:        goto loop;
                    406: }
                    407: 
                    408: 
                    409: /*
                    410:  * Print an unsigned integer in base b.
                    411:  */
                    412: static printn(n, b)
                    413: long   n;
                    414: {
                    415:        register long   a;
                    416: 
                    417:        if (n < 0) {    /* shouldn't happen */
                    418:                putchar('-');
                    419:                n = -n;
                    420:        }
                    421:        if (a = n / b)
                    422:                printn(a, b);
                    423:        putchar("0123456789ABCDEF"[(int)(n%b)]);
                    424: }
                    425: 
                    426: /* scaled down version of library sprintf */
                    427: /* same limits as fprintf */
                    428: /* returns pointer to \0 that ends the string */
                    429: 
                    430: /* VARARGS */
                    431: char *sprintf(str, fmt, x1)
                    432:        char    *str;
                    433:        char    *fmt;
                    434:        unsigned        x1;
                    435: {
                    436:        register c;
                    437:        char *sprintn();
                    438:        register unsigned int   *adx;
                    439:        char    *s;
                    440:        register i;
                    441: 
                    442:        adx = &x1;
                    443: loop:
                    444:        while ((c = *fmt++) != '%') {
                    445:                if (c == '\0') {
                    446:                        *str = 0;
                    447:                        return str;
                    448:                }
                    449:                *str++ = c;
                    450:        }
                    451:        c = *fmt++;
                    452:        if (c == 'd') {
                    453:                i = *adx;
                    454:                if (i < 0) {
                    455:                        *str++ = '-';
                    456:                        i = -i;
                    457:                }
                    458:                str = sprintn(str, (long)i, 10);
                    459:        } else if (c == 'u' || c == 'o' || c == 'x')
                    460:                str = sprintn(str, (long)*adx, c == 'o' ? 8 : (c == 'x' ? 16 : 10));
                    461:        else if (c == 'c') {
                    462:                if (c > 0177 || c < 040)
                    463:                        *str++ = '\\';
                    464:                *str++ = *adx & 0177;
                    465:        } else if (c == 's') {
                    466:                s = (char *) * adx;
                    467:                while (c = *s++)
                    468:                        *str++ = c;
                    469:        } else if (c == 'D') {
                    470:                str = sprintn(str, *(long *)adx, 10);
                    471:                adx += (sizeof(long) / sizeof(int)) - 1;
                    472:        } else if (c == 'O') {
                    473:                str = sprintn(str, *(long *)adx, 8);
                    474:                adx += (sizeof(long) / sizeof(int)) - 1;
                    475:        }
                    476:        adx++;
                    477:        goto loop;
                    478: }
                    479: 
                    480: /*
                    481:  * Print an unsigned integer in base b.
                    482:  */
                    483: static char *sprintn(s, n, b)
                    484:        register char *s;
                    485:        register long n;
                    486: {
                    487:        register long   a;
                    488: 
                    489:        if (n < 0) {    /* shouldn't happen */
                    490:                *s++ = '-';
                    491:                n = -n;
                    492:        }
                    493:        if (a = n / b)
                    494:                s = sprintn(s, a, b);
                    495:        *s++ = "0123456789ABCDEF"[(int)(n%b)];
                    496:        return s;
                    497: }
                    498: 
                    499: 
                    500: control(a, b)
                    501: register int   a, b;
                    502: {
                    503:        register int    j;
                    504: 
                    505:        if (a == 0 || (j = findmn(a)) == -1)
                    506:                return(0);
                    507:        if (contab[j].rq & MMASK) {
                    508:                nxf->nargs = 0;
                    509:                if (b)
                    510:                        collect();
                    511:                flushi();
                    512:                return(pushi((filep)contab[j].x.mx));
                    513:        } else if (b)
                    514:                return((*contab[j].x.f)(0));
                    515:        else
                    516:                return(0);
                    517: }
                    518: 
                    519: 
                    520: getrq()
                    521: {
                    522:        register i, j;
                    523: 
                    524:        if (((i = getach()) == 0) || ((j = getach()) == 0))
                    525:                goto rtn;
                    526:        i = PAIR(i, j);
                    527: rtn:
                    528:        return(i);
                    529: }
                    530: 
                    531: 
                    532: tchar getch()
                    533: {
                    534:        register int    k;
                    535:        tchar i, j;
                    536:        tchar setht(), setslant();
                    537: 
                    538:        level++;
                    539: g0:
                    540:        if (ch) {
                    541:                if (cbits(i = ch) == '\n')
                    542:                        nlflg++;
                    543:                ch = 0;
                    544:                level--;
                    545:                return(i);
                    546:        }
                    547: 
                    548:        if (nlflg) {
                    549:                level--;
                    550:                return('\n');
                    551:        }
                    552: 
                    553:        if ((k = cbits(i = getch0())) != ESC) {
                    554:                if (ismot(i))
                    555:                        goto g2;
                    556:                if (k == FLSS) {
                    557:                        copyf++; 
                    558:                        raw++;
                    559:                        i = getch0();
                    560:                        if (!fi)
                    561:                                flss = i;
                    562:                        copyf--; 
                    563:                        raw--;
                    564:                        goto g0;
                    565:                }
                    566:                if (k == RPT) {
                    567:                        setrpt();
                    568:                        goto g0;
                    569:                }
                    570:                if (!copyf) {
                    571:                        if (k == 'f' && lg && !lgf) {
                    572:                                i = getlg(i);
                    573:                                goto g2;
                    574:                        }
                    575:                        if (k == fc || k == tabch || k == ldrch) {
                    576:                                if ((i = setfield(k)) == 0)
                    577:                                        goto g0; 
                    578:                                else 
                    579:                                        goto g2;
                    580:                        }
                    581:                        if (k == '\b') {
                    582:                                i = makem(-width(' ' | chbits));
                    583:                                goto g2;
                    584:                        }
                    585:                }
                    586:                goto g2;
                    587:        }
                    588:        k = cbits(j = getch0());
                    589:        if (ismot(j)) {
                    590:                i = j;
                    591:                goto g2;
                    592:        }
                    593:        switch (k) {
                    594: 
                    595:        case '\n':      /* concealed newline */
                    596:                goto g0;
                    597:        case 'n':       /* number register */
                    598:                setn();
                    599:                goto g0;
                    600:        case '*':       /* string indicator */
                    601:                setstr();
                    602:                goto g0;
                    603:        case '$':       /* argument indicator */
                    604:                seta();
                    605:                goto g0;
                    606:        case '{':       /* LEFT */
                    607:                i = LEFT;
                    608:                goto gx;
                    609:        case '}':       /* RIGHT */
                    610:                i = RIGHT;
                    611:                goto gx;
                    612:        case '"':       /* comment */
                    613:                while (cbits(i = getch0()) != '\n')
                    614:                        ;
                    615:                goto g2;
                    616:        case ESC:       /* double backslash */
                    617:                i = eschar;
                    618:                goto gx;
                    619:        case 'e':       /* printable version of current eschar */
                    620:                i = PRESC;
                    621:                goto gx;
                    622:        case ' ':       /* unpaddable space */
                    623:                i = UNPAD;
                    624:                goto gx;
                    625:        case '|':       /* narrow space */
                    626:                i = NARSP;
                    627:                goto gx;
                    628:        case '^':       /* half of narrow space */
                    629:                i = HNARSP;
                    630:                goto gx;
                    631:        case '\'':      /* \(aa */
                    632:                i = ACUTE;
                    633:                goto gx;
                    634:        case '`':       /* \(ga */
                    635:                i = GRAVE;
                    636:                goto gx;
                    637:        case '_':       /* \(ul */
                    638:                i = UNDERLINE;
                    639:                goto gx;
                    640:        case '-':       /* current font minus */
                    641:                i = MINUS;
                    642:                goto gx;
                    643:        case '&':       /* filler */
                    644:                i = FILLER;
                    645:                goto gx;
                    646:        case 'c':       /* to be continued */
                    647:                i = CONT;
                    648:                goto gx;
                    649:        case '!':       /* transparent indicator */
                    650:                i = XPAR;
                    651:                goto gx;
                    652:        case 't':       /* tab */
                    653:                i = '\t';
                    654:                goto g2;
                    655:        case 'a':       /* leader (SOH) */
                    656:                i = LEADER;
                    657:                goto g2;
                    658:        case '%':       /* ohc */
                    659:                i = OHC;
                    660:                goto g2;
                    661:        case 'g':       /* return format of a number register */
                    662:                setaf();
                    663:                goto g0;
                    664:        case '.':       /* . */
                    665:                i = '.';
                    666: gx:
                    667:                setsfbits(i, sfbits(j));
                    668:                goto g2;
                    669:        }
                    670:        if (!copyf)
                    671:                switch (k) {
                    672: 
                    673:                case 'p':       /* spread */
                    674:                        spread++;
                    675:                        goto g0;
                    676:                case '(':       /* special char name */
                    677:                        if ((i = setch()) == 0)
                    678:                                goto g0;
                    679:                        break;
                    680:                case 's':       /* size indicator */
                    681:                        setps();
                    682:                        goto g0;
                    683:                case 'H':       /* character height */
                    684:                        i = setht();
                    685:                        break;
                    686:                case 'S':       /* slant */
                    687:                        i = setslant();
                    688:                        break;
                    689:                case 'f':       /* font indicator */
                    690:                        setfont(0);
                    691:                        goto g0;
                    692:                case 'w':       /* width function */
                    693:                        setwd();
                    694:                        goto g0;
                    695:                case 'v':       /* vert mot */
                    696:                        if (i = vmot())
                    697:                                break;
                    698:                        goto g0;
                    699:                case 'h':       /* horiz mot */
                    700:                        if (i = hmot())
                    701:                                break;
                    702:                        goto g0;
                    703:                case 'z':       /* zero with char */
                    704:                        i = setz();
                    705:                        break;
                    706:                case 'l':       /* hor line */
                    707:                        setline();
                    708:                        goto g0;
                    709:                case 'L':       /* vert line */
                    710:                        setvline();
                    711:                        goto g0;
                    712:                case 'D':       /* drawing function */
                    713:                        setdraw();
                    714:                        goto g0;
                    715:                case 'b':       /* bracket */
                    716:                        setbra();
                    717:                        goto g0;
                    718:                case 'o':       /* overstrike */
                    719:                        setov();
                    720:                        goto g0;
                    721:                case 'k':       /* mark hor place */
                    722:                        if ((k = findr(getsn())) != -1) {
                    723:                                vlist[k] = v.hp = sumhp();
                    724:                        }
                    725:                        goto g0;
                    726:                case '0':       /* number space */
                    727:                        i = makem(width('0' | chbits));
                    728:                        break;
                    729:                case 'x':       /* extra line space */
                    730:                        if (i = xlss())
                    731:                                break;
                    732:                        goto g0;
                    733:                case 'u':       /* half em up */
                    734:                case 'r':       /* full em up */
                    735:                case 'd':       /* half em down */
                    736:                        i = sethl(k);
                    737:                        break;
                    738:                default:
                    739:                        i = j;
                    740:                }
                    741:        else {
                    742:                ch0 = j;
                    743:                i = eschar;
                    744:        }
                    745: g2:
                    746:        if (cbits(i) == '\n') {
                    747:                nlflg++;
                    748:                v.hp = 0;
                    749:                pinchar = inchar;       /* XXX */
                    750:                if (ip == 0)
                    751:                        v.cd++; /* current input line number in this file */
                    752:        }
                    753:        if (!--level) {
                    754:                if (pinchar >= inchar + LNSIZE) {       /* XXX */
                    755:                        inchar[0] = makem(sumhp());
                    756:                        pinchar = &inchar[1];
                    757:                }
                    758:                *pinchar++ = i; /* XXX */
                    759:        }
                    760:        return(i);
                    761: }
                    762: 
                    763: 
                    764: char   ifilt[32] = {
                    765:        0, 001, 002, 003, 0, 005, 006, 007, 010, 011, 012};
                    766: 
                    767: 
                    768: sumhp()        /* XXX - add up values in inchar */
                    769: {
                    770:        register int n;
                    771:        register tchar *p;
                    772: 
                    773:        n = 0;
                    774:        for (p = inchar; p < pinchar; p++)
                    775:                n += width(*p);
                    776:        return(n);
                    777: }
                    778: 
                    779: 
                    780: tchar getch0()
                    781: {
                    782:        register int    j;
                    783:        tchar i;
                    784: 
                    785:        if (ch0) {
                    786:                i = ch0; 
                    787:                ch0 = 0; 
                    788:                return(i);
                    789:        }
                    790:        if (nchar) {
                    791:                nchar--; 
                    792:                return(rchar);
                    793:        }
                    794: 
                    795: again:
                    796:        if (cp) {
                    797:                if ((i = *cp++) == 0) {
                    798:                        cp = 0;
                    799:                        goto again;
                    800:                }
                    801:        } else if (ap) {
                    802:                if ((i = *ap++) == 0) {
                    803:                        ap = 0;
                    804:                        goto again;
                    805:                }
                    806:        } else if (ip) {
                    807:                if (ip == -1)
                    808:                        i = rdtty();
                    809:                else 
                    810:                        i = rbf();
                    811:        } else {
                    812:                if (donef)
                    813:                        done(0);
                    814:                if (nx || ibufp >= eibuf) {
                    815:                        if (nfo)
                    816:                                goto g1;
                    817: g0:
                    818:                        if (nextfile()) {
                    819:                                if (ip)
                    820:                                        goto again;
                    821:                                if (ibufp < eibuf)
                    822:                                        goto g2;
                    823:                        }
                    824: g1:
                    825:                        nx = 0;
                    826:                        if ((j = read(ifile, ibuf, IBUFSZ)) <= 0)
                    827:                                goto g0;
                    828:                        ibufp = ibuf;
                    829:                        eibuf = ibuf + j;
                    830:                        if (ip)
                    831:                                goto again;
                    832:                }
                    833: g2:
                    834:                i = *ibufp++ & 0177;
                    835:                ioff++;
                    836:                if (i >= 040)
                    837:                        goto g4; 
                    838:                else 
                    839:                        i = ifilt[i];
                    840:        }
                    841:        if (raw)
                    842:                return(i);
                    843:        if ((j = cbits(i)) == IMP)
                    844:                goto again;
                    845:        if ((i == 0) && !init)
                    846:                goto again;
                    847: g4:
                    848:        if (copyf == 0 && (i & ~BMASK) == 0 && !iscontrol(cbits(i)))
                    849:                i |= chbits;
                    850:        if (cbits(i) == eschar)
                    851:                setcbits(i, ESC);
                    852:        return(i);
                    853: }
                    854: 
                    855: 
                    856: nextfile()
                    857: {
                    858:        register char   *p;
                    859: 
                    860: n0:
                    861:        if (ifile)
                    862:                close(ifile);
                    863:        if (nx) {
                    864:                p = nextf;
                    865:                if (*p != 0)
                    866:                        goto n1;
                    867:        }
                    868:        if (ifi > 0) {
                    869:                if (popf())
                    870:                        goto n0; /* popf error */
                    871:                return(1); /* popf ok */
                    872:        }
                    873:        if (rargc-- <= 0) {
                    874:                goto n2;
                    875:        }
                    876:        p = (argp++)[0];
                    877: n1:
                    878:        if ((p[0] == '-') && (p[1] == 0)) {
                    879:                ifile = 0;
                    880:        } else if ((ifile = open(p, 0)) < 0) {
                    881:                fprintf(stderr, "troff: cannot open %s\n", p);
                    882:                nfo -= mflg;
                    883:                done(02);
                    884:        }
                    885:        nfo++;
                    886:        v.cd = 0;
                    887:        ioff = 0;
                    888:        return(0);
                    889: n2:
                    890:        if ((nfo -= mflg) && !stdi)
                    891:                done(0);
                    892:        nfo++;
                    893:        v.cd = ifile = stdi = mflg = 0;
                    894:        ioff = 0;
                    895:        return(0);
                    896: }
                    897: 
                    898: 
                    899: popf()
                    900: {
                    901:        register i;
                    902:        register char   *p, *q;
                    903:        extern char     *ttyname();
                    904: 
                    905:        ioff = offl[--ifi];
                    906:        ip = ipl[ifi];
                    907:        if ((ifile = ifl[ifi]) == 0) {
                    908:                p = xbuf;
                    909:                q = ibuf;
                    910:                ibufp = xbufp;
                    911:                eibuf = xeibuf;
                    912:                while (q < eibuf)
                    913:                        *q++ = *p++;
                    914:                return(0);
                    915:        }
                    916:        if ((lseek(ifile, (long)(ioff & ~(IBUFSZ - 1)), 0) < 0) || ((i = read(ifile, ibuf, IBUFSZ)) < 0))
                    917:                return(1);
                    918:        eibuf = ibuf + i;
                    919:        ibufp = ibuf;
                    920:        if (ttyname(ifile) == 0)
                    921:                if ((ibufp = ibuf + (int)(ioff & (IBUFSZ - 1))) >= eibuf)
                    922:                        return(1);
                    923:        return(0);
                    924: }
                    925: 
                    926: 
                    927: flushi()
                    928: {
                    929:        if (nflush)
                    930:                return;
                    931:        ch = 0;
                    932:        if (cbits(ch0) == '\n')
                    933:                nlflg++;
                    934:        ch0 = 0;
                    935:        copyf++;
                    936:        while (!nlflg) {
                    937:                if (donef && (frame == stk))
                    938:                        break;
                    939:                getch();
                    940:        }
                    941:        copyf--;
                    942:        v.hp = 0;
                    943:        pinchar = inchar;       /* XXX */
                    944: }
                    945: 
                    946: 
                    947: getach()
                    948: {
                    949:        tchar i;
                    950:        register j;
                    951: 
                    952:        lgf++;
                    953:        j = cbits(i = getch());
                    954:        if (ismot(i) || j == ' ' || j == '\n' || j & 0200) {
                    955:                ch = i;
                    956:                j = 0;
                    957:        }
                    958:        lgf--;
                    959:        return(j & 0177);
                    960: }
                    961: 
                    962: 
                    963: casenx()
                    964: {
                    965:        lgf++;
                    966:        skip();
                    967:        getname();
                    968:        nx++;
                    969:        nextfile();
                    970:        nlflg++;
                    971:        ip = 0;
                    972:        ap = 0;
                    973:        nchar = pendt = 0;
                    974:        frame = stk;
                    975:        nxf = frame + 1;
                    976: }
                    977: 
                    978: 
                    979: getname()
                    980: {
                    981:        register int    j, k;
                    982:        tchar i;
                    983: 
                    984:        lgf++;
                    985:        for (k = 0; k < (NS - 1); k++) {
                    986:                if (((j = cbits(i = getch())) <= ' ') || (j > 0176))
                    987:                        break;
                    988:                nextf[k] = j;
                    989:        }
                    990:        nextf[k] = 0;
                    991:        ch = i;
                    992:        lgf--;
                    993:        return(nextf[0]);
                    994: }
                    995: 
                    996: 
                    997: caseso()
                    998: {
                    999:        register i;
                   1000:        register char   *p, *q;
                   1001: 
                   1002:        lgf++;
                   1003:        nextf[0] = 0;
                   1004:        if (skip() || !getname() || ((i = open(nextf, 0)) < 0) || (ifi >= NSO)) {
                   1005:                fprintf(stderr, "troff: can't open file %s\n", nextf);
                   1006:                done(02);
                   1007:        }
                   1008:        flushi();
                   1009:        ifl[ifi] = ifile;
                   1010:        ifile = i;
                   1011:        offl[ifi] = ioff;
                   1012:        ioff = 0;
                   1013:        ipl[ifi] = ip;
                   1014:        ip = 0;
                   1015:        nx++;
                   1016:        nflush++;
                   1017:        if (!ifl[ifi++]) {
                   1018:                p = ibuf;
                   1019:                q = xbuf;
                   1020:                xbufp = ibufp;
                   1021:                xeibuf = eibuf;
                   1022:                while (p < eibuf)
                   1023:                        *q++ = *p++;
                   1024:        }
                   1025: }
                   1026: 
                   1027: 
                   1028: casecf()
                   1029: {      /* copy file without change */
                   1030: #ifndef NROFF
                   1031:        int     fd, n;
                   1032:        char    buf[512];
                   1033:        extern int      un, hpos, esc, po;
                   1034: 
                   1035:        nextf[0] = 0;
                   1036:        if (skip() || !getname() || (fd = open(nextf, 0)) < 0) {
                   1037:                fprintf(stderr, "troff: can't open file %s\n", nextf);
                   1038:                done(02);
                   1039:        }
                   1040:        tbreak();
                   1041:        /* make it into a clean state, be sure that everything is out */
                   1042:        hpos = po;
                   1043:        esc = un;
                   1044:        ptesc();
                   1045:        ptlead();
                   1046:        ptps();
                   1047:        ptfont();
                   1048:        flusho();
                   1049:        while ((n = read(fd, buf, 512)) > 0)
                   1050:                write(ptid, buf, n);
                   1051:        close(fd);
                   1052: #endif
                   1053: }
                   1054: 
                   1055: 
                   1056: casesy()
                   1057: {      /* call system */
                   1058:        char    sybuf[NTM];
                   1059:        int     i;
                   1060: 
                   1061:        lgf++;
                   1062:        copyf++;
                   1063:        skip();
                   1064:        for (i = 0; i < NTM - 2; i++)
                   1065:                if ((sybuf[i] = getch()) == '\n')
                   1066:                        break;
                   1067:        sybuf[i] = 0;
                   1068:        system(sybuf);
                   1069:        copyf--;
                   1070: }
                   1071: 
                   1072: 
                   1073: getpn(a)
                   1074:        register char *a;
                   1075: {
                   1076:        register int n, neg;
                   1077: 
                   1078:        if (*a == 0)
                   1079:                return;
                   1080:        neg = 0;
                   1081:        for ( ; *a; a++)
                   1082:                switch (*a) {
                   1083:                case '+':
                   1084:                case ',':
                   1085:                        continue;
                   1086:                case '-':
                   1087:                        neg = 1;
                   1088:                        continue;
                   1089:                default:
                   1090:                        n = 0;
                   1091:                        if (isdigit(*a)) {
                   1092:                                do
                   1093:                                        n = 10 * n + *a++ - '0';
                   1094:                                while (isdigit(*a));
                   1095:                                a--;
                   1096:                        } else
                   1097:                                n = 9999;
                   1098:                        *pnp++ = neg ? -n : n;
                   1099:                        neg = 0;
                   1100:                        if (pnp >= &pnlist[NPN-2]) {
                   1101:                                fprintf(stderr, "troff: too many page numbers\n");
                   1102:                                done3(-3);
                   1103:                        }
                   1104:                }
                   1105:        if (neg)
                   1106:                *pnp++ = -9999;
                   1107:        *pnp = -32767;
                   1108:        print = 0;
                   1109:        pnp = pnlist;
                   1110:        if (*pnp != -32767)
                   1111:                chkpn();
                   1112: }
                   1113: 
                   1114: 
                   1115: setrpt()
                   1116: {
                   1117:        tchar i, j;
                   1118: 
                   1119:        copyf++;
                   1120:        raw++;
                   1121:        i = getch0();
                   1122:        copyf--;
                   1123:        raw--;
                   1124:        if (i < 0 || cbits(j = getch0()) == RPT)
                   1125:                return;
                   1126:        rchar = j;
                   1127:        nchar = i & BMASK;
                   1128: }

unix.superglobalmegacorp.com

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