Annotation of researchv8dc/cmd/troff/n3.c, revision 1.1.1.1

1.1       root        1: /*     @(#)roff:n3.c   2.7     */
                      2: /*
                      3:  * troff3.c
                      4:  * 
                      5:  * macro and string routines, storage allocation
                      6:  */
                      7: 
                      8: 
                      9: #include "tdef.h"
                     10: #ifdef NROFF
                     11: #include "tw.h"
                     12: #endif
                     13: #include <sgtty.h>
                     14: #include "ext.h"
                     15: 
                     16: #define        MHASH(x)        ((x>>6)^x)&0177
                     17: struct contab *mhash[128];     /* 128 == the 0177 on line above */
                     18: #define        blisti(i)       (((i)-ENV_BLK*BLK) / BLK)
                     19: filep  blist[NBLIST];
                     20: tchar  *argtop;
                     21: int    pagech = '%';
                     22: int    strflg;
                     23: 
                     24: #ifdef INCORE
                     25:        tchar *wbuf;
                     26:        tchar corebuf[(ENV_BLK + NBLIST + 1) * BLK];
                     27: #else
                     28:        tchar wbuf[BLK];
                     29:        tchar rbuf[BLK];
                     30: #endif
                     31: 
                     32: caseig()
                     33: {
                     34:        register i;
                     35: 
                     36:        offset = 0;
                     37:        if ((i = copyb()) != '.')
                     38:                control(i, 1);
                     39: }
                     40: 
                     41: 
                     42: casern()
                     43: {
                     44:        register i, j;
                     45: 
                     46:        lgf++;
                     47:        skip();
                     48:        if ((i = getrq()) == 0 || (oldmn = findmn(i)) < 0)
                     49:                return;
                     50:        skip();
                     51:        clrmn(findmn(j = getrq()));
                     52:        if (j) {
                     53:                munhash(&contab[oldmn]);
                     54:                contab[oldmn].rq = j;
                     55:                maddhash(&contab[oldmn]);
                     56:        }
                     57: }
                     58: 
                     59: maddhash(rp)
                     60: register struct contab *rp;
                     61: {
                     62:        register struct contab **hp;
                     63: 
                     64:        if (rp->rq == 0)
                     65:                return;
                     66:        hp = &mhash[MHASH(rp->rq)];
                     67:        rp->link = *hp;
                     68:        *hp = rp;
                     69: }
                     70: 
                     71: munhash(mp)
                     72: register struct contab *mp;
                     73: {      
                     74:        register struct contab *p;
                     75:        register struct contab **lp;
                     76: 
                     77:        if (mp->rq == 0)
                     78:                return;
                     79:        lp = &mhash[MHASH(mp->rq)];
                     80:        p = *lp;
                     81:        while (p) {
                     82:                if (p == mp) {
                     83:                        *lp = p->link;
                     84:                        p->link = 0;
                     85:                        return;
                     86:                }
                     87:                lp = &p->link;
                     88:                p = p->link;
                     89:        }
                     90: }
                     91: 
                     92: mrehash()
                     93: {
                     94:        register struct contab *p;
                     95:        register i;
                     96: 
                     97:        for (i=0; i<128; i++)
                     98:                mhash[i] = 0;
                     99:        for (p=contab; p < &contab[NM]; p++)
                    100:                p->link = 0;
                    101:        for (p=contab; p < &contab[NM]; p++) {
                    102:                if (p->rq == 0)
                    103:                        continue;
                    104:                i = MHASH(p->rq);
                    105:                p->link = mhash[i];
                    106:                mhash[i] = p;
                    107:        }
                    108: }
                    109: 
                    110: caserm()
                    111: {
                    112:        int j;
                    113: 
                    114:        lgf++;
                    115:        while (!skip() && (j = getrq()) != 0)
                    116:                clrmn(findmn(j));
                    117:        lgf--;
                    118: }
                    119: 
                    120: 
                    121: caseas()
                    122: {
                    123:        app++;
                    124:        caseds();
                    125: }
                    126: 
                    127: 
                    128: caseds()
                    129: {
                    130:        ds++;
                    131:        casede();
                    132: }
                    133: 
                    134: 
                    135: caseam()
                    136: {
                    137:        app++;
                    138:        casede();
                    139: }
                    140: 
                    141: 
                    142: casede()
                    143: {
                    144:        register i, req;
                    145:        register filep savoff;
                    146:        extern filep finds();
                    147: 
                    148:        if (dip != d)
                    149:                wbfl();
                    150:        req = '.';
                    151:        lgf++;
                    152:        skip();
                    153:        if ((i = getrq()) == 0)
                    154:                goto de1;
                    155:        if ((offset = finds(i)) == 0)
                    156:                goto de1;
                    157:        if (ds)
                    158:                copys();
                    159:        else 
                    160:                req = copyb();
                    161:        wbfl();
                    162:        clrmn(oldmn);
                    163:        if (newmn) {
                    164:                if (contab[newmn].rq)
                    165:                        munhash(&contab[newmn]);
                    166:                contab[newmn].rq = i;
                    167:                maddhash(&contab[newmn]);
                    168:        }
                    169:        if (apptr) {
                    170:                savoff = offset;
                    171:                offset = apptr;
                    172:                wbt((tchar) IMP);
                    173:                offset = savoff;
                    174:        }
                    175:        offset = dip->op;
                    176:        if (req != '.')
                    177:                control(req, 1);
                    178: de1:
                    179:        ds = app = 0;
                    180:        return;
                    181: }
                    182: 
                    183: 
                    184: findmn(i)
                    185: register int   i;
                    186: {
                    187:        register struct contab *p;
                    188: 
                    189:        for (p = mhash[MHASH(i)]; p; p = p->link)
                    190:                if (i == p->rq)
                    191:                        return(p - contab);
                    192:        return(-1);
                    193: }
                    194: 
                    195: 
                    196: clrmn(i)
                    197: register int   i;
                    198: {
                    199:        if (i >= 0) {
                    200:                if (contab[i].mx)
                    201:                        ffree((filep)contab[i].mx);
                    202:                munhash(&contab[i]);
                    203:                contab[i].rq = 0;
                    204:                contab[i].mx = 0;
                    205:                contab[i].f = 0;
                    206:        }
                    207: }
                    208: 
                    209: 
                    210: filep finds(mn)
                    211: register int   mn;
                    212: {
                    213:        register i;
                    214:        register filep savip;
                    215:        extern filep alloc();
                    216:        extern filep incoff();
                    217: 
                    218:        oldmn = findmn(mn);
                    219:        newmn = 0;
                    220:        apptr = (filep)0;
                    221:        if (app && oldmn >= 0 && contab[oldmn].mx) {
                    222:                savip = ip;
                    223:                ip = (filep)contab[oldmn].mx;
                    224:                oldmn = -1;
                    225:                while ((i = rbf()) != 0)
                    226:                        ;
                    227:                apptr = ip;
                    228:                if (!diflg)
                    229:                        ip = incoff(ip);
                    230:                nextb = ip;
                    231:                ip = savip;
                    232:        } else {
                    233:                for (i = 0; i < NM; i++) {
                    234:                        if (contab[i].rq == 0)
                    235:                                break;
                    236:                }
                    237:                if (i == NM || (nextb = alloc()) == 0) {
                    238:                        app = 0;
                    239:                        if (macerr++ > 1)
                    240:                                done2(02);
                    241:                        errprint("Too many (%d) string/macro names", NM);
                    242:                        edone(04);
                    243:                        return(offset = 0);
                    244:                }
                    245:                contab[i].mx = (unsigned) nextb;
                    246:                if (!diflg) {
                    247:                        newmn = i;
                    248:                        if (oldmn == -1)
                    249:                                contab[i].rq = -1;
                    250:                } else {
                    251:                        contab[i].rq = mn;
                    252:                        maddhash(&contab[i]);
                    253:                }
                    254:        }
                    255:        app = 0;
                    256:        return(offset = nextb);
                    257: }
                    258: 
                    259: 
                    260: skip()
                    261: {
                    262:        register tchar i;
                    263: 
                    264:        while (cbits(i = getch()) == ' ')
                    265:                ;
                    266:        ch = i;
                    267:        return(nlflg);
                    268: }
                    269: 
                    270: 
                    271: copyb()
                    272: {
                    273:        register i, j, state;
                    274:        register tchar ii;
                    275:        int     req, k;
                    276:        filep savoff;
                    277: 
                    278:        if (skip() || !(j = getrq()))
                    279:                j = '.';
                    280:        req = j;
                    281:        k = j >> BYTE;
                    282:        j &= BYTEMASK;
                    283:        copyf++;
                    284:        flushi();
                    285:        nlflg = 0;
                    286:        state = 1;
                    287:        while (1) {
                    288:                i = cbits(ii = getch());
                    289:                if (state == 3) {
                    290:                        if (i == k)
                    291:                                break;
                    292:                        if (!k) {
                    293:                                ch = ii;
                    294:                                i = getach();
                    295:                                ch = ii;
                    296:                                if (!i)
                    297:                                        break;
                    298:                        }
                    299:                        state = 0;
                    300:                        goto c0;
                    301:                }
                    302:                if (i == '\n') {
                    303:                        state = 1;
                    304:                        nlflg = 0;
                    305:                        goto c0;
                    306:                }
                    307:                if (state == 1 && i == '.') {
                    308:                        state++;
                    309:                        savoff = offset;
                    310:                        goto c0;
                    311:                }
                    312:                if ((state == 2) && (i == j)) {
                    313:                        state++;
                    314:                        goto c0;
                    315:                }
                    316:                state = 0;
                    317: c0:
                    318:                if (offset)
                    319:                        wbf(ii);
                    320:        }
                    321:        if (offset) {
                    322:                wbfl();
                    323:                offset = savoff;
                    324:                wbt((tchar)0);
                    325:        }
                    326:        copyf--;
                    327:        return(req);
                    328: }
                    329: 
                    330: 
                    331: copys()
                    332: {
                    333:        register tchar i;
                    334: 
                    335:        copyf++;
                    336:        if (skip())
                    337:                goto c0;
                    338:        if (cbits(i = getch()) != '"')
                    339:                wbf(i);
                    340:        while (cbits(i = getch()) != '\n')
                    341:                wbf(i);
                    342: c0:
                    343:        wbt((tchar)0);
                    344:        copyf--;
                    345: }
                    346: 
                    347: 
                    348: filep alloc()
                    349: {
                    350:        register i;
                    351:        register filep j;
                    352: 
                    353:        for (i = 0; i < NBLIST; i++) {
                    354:                if (blist[i] == 0)
                    355:                        break;
                    356:        }
                    357:        if (i == NBLIST) {
                    358:                j = 0;
                    359:        } else {
                    360:                blist[i] = -1;
                    361:                j = (filep)i * BLK + ENV_BLK * BLK;
                    362:        }
                    363:        return(nextb = j);
                    364: }
                    365: 
                    366: 
                    367: ffree(i)
                    368: filep i;
                    369: {
                    370:        register j;
                    371: 
                    372:        while (blist[j = blisti(i)] != (unsigned) ~0) {
                    373:                i = (filep) blist[j];
                    374:                blist[j] = 0;
                    375:        }
                    376:        blist[j] = 0;
                    377: }
                    378: 
                    379: wbt(i)
                    380: tchar i;
                    381: {
                    382:        wbf(i);
                    383:        wbfl();
                    384: }
                    385: 
                    386: 
                    387: wbf(i)
                    388: register tchar i;
                    389: {
                    390:        register j;
                    391: 
                    392:        if (!offset)
                    393:                return;
                    394:        if (!woff) {
                    395:                woff = offset;
                    396: #ifdef INCORE
                    397:                wbuf = &corebuf[woff];  /* INCORE only */
                    398: #endif
                    399:                wbfi = 0;
                    400:        }
                    401:        wbuf[wbfi++] = i;
                    402:        if (!((++offset) & (BLK - 1))) {
                    403:                wbfl();
                    404:                j = blisti(--offset);
                    405:                if (j < 0 || j >= NBLIST) {
                    406:                        errprint("Out of temp file space");
                    407:                        done2(01);
                    408:                }
                    409:                if (blist[j] == (unsigned) ~0) {
                    410:                        if (alloc() == 0) {
                    411:                                errprint("Out of temp file space");
                    412:                                done2(01);
                    413:                        }
                    414:                        blist[j] = (unsigned)(nextb);
                    415:                }
                    416:                offset = ((filep)blist[j]);
                    417:        }
                    418:        if (wbfi >= BLK)
                    419:                wbfl();
                    420: }
                    421: 
                    422: 
                    423: wbfl()
                    424: {
                    425:        if (woff == 0)
                    426:                return;
                    427: #ifndef INCORE
                    428:        lseek(ibf, ((long)woff) * sizeof(tchar), 0);
                    429:        write(ibf, (char *)wbuf, wbfi * sizeof(tchar));
                    430: #endif
                    431:        if ((woff & (~(BLK - 1))) == (roff & (~(BLK - 1))))
                    432:                roff = -1;
                    433:        woff = 0;
                    434: }
                    435: 
                    436: 
                    437: tchar rbf()
                    438: {
                    439:        register tchar i;
                    440:        register filep j, p;
                    441:        extern filep incoff();
                    442: 
                    443:        if (ip == NBLIST*BLK) {         /* for rdtty */
                    444:                if (j = rdtty())
                    445:                        return(j);
                    446:                else
                    447:                        return(popi());
                    448:        }
                    449:        /* this is an inline expansion of rbf0: dirty! */
                    450: #ifndef INCORE
                    451:        j = ip & ~(BLK - 1);
                    452:        if (j != roff) {
                    453:                roff = j;
                    454:                lseek(ibf, (long)j * sizeof(tchar), 0);
                    455:                if (read(ibf, (char *)rbuf, BLK * sizeof(tchar)) <= 0)
                    456:                        i = 0;
                    457:                else
                    458:                        i = rbuf[ip & (BLK-1)];
                    459:        } else
                    460:                i = rbuf[ip & (BLK-1)];
                    461: #else
                    462:        i = corebuf[ip];
                    463: #endif
                    464:        /* end of rbf0 */
                    465:        if (i == 0) {
                    466:                if (!app)
                    467:                        i = popi();
                    468:                return(i);
                    469:        }
                    470:        /* this is an inline expansion of incoff: also dirty */
                    471:        p = ++ip;
                    472:        if ((p & (BLK - 1)) == 0) {
                    473:                if ((ip = blist[blisti(p-1)]) == (unsigned) ~0) {
                    474:                        ip = 0;
                    475:                        errprint("Bad storage allocation");
                    476:                        done2(-5);
                    477:                }
                    478:                /* this was meant to protect against people removing
                    479:                /* the macro they were standing on, but it's too
                    480:                /* sensitive to block boundaries.
                    481:                /* if (ip == 0) {
                    482:                /*      errprint("Block removed while in use");
                    483:                /*      done2(-6);
                    484:                /* }
                    485:                */
                    486:        }
                    487:        return(i);
                    488: }
                    489: 
                    490: 
                    491: tchar rbf0(p)
                    492: register filep p;
                    493: {
                    494: #ifndef INCORE
                    495:        register filep i;
                    496: 
                    497:        if ((i = p & ~(BLK - 1)) != roff) {
                    498:                roff = i;
                    499:                lseek(ibf, (long)roff * sizeof(tchar), 0);
                    500:                if (read(ibf, (char *)rbuf, BLK * sizeof(tchar)) == 0)
                    501:                        return(0);
                    502:        }
                    503:        return(rbuf[p & (BLK-1)]);
                    504: #else
                    505:        return(corebuf[p]);
                    506: #endif
                    507: }
                    508: 
                    509: 
                    510: filep incoff(p)
                    511: register filep p;
                    512: {
                    513:        p++;
                    514:        if ((p & (BLK - 1)) == 0) {
                    515:                if ((p = blist[blisti(p-1)]) == (unsigned) ~0) {
                    516:                        errprint("Bad storage allocation");
                    517:                        done2(-5);
                    518:                }
                    519:        }
                    520:        return(p);
                    521: }
                    522: 
                    523: 
                    524: tchar popi()
                    525: {
                    526:        register struct s *p;
                    527: 
                    528:        if (frame == stk)
                    529:                return(0);
                    530:        if (strflg)
                    531:                strflg--;
                    532:        p = nxf = frame;
                    533:        p->nargs = 0;
                    534:        frame = p->pframe;
                    535:        ip = p->pip;
                    536:        pendt = p->ppendt;
                    537:        lastpbp = p->lastpbp;
                    538:        return(p->pch);
                    539: }
                    540: 
                    541: /*
                    542:  *     test that the end of the allocation is above a certain location
                    543:  *     in memory
                    544:  */
                    545: #define SPACETEST(base, size) while ((enda - (size)) <= (char *)(base)){setbrk(DELTA);}
                    546: 
                    547: pushi(newip, mname)
                    548: filep newip;
                    549: int mname;
                    550: {
                    551:        register struct s *p;
                    552:        extern char *setbrk();
                    553: 
                    554:        SPACETEST(nxf, sizeof(struct s));
                    555:        p = nxf;
                    556:        p->pframe = frame;
                    557:        p->pip = ip;
                    558:        p->ppendt = pendt;
                    559:        p->pch = ch;
                    560:        p->lastpbp = lastpbp;
                    561:        p->mname = mname;
                    562:        lastpbp = pbp;
                    563:        pendt = ch = 0;
                    564:        frame = nxf;
                    565:        if (nxf->nargs == 0) 
                    566:                nxf += 1;
                    567:        else 
                    568:                nxf = (struct s *)argtop;
                    569:        return(ip = newip);
                    570: }
                    571: 
                    572: 
                    573: char   *setbrk(x)
                    574: int    x;
                    575: {
                    576:        register char   *i, *k;
                    577:        register j;
                    578:        char    *sbrk();
                    579: 
                    580:        if ((i = sbrk(x)) == (char *) -1) {
                    581:                errprint("Core limit reached");
                    582:                edone(0100);
                    583:        }
                    584:        if (j = (unsigned)i % sizeof(int)) {    /*check alignment for 3B*/
                    585:                j = sizeof(int) - j;            /*only init calls should need this*/
                    586:                if ((k = sbrk(j)) == (char *) -1) {
                    587:                        errprint("Core limit reached");
                    588:                        edone(0100);
                    589:                }
                    590:                if (k != i + x) {       /*there must have been an intervening sbrk*/
                    591:                        errprint ("internal error in setbrk: i=%x, j=%d, k=%x",
                    592:                                i, j, k);
                    593:                        edone(0100);
                    594:                }
                    595:                i += j;
                    596:        }
                    597:        enda = i + x;
                    598:        return(i);
                    599: }
                    600: 
                    601: 
                    602: getsn()
                    603: {
                    604:        register i;
                    605: 
                    606:        if ((i = getach()) == 0)
                    607:                return(0);
                    608:        if (i == '(')
                    609:                return(getrq());
                    610:        else 
                    611:                return(i);
                    612: }
                    613: 
                    614: 
                    615: setstr()
                    616: {
                    617:        register i, j;
                    618: 
                    619:        lgf++;
                    620:        if ((i = getsn()) == 0 || (j = findmn(i)) == -1 || !contab[j].mx) {
                    621:                lgf--;
                    622:                return(0);
                    623:        } else {
                    624:                SPACETEST(nxf, sizeof(struct s));
                    625:                nxf->nargs = 0;
                    626:                strflg++;
                    627:                lgf--;
                    628:                return pushi((filep)contab[j].mx, i);
                    629:        }
                    630: }
                    631: 
                    632: 
                    633: 
                    634: collect()
                    635: {
                    636:        register j;
                    637:        register tchar i;
                    638:        register tchar *strp;
                    639:        tchar * lim;
                    640:        tchar * *argpp, **argppend;
                    641:        int     quote;
                    642:        struct s *savnxf;
                    643: 
                    644:        copyf++;
                    645:        nxf->nargs = 0;
                    646:        savnxf = nxf;
                    647:        if (skip())
                    648:                goto rtn;
                    649: 
                    650:        {
                    651:                char *memp;
                    652:                memp = (char *)savnxf;
                    653:                /*
                    654:                 *      1 s structure for the macro descriptor
                    655:                 *      APERMAC tchar *'s for pointers into the strings
                    656:                 *      space for the tchar's themselves
                    657:                 */
                    658:                memp += sizeof(struct s);
                    659:                /*
                    660:                 *      CPERMAC (the total # of characters for ALL arguments)
                    661:                 *      to a macros, has been carefully chosen
                    662:                 *      so that the distance between stack frames is < DELTA 
                    663:                 */
                    664: #define        CPERMAC 200
                    665: #define        APERMAC 9
                    666:                memp += APERMAC * sizeof(tchar *);
                    667:                memp += CPERMAC * sizeof(tchar);
                    668:                nxf = (struct s*)memp;
                    669:        }
                    670:        lim = (tchar *)nxf;
                    671:        argpp = (tchar **)(savnxf + 1);
                    672:        argppend = &argpp[APERMAC];
                    673:        SPACETEST(argppend, sizeof(tchar *));
                    674:        strp = (tchar *)argppend;
                    675:        /*
                    676:         *      Zero out all the string pointers before filling them in.
                    677:         */
                    678:        for (j = 0; j < APERMAC; j++){
                    679:                argpp[j] = (tchar *)0;
                    680:        }
                    681: #if 0
                    682:        errprint("savnxf=0x%x,nxf=0x%x,argpp=0x%x,strp=argppend=0x%x,lim=0x%x,enda=0x%x",
                    683:                savnxf, nxf, argpp, strp, lim, enda);
                    684: #endif 0
                    685:        strflg = 0;
                    686:        while ((argpp != argppend) && (!skip())) {
                    687:                *argpp++ = strp;
                    688:                quote = 0;
                    689:                if (cbits(i = getch()) == '"')
                    690:                        quote++;
                    691:                else 
                    692:                        ch = i;
                    693:                while (1) {
                    694:                        i = getch();
                    695:                        if (nlflg || (!quote && cbits(i) == ' '))
                    696:                                break;
                    697:                        if (   quote
                    698:                            && (cbits(i) == '"')
                    699:                            && (cbits(i = getch()) != '"')) {
                    700:                                ch = i;
                    701:                                break;
                    702:                        }
                    703:                        *strp++ = i;
                    704:                        if (strflg && strp >= lim) {
                    705: #if 0
                    706:                                errprint("strp=0x%x, lim = 0x%x",
                    707:                                        strp, lim);
                    708: #endif 0
                    709:                                errprint("Macro argument too long");
                    710:                                copyf--;
                    711:                                edone(004);
                    712:                        }
                    713:                        SPACETEST(strp, 3 * sizeof(tchar));
                    714:                }
                    715:                *strp++ = 0;
                    716:        }
                    717:        nxf = savnxf;
                    718:        nxf->nargs = argpp - (tchar **)(savnxf + 1);
                    719:        argtop = strp;
                    720: rtn:
                    721:        copyf--;
                    722: }
                    723: 
                    724: 
                    725: seta()
                    726: {
                    727:        register i;
                    728: 
                    729:        i = cbits(getch()) - '0';
                    730:        if (i > 0 && i <= APERMAC && i <= frame->nargs)
                    731:                pushback(*(((tchar **)(frame + 1)) + i - 1));
                    732: }
                    733: 
                    734: 
                    735: caseda()
                    736: {
                    737:        app++;
                    738:        casedi();
                    739: }
                    740: 
                    741: 
                    742: casedi()
                    743: {
                    744:        register i, j;
                    745:        register *k;
                    746: 
                    747:        lgf++;
                    748:        if (skip() || (i = getrq()) == 0) {
                    749:                if (dip != d)
                    750:                        wbt((tchar)0);
                    751:                if (dilev > 0) {
                    752:                        numtab[DN].val = dip->dnl;
                    753:                        numtab[DL].val = dip->maxl;
                    754:                        dip = &d[--dilev];
                    755:                        offset = dip->op;
                    756:                }
                    757:                goto rtn;
                    758:        }
                    759:        if (++dilev == NDI) {
                    760:                --dilev;
                    761:                errprint("Diversions nested too deep");
                    762:                edone(02);
                    763:        }
                    764:        if (dip != d)
                    765:                wbt((tchar)0);
                    766:        diflg++;
                    767:        dip = &d[dilev];
                    768:        dip->op = finds(i);
                    769:        dip->curd = i;
                    770:        clrmn(oldmn);
                    771:        k = (int *) & dip->dnl;
                    772:        for (j = 0; j < 10; j++)
                    773:                k[j] = 0;       /*not op and curd*/
                    774: rtn:
                    775:        app = 0;
                    776:        diflg = 0;
                    777: }
                    778: 
                    779: 
                    780: casedt()
                    781: {
                    782:        lgf++;
                    783:        dip->dimac = dip->ditrap = dip->ditf = 0;
                    784:        skip();
                    785:        dip->ditrap = vnumb((int *)0);
                    786:        if (nonumb)
                    787:                return;
                    788:        skip();
                    789:        dip->dimac = getrq();
                    790: }
                    791: 
                    792: 
                    793: casetl()
                    794: {
                    795:        register j;
                    796:        int w[3];
                    797:        tchar buf[LNSIZE];
                    798:        register tchar *tp;
                    799:        tchar i, delim;
                    800: 
                    801:        dip->nls = 0;
                    802:        skip();
                    803:        if (ismot(delim = getch())) {
                    804:                ch = delim;
                    805:                delim = '\'';
                    806:        } else 
                    807:                delim = cbits(delim);
                    808:        tp = buf;
                    809:        numtab[HP].val = 0;
                    810:        w[0] = w[1] = w[2] = 0;
                    811:        j = 0;
                    812:        while (cbits(i = getch()) != '\n') {
                    813:                if (cbits(i) == cbits(delim)) {
                    814:                        if (j < 3)
                    815:                                w[j] = numtab[HP].val;
                    816:                        numtab[HP].val = 0;
                    817:                        j++;
                    818:                        *tp++ = 0;
                    819:                } else {
                    820:                        if (cbits(i) == pagech) {
                    821:                                setn1(numtab[PN].val, numtab[findr('%')].fmt,
                    822:                                      i&SFMASK);
                    823:                                continue;
                    824:                        }
                    825:                        numtab[HP].val += width(i);
                    826:                        if (tp < &buf[LNSIZE-10])
                    827:                                *tp++ = i;
                    828:                }
                    829:        }
                    830:        if (j<3)
                    831:                w[j] = numtab[HP].val;
                    832:        *tp++ = 0;
                    833:        *tp++ = 0;
                    834:        *tp++ = 0;
                    835:        tp = buf;
                    836: #ifdef NROFF
                    837:        horiz(po);
                    838: #endif
                    839:        while (i = *tp++)
                    840:                pchar(i);
                    841:        if (w[1] || w[2])
                    842:                horiz(j = quant((lt - w[1]) / 2 - w[0], HOR));
                    843:        while (i = *tp++)
                    844:                pchar(i);
                    845:        if (w[2]) {
                    846:                horiz(lt - w[0] - w[1] - w[2] - j);
                    847:                while (i = *tp++)
                    848:                        pchar(i);
                    849:        }
                    850:        newline(0);
                    851:        if (dip != d) {
                    852:                if (dip->dnl > dip->hnl)
                    853:                        dip->hnl = dip->dnl;
                    854:        } else {
                    855:                if (numtab[NL].val > dip->hnl)
                    856:                        dip->hnl = numtab[NL].val;
                    857:        }
                    858: }
                    859: 
                    860: 
                    861: casepc()
                    862: {
                    863:        pagech = chget(IMP);
                    864: }
                    865: 
                    866: 
                    867: casepm()
                    868: {
                    869:        register i, k;
                    870:        register char   *p;
                    871:        int     xx, cnt, tcnt, kk, tot;
                    872:        filep j;
                    873:        char    pmline[10];
                    874: 
                    875:        kk = cnt = tcnt = 0;
                    876:        tot = !skip();
                    877:        for (i = 0; i < NM; i++) {
                    878:                if ((xx = contab[i].rq) == 0 || contab[i].mx == 0)
                    879:                        continue;
                    880:                tcnt++;
                    881:                p = pmline;
                    882:                j = (filep) contab[i].mx;
                    883:                k = 1;
                    884:                while ((j = blist[blisti(j)]) != (unsigned) ~0) {
                    885:                        k++; 
                    886:                }
                    887:                cnt++;
                    888:                kk += k;
                    889:                if (!tot) {
                    890:                        *p++ = xx & 0177;
                    891:                        if (!(*p++ = (xx >> BYTE) & 0177))
                    892:                                *(p - 1) = ' ';
                    893:                        *p++ = 0;
                    894:                        fdprintf(stderr, "%s %d\n", pmline, k);
                    895:                }
                    896:        }
                    897:        fdprintf(stderr, "pm: total %d, macros %d, space %d\n", tcnt, cnt, kk);
                    898: }
                    899: 
                    900: stackdump()    /* dumps stack of macros in process */
                    901: {
                    902:        struct s *p;
                    903: 
                    904:        if (p != stk) {
                    905:                for (p = frame; p != stk; p = p->pframe)
                    906:                        fdprintf(stderr, "%c%c ", p->mname&0177, (p->mname>>BYTE)&0177);
                    907:                fdprintf(stderr, "\n");
                    908:        }
                    909: }

unix.superglobalmegacorp.com

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