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

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

unix.superglobalmegacorp.com

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