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

unix.superglobalmegacorp.com

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