Annotation of 42BSD/usr.bin/troff/n3.c, revision 1.1

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

unix.superglobalmegacorp.com

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