Annotation of 43BSD/usr.bin/troff/t6.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)t6.c       4.2 2/23/83";
                      3: #endif lint
                      4: 
                      5: #include "tdef.h"
                      6: extern
                      7: #include "d.h"
                      8: extern
                      9: #include "v.h"
                     10: 
                     11: /*
                     12: troff6.c
                     13: 
                     14: width functions, sizes and fonts
                     15: */
                     16: 
                     17: extern int     inchar[LNSIZE], *pinchar;       /* XXX */
                     18: extern int eschar;
                     19: extern int widthp;
                     20: extern int ohc;
                     21: extern int xpts;
                     22: extern int xfont;
                     23: extern int code;
                     24: extern int smnt;
                     25: extern int setwdf;
                     26: extern int cs;
                     27: extern int ccs;
                     28: extern int spacesz;
                     29: extern char trtab[];
                     30: extern int xbitf;
                     31: extern int mfont;
                     32: extern int mpts;
                     33: extern int pfont;
                     34: extern int ppts;
                     35: extern int oldbits;
                     36: extern int chbits;
                     37: extern int spbits;
                     38: extern int nonumb;
                     39: extern int noscale;
                     40: extern int font;
                     41: extern int font1;
                     42: extern int pts;
                     43: extern int pts1;
                     44: extern int apts;
                     45: extern int apts1;
                     46: extern int sps;
                     47: extern int nlflg;
                     48: extern int nform;
                     49: extern int dfact;
                     50: extern int lss;
                     51: extern int lss1;
                     52: extern int vflag;
                     53: extern int ch0;
                     54: extern int lg;
                     55: char *fontfile = "/usr/lib/font/ftXX";
                     56: int ffi = 0;
                     57: extern int bd;
                     58: extern int level;
                     59: extern int ch;
                     60: extern int res;
                     61: extern int ptid;
                     62: extern char W1[],W2[],W3[],W4[];
                     63: extern int xxx;
                     64: int trflg;
                     65: char *fontab[] = {W1,W2,W3,W4};
                     66: int fontlab[] = {'R','I','B','S',0};
                     67: char pstab[] = {6,7,8,9,10,11,12,14,16,18,20,22,24,28,36,0};
                     68: char psctab[] = {010,000,001,007,002,003,004,005,0211,006,
                     69:                0212,0213,0214,0215,0216,0};
                     70: int cstab[4], ccstab[4];
                     71: int bdtab[4];
                     72: int sbold = 0;
                     73: int spsz = 0;
                     74: struct fz {
                     75:        char sign;
                     76:        char size;
                     77:        int inc;
                     78:        } fz[4];
                     79: 
                     80: width(c)
                     81: int c;
                     82: {
                     83:        register i,j,k;
                     84: 
                     85:        j = c;
                     86:        k = 0;
                     87:        if(j & MOT){
                     88:                if(j & VMOT)goto rtn;
                     89:                k = j & ~MOTV;
                     90:                if(j & NMOT)k = -k;
                     91:                goto rtn;
                     92:        }
                     93:        if((i = (j & CMASK)) == 010){
                     94:                k = -widthp;
                     95:                goto rtn;
                     96:        }
                     97:        if(i == PRESC)i = eschar;
                     98:        if((i == ohc) ||
                     99:           (i >= 0370))goto rtn;
                    100:        if((j>>BYTE) == oldbits){
                    101:                xfont = pfont;
                    102:                xpts = ppts;
                    103:        }else xbits(j);
                    104:        if(j & ZBIT)goto rtn;
                    105:        if(!trflg)i = trtab[i] & BMASK;
                    106:        if((i -= 32) < 0)goto rtn;
                    107:        k = getcw(i);
                    108:        if(bd)k += bd - 1;
                    109:        if(cs)k = cs;
                    110:        widthp = k;
                    111: rtn:
                    112:        xbitf = trflg = 0;
                    113:        return(k);
                    114: }
                    115: getcw(i)
                    116: int i;
                    117: {
                    118:        register j,k;
                    119:        register char *p;
                    120:        int x;
                    121:        extern char codetab[];
                    122: 
                    123:        bd = 0;
                    124:        if((code = codetab[i])  & 0200){
                    125:                if(smnt){
                    126:                        p = fontab[smnt-1];
                    127:                        if(xfont == (sbold-1))bd = bdtab[smnt-1];
                    128:                        goto g0;
                    129:                }
                    130:                code = 0;
                    131:                k = 36;
                    132:                goto g1;
                    133:        }
                    134:        p = fontab[xfont];
                    135: g0:
                    136:        if(!i)k = spacesz;
                    137:        else k = *(p + i) & BMASK;
                    138:        if(setwdf)v.ct |= ((k>>6) & 3);
                    139: g1:
                    140:        k = (j = (k&077)*(xpts&077))/6;
                    141:        if((j%6) >= 3)k++;
                    142:        if(cs = cstab[xfont]){
                    143:                if(ccs = ccstab[xfont])x = ccs; else x = xpts;
                    144:                cs = (j = (cs&077)*(x&077))/6;
                    145:                if((j%6) >= 3)cs++;
                    146:        }
                    147:        if(!bd)bd = bdtab[xfont];
                    148:        return(k);
                    149: }
                    150: xbits(i)
                    151: int i;
                    152: {
                    153:        register j, k;
                    154: 
                    155: /*
                    156:        if((j = i >> BYTE) == oldbits){
                    157:                xfont = pfont;
                    158:                xpts = ppts;
                    159:                goto rtn;
                    160:        }
                    161: */
                    162:        j = i >> BYTE;
                    163:        xfont = (j>>1) & 03;
                    164:        if(k = (j>>3) & 017){
                    165:                xpts = pstab[--k];
                    166:                if(psctab[k] < 0)xpts |= DBL;
                    167:                oldbits = j;
                    168:                pfont = xfont;
                    169:                ppts = xpts;
                    170:                goto rtn;
                    171:        }
                    172:        switch(xbitf){
                    173:                case 0:
                    174:                        xfont = font;
                    175:                        xpts = pts;
                    176:                        break;
                    177:                case 1:
                    178:                        xfont = pfont;
                    179:                        xpts = ppts;
                    180:                        break;
                    181:                case 2:
                    182:                        xfont = mfont;
                    183:                        xpts = mpts;
                    184:        }
                    185: rtn:
                    186:        xbitf = 0;
                    187: }
                    188: setch(){
                    189:        register i,*j,k;
                    190:        extern int chtab[];
                    191: 
                    192:        if((i = getrq()) == 0)return(0);
                    193:        for(j=chtab;*j != i;j++)if(*(j++) == 0)return(0);
                    194:        k = *(++j) | chbits;
                    195: /*
                    196:        if((i & CMASK) == '*'){
                    197:                if(((i = find('R',fontlab)) < 0) &&
                    198:                   ((i = find('G',fontlab)) < 0))
                    199:                        return(k);
                    200:                else return((k & ~(03<<(BYTE+1))) | (i<<(BYTE+1)));
                    201:        }
                    202: */
                    203:        return(k);
                    204: }
                    205: find(i,j)
                    206: int i,j[];
                    207: {
                    208:        register k;
                    209: 
                    210:        if(((k = i-'0') >= 1) && (k <= 4) && (k != smnt))return(--k);
                    211:        for(k=0; j[k] != i; k++)if(j[k] == 0)return(-1);
                    212:        return(k);
                    213: }
                    214: casefz(){
                    215:        register i, j, k;
                    216:        int savinc;
                    217: 
                    218:        k = 0;
                    219: fz0:
                    220:        if(skip() || !(i = getrq()) ||
                    221:          ((j = find(i,fontlab))  == -1)){
                    222:                if(k)goto fz1;
                    223:                else return;
                    224:        }
                    225:        if(j == (smnt-1)){
                    226:                k = smnt;
                    227:                goto fz0;
                    228:        }
                    229:        if(k){
                    230:                spsz = j + 1;
                    231:                j = k -1;
                    232:        }
                    233: fz1:
                    234:        if((j==font) && fz[j].inc)savinc = fz[j].inc;
                    235:        else savinc = 0;
                    236:        fz[j].inc = fz[j].sign = fz[j].size = 0;
                    237:        if(skip()){
                    238:                if(k)spsz = 0;
                    239:                goto fz2;
                    240:        }
                    241:        if(((i=((k=getch()) & CMASK)) == '+') || (i == '-'))fz[j].sign = i;
                    242:        else{
                    243:                fz[j].sign = 0;
                    244:                ch = k;
                    245:        }
                    246:        noscale++;
                    247:        fz[j].size = atoi();
                    248:        noscale = 0;
                    249: fz2:
                    250:        if(j==font)casps1(apts + savinc);
                    251:        else if(j == smnt-1)mchbits();
                    252: }
                    253: caseps(){
                    254:        register i;
                    255: 
                    256:        if(skip())i = apts1;
                    257:        else{
                    258:                noscale++;
                    259:                i = inumb(&apts);
                    260:                noscale = 0;
                    261:                if(nonumb)return;
                    262:        }
                    263:        casps1(i);
                    264: }
                    265: casps1(i)
                    266: int i;
                    267: {
                    268:        if(i <= 0)return;
                    269:        if(fz[font].size){
                    270:                i = getfz(font, i);
                    271:        }
                    272:        apts1 = apts;
                    273:        apts = i;
                    274:        pts1 = pts;
                    275:        pts = findps(i & 077);
                    276:        mchbits();
                    277: }
                    278: findps(i)
                    279: int i;
                    280: {
                    281:        register j, k;
                    282: 
                    283:        for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
                    284:        if(psctab[j] < 0)k |= DBL;
                    285:        return(k);
                    286: }
                    287: mchbits(){
                    288:        register i, j, k;
                    289: 
                    290:        spbits = 0;
                    291:        i = pts & 077;
                    292:        for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
                    293:        chbits = (((++j)<<2) | font) << (BYTE + 1);
                    294:        sps = width(' ' | chbits);
                    295:        if(font == (spsz-1)){
                    296:                i = findps(getfz(smnt-1, apts + fz[font].inc));
                    297:                for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
                    298:                spbits = (((++j)<<2) | font) << (BYTE + 1);
                    299:        }
                    300: }
                    301: getfz(x,y)
                    302: int x, y;
                    303: {
                    304:        register i, j, k;
                    305: 
                    306:        i = fz[x].size;
                    307:        j = fz[x].sign;
                    308:        if(i || j){
                    309:                if(j == '+')i += y;
                    310:                else if(j == '-')i = y - i;
                    311:        }
                    312:        fz[x].inc = y - i;
                    313:        return(i);
                    314: }
                    315: setps(){
                    316:        register i,j;
                    317: 
                    318:        if((((i=getch() & CMASK) == '+')  || (i == '-')) &&
                    319:          (((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9))){
                    320:                if(i == '-')j = -j;
                    321:                ch = 0;
                    322:                casps1(apts+j);
                    323:                return;
                    324:        }
                    325:        if((i -= '0') == 0){
                    326:                casps1(apts1);
                    327:                return;
                    328:        }
                    329:        if((i > 0) && (i <= 9)){
                    330:                if((i <= 3) &&
                    331:                  ((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9)){
                    332:                        i = 10*i +j;
                    333:                        ch = 0;
                    334:                }
                    335:                casps1(i);
                    336:        }
                    337: }
                    338: caseft(){
                    339:        skip();
                    340:        setfont(1);
                    341: }
                    342: setfont(a)
                    343: int a;
                    344: {
                    345:        register i,j;
                    346: 
                    347:        if(a)i = getrq();
                    348:                else i = getsn();
                    349:        if(!i || (i == 'P')){
                    350:                j = font1;
                    351:                goto s0;
                    352:        }
                    353:        if(i == 'S')return;
                    354:        if((j = find(i,fontlab))  == -1)return;
                    355: s0:
                    356:        font1 = font;
                    357:        font = j;
                    358:        i = 0;
                    359:        if(fz[font1].size){
                    360:                i++;
                    361:                casps1(apts + fz[font1].inc);
                    362:        }else if(fz[font].size){
                    363:                i++;
                    364:                casps1(apts);
                    365:        }
                    366:        if(!i)mchbits();
                    367: }
                    368: setwd(){
                    369:        register i, base, wid;
                    370:        int delim, em, k;
                    371:        int savlevel, savhp, savapts, savapts1, savfont, savfont1,
                    372:                savpts, savpts1;
                    373:         int *savpinchar, *p, *q, tempinchar[LNSIZE];    /* XXX */
                    374: 
                    375:        base = v.st = v.sb = wid = v.ct = 0;
                    376:        if((delim = getch() & CMASK) & MOT)return;
                    377:        savhp = v.hp;
                    378:         savpinchar = pinchar;   /* XXX */
                    379:         for (p=inchar, q=tempinchar; p < pinchar; )     /* XXX */
                    380:                 *q++ = *p++;    /* XXX */
                    381:         pinchar = inchar;       /* XXX */
                    382:        savlevel = level;
                    383:        v.hp = level = 0;
                    384:        savapts = apts;
                    385:        savapts1 = apts1;
                    386:        savfont = font;
                    387:        savfont1 = font1;
                    388:        savpts = pts;
                    389:        savpts1 = pts1;
                    390:        setwdf++;
                    391:        while((((i = getch()) & CMASK) != delim) && !nlflg){
                    392:                wid += width(i);
                    393:                if(!(i & MOT)){
                    394:                        em = (xpts & 077)*6;
                    395:                }else if(i & VMOT){
                    396:                        k = i & ~MOTV;
                    397:                        if(i & NMOT)k = -k;
                    398:                        base -= k;
                    399:                        em = 0;
                    400:                }else continue;
                    401:                if(base < v.sb)v.sb = base;
                    402:                if((k=base + em) > v.st)v.st = k;
                    403:        }
                    404:        nform = 0;
                    405:        setn1(wid);
                    406:        v.hp = savhp;
                    407:         pinchar = savpinchar;   /* XXX */
                    408:         for (p=inchar, q=tempinchar; p < pinchar; )     /* XXX */
                    409:                 *p++ = *q++;    /* XXX */
                    410:        level = savlevel;
                    411:        apts = savapts;
                    412:        apts1 = savapts1;
                    413:        font = savfont;
                    414:        font1 = savfont1;
                    415:        pts = savpts;
                    416:        pts1 = savpts1;
                    417:        mchbits();
                    418:        setwdf = 0;
                    419: }
                    420: vmot(){
                    421:        dfact = lss;
                    422:        vflag++;
                    423:        return(mot());
                    424: }
                    425: hmot(){
                    426:        dfact = 6 * (pts & 077);
                    427:        return(mot());
                    428: }
                    429: mot(){
                    430:        register i, j;
                    431: 
                    432:        j = HOR;
                    433:        getch(); /*eat delim*/
                    434:        if(i = atoi()){
                    435:                if(vflag)j = VERT;
                    436:                i = makem(quant(i,j));
                    437:        }
                    438:        getch();
                    439:        vflag = 0;
                    440:        dfact = 1;
                    441:        return(i);
                    442: }
                    443: sethl(k)
                    444: int k;
                    445: {
                    446:        register i;
                    447: 
                    448:        i = 3 * (pts & 077);
                    449:        if(k == 'u')i = -i;
                    450:        else if(k == 'r')i = -2*i;
                    451:        vflag++;
                    452:        i = makem(i);
                    453:        vflag = 0;
                    454:        return(i);
                    455: }
                    456: makem(i)
                    457: int i;
                    458: {
                    459:        register j;
                    460: 
                    461:        if((j = i) < 0)j = -j;
                    462:        j = (j & ~MOTV) | MOT;
                    463:        if(i < 0)j |= NMOT;
                    464:        if(vflag)j |= VMOT;
                    465:        return(j);
                    466: }
                    467: getlg(i)
                    468: int i;
                    469: {
                    470:        register j, k;
                    471: 
                    472:        switch((j = getch0()) & CMASK){
                    473:                case 'f':
                    474:                        if(lg!=2){switch((k =getch0()) & CMASK){
                    475:                                        case 'i':
                    476:                                                j = 0214;
                    477:                                                break;
                    478:                                        case 'l':
                    479:                                                j = 0215;
                    480:                                                break;
                    481:                                        default:
                    482:                                                ch0 = k;
                    483:                                                j = 0213;
                    484:                                }
                    485:                        }else j = 0213;
                    486:                        break;
                    487:                case 'l':
                    488:                        j = 0212;
                    489:                        break;
                    490:                case 'i':
                    491:                        j = 0211;
                    492:                        break;
                    493:                default:
                    494:                        ch0 = j;
                    495:                        j = i;
                    496:        }
                    497:        return((i & ~CMASK) | j);
                    498: }
                    499: caselg(){
                    500: 
                    501:        lg = 1;
                    502:        if(skip())return;
                    503:        lg = atoi();
                    504: }
                    505: casefp(){
                    506:        register i, j, k;
                    507:        int x;
                    508: 
                    509:        if (ffi == 0)
                    510:                while (fontfile[ffi] != 'X')
                    511:                        ffi++;
                    512:        skip();
                    513:        if(((i = (getch() & CMASK) - '0' -1) < 0) || (i >3)){prstr("fp: bad font position\n"); return;}
                    514:        if(skip() || !(j = getrq())){prstr("fp: no font name\n"); return;}
                    515:        fontfile[ffi] = j & BMASK;
                    516:        fontfile[ffi+1] = j>>BYTE;
                    517:        if((k = open(fontfile,0)) < 0){
                    518:                prstr("Cannot open ");
                    519:        c0:
                    520:                prstr(fontfile);
                    521:                prstr("\n");
                    522:                done(-1);
                    523:        }
                    524:        if(lseek(k,8L * sizeof(int),0) < 0)goto c1; 
                    525:        if(read(k,fontab[i],256-32) != 256-32){
                    526:        c1:
                    527:                prstr("Cannot read ");
                    528:                goto c0;
                    529:        }
                    530:        close(k);
                    531:        if(i == (smnt-1)){smnt = 0; sbold = 0; spsz = 0;}
                    532:        if((fontlab[i] = j) == 'S')smnt = i + 1;
                    533:        bdtab[i] = cstab[i] = ccstab[i] = 0;
                    534:        fz[i].inc = fz[i].sign = fz[i].size = 0;
                    535:        if(ptid != 1){
                    536:                prstr("Mount font ");
                    537:                prstr(&fontfile[ffi]);
                    538:                prstr(" on ");
                    539:                x = PAIR((i + '1'),0);
                    540:                prstr((char *)&x);
                    541:                prstr("\n");
                    542:        }
                    543: }
                    544: casecs(){
                    545:        register i, j;
                    546: 
                    547:        noscale++;
                    548:        skip();
                    549:        if(!(i=getrq()) ||
                    550:          ((i = find(i,fontlab)) < 0))goto rtn;
                    551:        skip();
                    552:        cstab[i] = atoi();
                    553:        skip();
                    554:        j = atoi();
                    555:        if(!nonumb)ccstab[i] = findps(j);
                    556: rtn:
                    557:        noscale = 0;
                    558: }
                    559: casebd(){
                    560:        register i, j, k;
                    561: 
                    562:        k = 0;
                    563: bd0:
                    564:        if(skip() || !(i = getrq()) ||
                    565:          ((j = find(i,fontlab))  == -1)){
                    566:                if(k)goto bd1;
                    567:                else return;
                    568:        }
                    569:        if(j == (smnt-1)){
                    570:                k = smnt;
                    571:                goto bd0;
                    572:        }
                    573:        if(k){
                    574:                sbold = j + 1;
                    575:                j = k -1;
                    576:        }
                    577: bd1:
                    578:        skip();
                    579:        noscale++;
                    580:        bdtab[j] = atoi();
                    581:        noscale = 0;
                    582: }
                    583: casevs(){
                    584:        register i;
                    585: 
                    586:        skip();
                    587:        vflag++;
                    588:        dfact = 6; /*default scaling is points!*/
                    589:        res = VERT;
                    590:        i = inumb(&lss);
                    591:        if(nonumb)i = lss1;
                    592:        if(i < VERT)i = VERT;
                    593:        lss1 = lss;
                    594:        lss = i;
                    595: }
                    596: casess(){
                    597:        register i;
                    598: 
                    599:        noscale++;
                    600:        skip();
                    601:        if(i = atoi()){
                    602:                spacesz = i& 0177;
                    603:                sps = width(' ' | chbits);
                    604:        }
                    605:        noscale = 0;
                    606: }
                    607: xlss(){
                    608:        register i, j;
                    609: 
                    610:        getch();
                    611:        dfact = lss;
                    612:        i = quant(atoi(),VERT);
                    613:        dfact = 1;
                    614:        getch();
                    615:        if((j = i) < 0)j = -j;
                    616:        ch0 = ((j & 03700)<<3) | HX;
                    617:        if(i < 0)ch0 |= 040000;
                    618:        return(((j & 077)<<9) | LX);
                    619: }

unix.superglobalmegacorp.com

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