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

1.1       root        1: #include "tdef.hd"
                      2: #include "strs.hd"
                      3: #ifdef NROFF
                      4: #include "tw.hd"
                      5: extern struct ttable t;
                      6: #endif
                      7: 
                      8: /*
                      9: troff3.c
                     10: 
                     11: macro and string routines, storage allocation
                     12: */
                     13: 
                     14: extern struct s *frame, *stk, *nxf;
                     15: extern struct tmpfaddr ip;
                     16: extern struct tmpfaddr offset;
                     17: extern struct tmpfaddr nextb;
                     18: extern struct d d[NDI], *dip;
                     19: #ifndef INCORE
                     20: extern struct envblock eblock;
                     21: #else
                     22: extern struct envblock eblock[NEV];
                     23: extern int ev;
                     24: extern char *malloc();
                     25: #include "stdio.h"
                     26: #endif
                     27: extern struct datablock dblock;
                     28: typedef unsigned short tint;   /* type of characters stored in tmp file */
                     29: 
                     30: extern char *enda;
                     31: 
                     32: extern int vflag;
                     33: extern int tch[];
                     34: extern int *cstk[], cstkl;
                     35: extern int ch_CMASK;
                     36: extern int ch;
                     37: extern int ibf;
                     38: extern int lgf;
                     39: extern int copyf;
                     40: extern int app;
                     41: extern int ds;
                     42: extern int nlflg;
                     43: extern int *argtop;
                     44: extern int dilev;
                     45: extern int nonumb;
                     46: extern int nrbits;
                     47: extern int nform;
                     48: extern int oldmn;
                     49: extern int newmn;
                     50: extern int macerr;
                     51: extern struct tmpfaddr apptr;
                     52: extern int diflg;
                     53: extern struct tmpfaddr woff;
                     54: extern int wbfi;
                     55: extern int po;
                     56: int **argpp;
                     57: int umaccp=0;
                     58: int rmaccp=0;          /* use and real macro cache buffer pointer */
                     59: int macbcnt=0;         /* macro block read count */
                     60: int pagech = '%';
                     61: int strflg;
                     62: union  {
                     63:        tint    wnt[BLK];
                     64:        char    wp[BLK*(sizeof(tint)/sizeof(char))];
                     65:        } wbuf;                 /* output buffer */
                     66: union  {
                     67:        tint    rnt[NB][BLK];
                     68:        char    rp[NB][BLK*(sizeof(tint)/sizeof(char))];
                     69:        } rbuf;                 /* macro input buffer cache */
                     70: int roff[NB];          /* block names for buffers resident in the cache */
                     71: int maclev=0;          /* depth of macro (or string or diversion) calls */
                     72: extern int regcnt;
                     73: int freenslot = -1;
                     74: #ifdef INCORE
                     75: tint *memblist[NBLIST];        /* incore tmp file mem pointers */
                     76: int *argstrs[NMACS];   /* macro arg strings */
                     77: int argstrp = 0;       /* index into argstrs */
                     78: int *argsp;            /* pointer to latest collected args */
                     79: int *sstrp;
                     80: #endif
                     81: caseig(){
                     82:        register i;
                     83: 
                     84:        offset.b = 0;
                     85:        if((i = copyb()) != '.')control(i,1);
                     86: }
                     87: casern(){
                     88:        register i,j;
                     89: 
                     90:        lgf++;
                     91:        skip();
                     92:        if ((oldmn = frmname(getrq())) < 0) return;
                     93:        skip();
                     94:        drmname(i = frmname(j = getrq()));
                     95:        if (j)  {
                     96:                if (freenslot == -1)    {
                     97:                    if (i == -1)        {
                     98:                        prstr("too many names for rn");
                     99:                        ferrex();       }
                    100:                    freenslot = i;      }
                    101: 
                    102:                nametab[freenslot].ename = (nametab[oldmn].ename & TAGSMASK) | j;
                    103:                nametab[freenslot].vv.val = nametab[oldmn].vv.val;
                    104:                nametab[oldmn].ename = -1;      }
                    105: }
                    106: caserm(){
                    107:        lgf++;
                    108:        while(!skip()){
                    109:                drmname(frmname(getrq()));
                    110:        }
                    111: }
                    112: caseas(){
                    113:        app++;
                    114:        caseds();
                    115: }
                    116: caseds(){
                    117:        ds++;
                    118:        casede();
                    119: }
                    120: caseam(){
                    121:        app++;
                    122:        casede();
                    123: }
                    124: casede(){
                    125:        register i, req;
                    126:        register struct tmpfaddr savoff;
                    127:        extern filep finds();
                    128: 
                    129:        if (dilev > 0) wbfl();
                    130:        req = '.';
                    131:        lgf++;
                    132:        skip();
                    133:        if ((i = getrq()) && finds(i)) {
                    134:                if(ds)copys();
                    135:                        else req = copyb();
                    136:                wbfl();
                    137:                drmname(oldmn);
                    138:                if (newmn >= 0) nametab[newmn].ename = i | MMASK;
                    139:                if(apptr.b){
                    140:                        cptmpfaddr(savoff,offset);
                    141:                        cptmpfaddr(offset,apptr);
                    142:                        wbt(IMP);
                    143:                        cptmpfaddr(offset,savoff);
                    144:                }
                    145:                cptmpfaddr(offset,dip->op);
                    146:                if(req != '.')control(req,1);   }
                    147:        ds = app = 0;
                    148:        return;
                    149: }
                    150: frmname(name)
                    151:                /* find name in hashed request/macro/string table */
                    152: int name;
                    153: {
                    154:        register int hname, toff, htoff;
                    155: 
                    156:        if (!name) return -1;
                    157:        freenslot = -1;         /* pos of first free name slot */
                    158:        hname = name & NAMEMASK;
                    159:        htoff = toff = abs(HASH(name,NM));      /* save orig value */
                    160: 
                    161:        while (nametab[toff].ename)     {       /* check next entry */
                    162:                if ((nametab[toff].ename & NAMEMASK) == hname) return toff;
                    163:                if ((nametab[toff].ename == -1) && (freenslot == -1))
                    164:                                freenslot = toff;
                    165:                toff = (toff + 1) % NM;
                    166:                if (toff == htoff) return -1;   }
                    167:        if (freenslot == -1) freenslot = toff;
                    168:        return -1;              /* not found */
                    169: }
                    170: fnrname(name)          /* find a name in the hashed number register table */
                    171: int name;
                    172: {
                    173:        register int hname, toff, htoff;
                    174: 
                    175:        if (!name) return -1;
                    176:        freenslot = -1;         /* mark first free slot pos */
                    177:        hname = name & NAMEMASK;
                    178:        htoff = toff = abs(HASH(name,NN));
                    179: 
                    180:        while (r[toff]) {       /* check next slot */
                    181:                if ((r[toff] & NAMEMASK) == hname) return toff;
                    182:                if ((r[toff] == -1) && (freenslot == -1)) freenslot = toff;
                    183:                toff = (toff + 1) % NN;
                    184:                if (toff == htoff) return -1;   }
                    185:        if (freenslot == -1) freenslot = toff;
                    186:        return -1;              /* not found */
                    187: }
                    188: drmname(toff)  /* remove name from request, macro table */
                    189: register int toff;
                    190: {
                    191:        if (toff == -1) return;
                    192:        if (nametab[toff].ename & MMASK)        /* free macro storage */
                    193:                ffree((filep)nametab[toff].vv.val);
                    194:        nametab[toff].ename = -1;       /* free hashed entry */
                    195: }
                    196: filep finds(mn)
                    197: int mn;
                    198: {
                    199:        register i, j;
                    200:        register struct tmpfaddr tip;
                    201:        int savmacbcnt;
                    202:        extern filep alloc();
                    203: 
                    204:        oldmn = frmname(mn);            /* get macro name */
                    205:        newmn = -1;
                    206:        apptr.b = (filep)0;
                    207:        if(app && (oldmn >= 0) && (nametab[oldmn].ename & MMASK)){
                    208:                        maclev++;
                    209:                        savmacbcnt = macbcnt;
                    210:                        tip.b = (filep)nametab[oldmn].vv.val;
                    211:                        tip.o = 0;
                    212:                        macbcnt = 0;
                    213:                        oldmn = -1;
                    214:                        while (rbf0(&tip)) incoff(tip);
                    215:                        cptmpfaddr(apptr,tip);
                    216:                        if (!diflg) incoff(tip);
                    217:                        cptmpfaddr(nextb,tip);
                    218:                        macbcnt = savmacbcnt;
                    219:                        maclev--;
                    220:        }else{
                    221:                if (((i = freenslot) == -1) && (oldmn >= 0))
                    222:                    for (j=(oldmn+1)%NM; j!=oldmn; j=((j+1)%NM))
                    223:                        if ((nametab[j].ename == -1) || (!nametab[j].ename))
                    224:                                {  i = j;  break;  }
                    225:                if ((i == -1) || (i == oldmn) || !alloc())      {
                    226:                        app = 0;
                    227:                        if(macerr++ > 1)done2(02);
                    228:                        prstr("Too many string/macro names.\n");
                    229:                        edone(04);
                    230:                        offset.o = 0;
                    231:                        return(offset.b = 0);
                    232:                }
                    233:                nametab[i].vv.val = (filep)nextb.b;
                    234:                if(!diflg){
                    235:                        newmn = i;
                    236:                        if(oldmn == -1)nametab[i].ename = -1;   }
                    237:                    else nametab[i].ename = mn | MMASK;
                    238:                offset.o = 0;
                    239:        }
                    240: 
                    241:        app = 0;
                    242:        cptmpfaddr(offset,nextb);
                    243:        return (offset.b);
                    244: }
                    245: skip(){
                    246:        register i;
                    247: 
                    248:        do i = getch();
                    249:            while (ch_CMASK == ' ');
                    250:        ch=i;
                    251:        return(nlflg);
                    252: }
                    253: copyb()
                    254: {
                    255:        register ii, j, k;
                    256:        int i, req;
                    257:        int tbuf[3];
                    258: 
                    259:        if(skip() || !(j=getrq()))j = '.';
                    260:        req = j;
                    261:        k = j>>BYTE;
                    262:        j &= BMASK;
                    263:        copyf++;
                    264:        flushi();
                    265: 
                    266:        while (1)       {       /* read body of macro */
                    267:            nlflg = 0;
                    268:            ii = 0;
                    269:            if ((tbuf[ii++] = getch()) &&
                    270:                        ((ch_CMASK == cc) || (ch_CMASK == c2))) {
                    271: 
                    272:                do tbuf[ii] = getch();  /* skip leading blanks */
                    273:                    while ((ch_CMASK == ' ') || (ch_CMASK == '\t'));
                    274:                ii++;
                    275: 
                    276:                if (ch_CMASK == j)      {       /* first terminating char? */
                    277:                    if ((tbuf[ii++] = getch()) && (ch_CMASK == k))
                    278:                            goto found;
                    279: 
                    280:                    if (!k)     {       /* single letter call? */
                    281:                        ch = tbuf[ii-1];
                    282:                        i = getach();
                    283:                        ch = tbuf[ii-1];
                    284:                        if (!i) goto found;     }}}
                    285: 
                    286:            for (i=0; i<ii; i++)        /* copy early part of line */
                    287:                wbf(tbuf[i]);
                    288: 
                    289:            if (tbuf[ii-1] != '\n')
                    290:                do wbf(i = getch());
                    291:                    while (i != '\n');  }       /* copy to end of line */
                    292: 
                    293: found:
                    294:        wbt(0);
                    295:        copyf--;
                    296:        return(req);
                    297: }
                    298: copys()
                    299: {
                    300:        register i;
                    301: 
                    302:        copyf++;
                    303:        if(skip())goto c0;
                    304:        if(((i=getch()) & CMASK) != '"')wbf(i);
                    305:        while(((i=getch()) & CMASK) != '\n')wbf(i);
                    306: c0:
                    307:        wbt(0);
                    308:        copyf--;
                    309: }
                    310: filep alloc()
                    311: {
                    312:        register filep i;
                    313: 
                    314:        for(i=1; i<=NBLIST; i++)
                    315:                if(blist[i] == 0)break;
                    316:        if (i == NBLIST+1) i = 0;
                    317:                else  {  blist[i] = -1;
                    318: #ifdef INCORE
                    319:                         if ((memblist[i] =
                    320:                             (tint *)malloc(BLK*sizeof(tint))) == NULL) {
                    321:                                prstr("out of memory for store");
                    322:                                exit(1);        }
                    323: #endif
                    324:                        }
                    325:        nextb.o = 0;
                    326:        return (nextb.b = i);
                    327: }
                    328: ffree(i)
                    329: register filep i;
                    330: {
                    331:        register j;
                    332: 
                    333:        while((blist[j = i]) != (filep)-1){
                    334: #ifdef INCORE
                    335:        free(memblist[i]);
                    336: #endif
                    337:                i = blist[i];
                    338:                blist[j] = 0;
                    339:        }
                    340:        blist[j] = 0;
                    341: }
                    342: wbt(i)
                    343: int i;
                    344: {
                    345:        wbf(i);
                    346:        wbfl();
                    347: }
                    348: wbf(i)
                    349: int i;
                    350: {
                    351:        if(!offset.b)return;
                    352:        if(!woff.b){
                    353:                cptmpfaddr(woff,offset);
                    354:                wbfi = 0;
                    355:        }
                    356:        wbuf.wnt[wbfi++] = (tint)i;
                    357:        if (!(offset.o = ++offset.o & (BLK - 1)))       {
                    358:                wbfl();
                    359:                if(blist[offset.b] == (filep)-1){
                    360:                        if(alloc() == 0){
                    361:                                prstr("Out of temp file space.\n");
                    362:                                done2(01);      }
                    363:                        blist[offset.b] = (filep) nextb.b;      }
                    364:                offset.b = (filep) blist[offset.b];     }
                    365:        if(wbfi >= BLK)wbfl();
                    366: }
                    367: wbfl(){
                    368:        register int i, j;
                    369: #ifdef INCORE
                    370:        register tint *bp;
                    371: #endif
                    372: 
                    373:        if (!woff.b) return;
                    374: #ifndef INCORE
                    375:        lseek(ibf, (long)(boff(woff.b) + woff.o) * sizeof(tint), 0);
                    376:        write(ibf, wbuf.wp, (int)(wbfi * sizeof(tint)));
                    377: #else
                    378:        bp = memblist[woff.b] + woff.o;
                    379:        for (i=0; i<wbfi; i++)
                    380:                *bp++ = wbuf.wnt[i];    /* save block */
                    381: #endif
                    382:        for (i=0; i<NB; i++)
                    383:            if (woff.b == roff[i])      {
                    384:                for (j=0; j<wbfi; j++)
                    385:                        rbuf.rnt[i][woff.o+j] = wbuf.wnt[j];    /* fix up read buffer */
                    386:                break;  }
                    387:        woff.b = 0;
                    388: }
                    389: rbf(){
                    390:        register i;
                    391: 
                    392:        if (!(i = rbf0(&ip)))   {
                    393:                i = popi();
                    394:                if (maclev) rmaccp = (!rmaccp) ? NB-1 : rmaccp-1;       }
                    395:            else incoff(ip);
                    396:        return(i);
                    397: }
                    398: rbf0(fp)
                    399: struct tmpfaddr *fp;
                    400: {
                    401:        register filep i;
                    402: 
                    403:        if ((fp->b == (filep)-1) || (fp->b == (filep)-2)) return -1;
                    404: 
                    405:        if (fp->b != roff[umaccp])      {       /* test if buffer in cache */
                    406:            for (i=0; i<NB; i++)
                    407:                if (fp->b == roff[i]) break;    /* found */
                    408:            umaccp = (i == NB) ? getblk(fp->b) : i;     }
                    409: 
                    410: #ifndef tso
                    411:        return (int)rbuf.rnt[umaccp][fp->o];
                    412: #else
                    413:        return (((int)rbuf.rnt[umaccp][fp->o]) & 0177777);
                    414: #endif
                    415: }
                    416: getblk(blk)
                    417: filep blk;             /* find a place in the cache and get a block */
                    418: {
                    419:        register int i;
                    420: #ifdef INCORE
                    421:        register int j;
                    422:        register tint *bp;
                    423: #endif
                    424: 
                    425:        i = (!rmaccp) ? NB-1 : rmaccp-1;
                    426:        if (!macbcnt || (!(umaccp == i)))       {
                    427:                i = rmaccp;
                    428:                rmaccp = (rmaccp + 1) %  NB;    }
                    429:        macbcnt++;
                    430: #ifndef INCORE
                    431:        lseek(ibf, (long)boff(blk) * sizeof(tint), 0);
                    432:        if (read(ibf, rbuf.rp[i], BLK * sizeof(tint)) == 0)     {
                    433:                prstr("Macro read failed\n");
                    434:                ferrex();       }
                    435: #else
                    436:        bp = memblist[blk];
                    437:        for (j=0; j<BLK; j++)
                    438:                rbuf.rnt[i][j] = *bp++; /* get buffer */
                    439: #endif
                    440:        roff[i] = blk;
                    441:        return i;
                    442: }
                    443: errbsa()
                    444: {
                    445:        prstr("Bad storage allocation\n");
                    446:        done2(-5);
                    447: }
                    448: popi(){
                    449:        register struct s *p;
                    450: 
                    451:        if(frame == stk)return(0);
                    452:        if(strflg)strflg--;
                    453: #ifdef INCORE
                    454:        free(nxf);
                    455: #endif
                    456:        p = nxf = frame;
                    457:        p->nargs = 0;
                    458:        frame = p->pframe;
                    459:        cptmpfaddr(ip,p->pip);
                    460:        macbcnt = p->macbcnt;
                    461:        pendt = p->ppendt;
                    462:        if (tch[0] = p->pCH0) cstk[CH0] = tch;
                    463:        cstkl = p->pcstkl;
                    464:        cstk[RP] = p->pRP;
                    465:        cstk[AP] = p->pAP;
                    466:        cstk[CP] = p->pCP;
                    467: #ifdef INCORE
                    468:        if ((argstrp > 0) && (argsp)) free(argsp);      /* args */
                    469:        argsp = argstrs[--argstrp];
                    470: #endif
                    471:        maclev--;
                    472:        return(p->pch);
                    473: }
                    474: pushi(newip)
                    475: filep newip;
                    476: {
                    477:        register struct s *p;
                    478: #ifndef INCORE
                    479:        extern char *setbrk();
                    480: #endif
                    481: 
                    482:        p = nxf;
                    483: #ifndef INCORE
                    484:        if((enda - sizeof(struct s)) < (char *)nxf)setbrk(DELTA);
                    485: #else
                    486:        if (argstrp < NMACS)
                    487:                argstrs[argstrp++] = argsp;     /* save latest */
                    488:            else        {
                    489:                prstr("too many macro calls");
                    490:                exit(1);        }
                    491:        argsp = sstrp;          /* new args pointer */
                    492:        sstrp = (int *)0;
                    493: #endif
                    494:        p->pframe = frame;
                    495:        cptmpfaddr(p->pip,ip);
                    496:        p->macbcnt = macbcnt;
                    497:        p->ppendt = pendt;
                    498:        p->pCH0 = tch[0];
                    499:        p->pch = ch;
                    500:        p->pcstkl = cstkl;
                    501:        p->pRP = cstk[RP];
                    502:        p->pAP = cstk[AP];
                    503:        p->pCP = cstk[CP];
                    504:        cstkl  = pendt = ch = 0;
                    505:        cstk[RP] = cstk[AP] = cstk[CP] = (int *) 0;
                    506:        frame = nxf;
                    507: #ifndef INCORE
                    508:        if(nxf->nargs == 0) nxf += 1;
                    509:                else nxf = (struct s *)argtop;
                    510: #else
                    511:        if ((nxf = (struct s *)malloc(sizeof(struct s))) == NULL) {
                    512:                prstr("out of memory for macro call");
                    513:                exit(1);        }
                    514: #endif
                    515:        maclev++;
                    516:        macbcnt = 0;
                    517:        ip.o = 0;
                    518:        return(ip.b = newip);
                    519: }
                    520: 
                    521: #ifndef INCORE
                    522: char *setbrk(x)
                    523: int x;
                    524: {
                    525: #define ALIGN(addr,grain)  ((addr+sizeof(grain)-1) & ~(sizeof(grain)-1))
                    526:        register char *i;
                    527:        char *sbrk();
                    528: 
                    529:        x = ALIGN(x, long);
                    530: 
                    531:        if((i = sbrk(x)) == (char *)-1){
                    532:                prstrfl("Core limit reached.\n");
                    533:                edone(0100);    }
                    534:            else enda = i;
                    535: 
                    536:        return((char *)ALIGN((int)i, long));
                    537: }
                    538: #endif
                    539: getsn(){
                    540:        register i;
                    541: 
                    542:        if((i=getach()) == 0)return(0);
                    543:        if(i == '(')return(getrq());
                    544:                else return(i);
                    545: }
                    546: setstr(){
                    547:        register i;
                    548: 
                    549:        lgf++;
                    550:        if(((i=getsn()) == 0) ||
                    551:           ((i=frmname(i)) == -1) ||
                    552:           !(nametab[i].ename & MMASK))
                    553:                lgf--;
                    554:        else    {
                    555: #ifndef INCORE
                    556:                if((enda-sizeof(int)) <= (char *)nxf)setbrk(DELTA);
                    557: #endif
                    558:                nxf->nargs = 0;
                    559:                strflg++;
                    560:                lgf--;
                    561:                pushi((filep)nametab[i].vv.val);
                    562:        }
                    563: }
                    564: collect()
                    565: {
                    566:        register i;
                    567:        register int *strp;
                    568:        int *lim;
                    569:        int quote;
                    570:        struct s *savnxf;
                    571:        union   {
                    572:                int     **dbl;
                    573:                int     *pt;
                    574:                } argppend;
                    575: #ifdef INCORE
                    576:        int *hsstrp;
                    577: #endif
                    578: 
                    579:        copyf++;
                    580:        nxf->nargs = 0;
                    581:        if(skip())goto rtn;
                    582:        strflg = 0;
                    583:        savnxf = nxf;
                    584: #ifndef INCORE
                    585:        lim = (int *)(nxf = savnxf + sizeof(struct s));
                    586:        if((argppend.dbl =
                    587:                (argpp=(int **)savnxf+(sizeof(struct s)/sizeof(int **)))
                    588:                    +(sizeof(struct s)-1)) > (int **)enda)setbrk(DELTA);
                    589: #else
                    590:        if ((argpp = (int **)malloc(MARGL*sizeof(int))) == NULL) {
                    591:                prstr("out of memory for macro call");
                    592:                exit(1);        }
                    593:        hsstrp = (int *)argpp;
                    594:        argppend.pt = hsstrp + sizeof(struct s) - 1;
                    595:        lim = hsstrp + (MARGL*sizeof(int));     /* end of buf */
                    596: #endif
                    597:        strp = argppend.pt;
                    598:        for(i=8; i>=0; i--)argpp[i] = 0;
                    599:        while((argpp != argppend.dbl) && (!skip())){
                    600:                *argpp++ = strp;
                    601:                quote = 0;
                    602:                ch = getch();
                    603:                if (ch_CMASK == '"')    {
                    604:                        ch = 0;
                    605:                        quote++;        }
                    606:                while(1){
                    607:                        i = getch();
                    608:                        if( nlflg ||
                    609:                          ((!quote) && (ch_CMASK == ' ')))break;
                    610:                        if(quote && (ch_CMASK == '"') &&
                    611:                            ((i = getch()) && (ch_CMASK != '"'))) {
                    612:                                ch = i;
                    613:                                break;
                    614:                        }
                    615:                        *strp++ = i;
                    616:                        if(strflg && (strp >= lim)){
                    617:                                prstrfl("Macro argument too long.\n");
                    618:                                copyf--;
                    619:                                edone(004);
                    620:                        }
                    621: #ifndef INCORE
                    622:                        if((enda-(2*sizeof(int))) <= (char *)strp)setbrk(DELTA);
                    623: #endif
                    624:                }
                    625:                *strp++ = 0;
                    626:        }
                    627:        nxf = savnxf;
                    628: #ifndef INCORE
                    629:        nxf->nargs = argpp -(int **)(nxf + 1);
                    630: #else
                    631:        sstrp = hsstrp;
                    632:        nxf->nargs = (int *)argpp - sstrp;
                    633: #endif
                    634:        argtop = strp;
                    635: rtn:
                    636:        copyf--;
                    637: }
                    638: caseda(){
                    639:        app++;
                    640:        casedi();
                    641: }
                    642: casedi(){
                    643:        register i, j;
                    644:        register *k;
                    645: 
                    646:        lgf++;
                    647:        if(skip() || ((i=getrq()) == 0)){
                    648:                if(dilev > 0){
                    649:                        wbt(0);
                    650:                        v_dn = dip->dnl;
                    651:                        v_dl = dip->maxl;
                    652:                        dip = &d[--dilev];
                    653:                        cptmpfaddr(offset,dip->op);
                    654:                }
                    655:                goto rtn;
                    656:        }
                    657:        if(++dilev == NDI){
                    658:                --dilev;
                    659:                prstr("Cannot divert.\n");
                    660:                edone(02);
                    661:        }
                    662:        if (dilev > 1) wbt(0);
                    663:        diflg++;
                    664:        dip = &d[dilev];
                    665:        dip->op.b = finds(i);
                    666:        dip->op.o = offset.o;
                    667:        dip->curd = i;
                    668:        drmname(oldmn);
                    669:        k = (int *)&dip->dnl;
                    670:        for(j=0; j<10; j++)k[j] = 0;    /*not op and curd*/
                    671: rtn:
                    672:        app = 0;
                    673:        diflg = 0;
                    674: }
                    675: casedt(){
                    676:        lgf++;
                    677:        dip->dimac = dip->ditrap = dip->ditf = 0;
                    678:        skip();
                    679:        dip->ditrap = vnumb((int *)0);
                    680:        if(nonumb)return;
                    681:        skip();
                    682:        dip->dimac = getrq();
                    683: }
                    684: casetl(){
                    685:        register i, j;
                    686:        int w1, w2, w3, delim;
                    687:        struct tmpfaddr begin;
                    688:        static struct tmpfaddr null = {0,0};
                    689:        extern width(), pchar();
                    690: 
                    691:        dip->nls = 0;
                    692:        skip();
                    693:        if (dilev > 0) wbfl();
                    694:        if((offset.b = begin.b = alloc()) == 0)return;
                    695:        offset.o = begin.o = 0;
                    696:        if((delim = getch()) & MOT){
                    697:                ch = delim;
                    698:                delim = '\'';
                    699:        }else delim = ch_CMASK;
                    700:        if(!nlflg)
                    701:                while(((i = getch()) & CMASK) != '\n'){
                    702:                        if(ch_CMASK == delim)i = IMP;
                    703:                        wbf(i);
                    704:                }
                    705:        wbf(IMP);wbf(IMP);wbt(0);
                    706: 
                    707:        w1 = hseg(width,&begin);
                    708:        w2 = hseg(width,&null);
                    709:        w3 = hseg(width,&null);
                    710:        cptmpfaddr(offset,dip->op);
                    711: #ifdef NROFF
                    712:        if(!offset.b)horiz(po);
                    713: #endif
                    714:        hseg(pchar,&begin);
                    715:        if(w2 || w3)horiz(j=quant((lt - w2)/2-w1,HOR));
                    716:        hseg(pchar,&null);
                    717:        if(w3){
                    718:                horiz(lt-w1-w2-w3-j);
                    719:                hseg(pchar,&null);
                    720:        }
                    721:        newline(0);
                    722:        if(dilev > 0) {if(dip->dnl > dip->hnl)dip->hnl = dip->dnl;}
                    723:        else{if(v_nl > dip->hnl)dip->hnl = v_nl;}
                    724:        ffree(begin.b);
                    725: }
                    726: casepc(){
                    727:        pagech = chget(IMP);
                    728: }
                    729: hseg(f,p)
                    730: int (*f)();
                    731: struct tmpfaddr *p;
                    732: {
                    733:        register acc, i;
                    734:        static struct tmpfaddr q;
                    735:        int smacbcnt;
                    736: 
                    737:        acc = 0;
                    738:        if(p->b) { q.o = p->o; q.b = p->b; }
                    739:        smacbcnt = macbcnt;
                    740:        macbcnt = 0;
                    741:        while(1){
                    742:                i = rbf0(&q);
                    743:                incoff(q);
                    744:                if(!i || (i == IMP))    {
                    745:                                macbcnt = smacbcnt;
                    746:                                return (acc);   };
                    747:                if((i & CMASK) == pagech){
                    748:                        nrbits = i & ~CMASK;
                    749:                        nform = fmt[findr('%')];
                    750:                        acc += fnumb(v_pn,f);
                    751:                }else acc += (*f)(i);
                    752:        }
                    753: }
                    754: casepm(){
                    755: #ifndef NDIAGS
                    756:        register i, k;
                    757:        register char *p;
                    758:        int xx, cnt, kk, tot;
                    759:        filep j;
                    760:        char *kvt();
                    761:        char pmline[10];
                    762: 
                    763:        kk = cnt = 0;
                    764:        tot = !skip();
                    765:        for(i = 0; i<NM; i++){
                    766:                if (((xx = nametab[i].ename) == -1) || (!(xx & MMASK))) continue;
                    767:                p = pmline;
                    768:                j = (filep)nametab[i].vv.val;
                    769:                k = 1;
                    770:                while((j = blist[j]) != (filep)-1) k++;
                    771:                cnt++;
                    772:                kk += k;
                    773:                if(!tot){
                    774:                        *p++ = xx & 0177;
                    775:                        if(!(*p++ = (xx >> BYTE) & 0177))*(p-1) = ' ';
                    776:                        *p++ = ' ';
                    777:                        kvt(k,p);
                    778:                        aprstr(pmline);
                    779:                }
                    780:        }
                    781:        if(tot || (cnt > 1)){
                    782:                kvt(kk,pmline);
                    783:                aprstr(pmline);
                    784:        }
                    785: }
                    786: char *kvt(k,p)
                    787: int k;
                    788: char *p;
                    789: {
                    790:        if(k>=100)*p++ = k/100 + '0';
                    791:        if(k>=10)*p++ = (k%100)/10 + '0';
                    792:        *p++ = k%10 + '0';
                    793:        *p++ = '\n';
                    794:        *p = 0;
                    795: #endif
                    796: }

unix.superglobalmegacorp.com

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