Annotation of researchv9/cmd/troff/n6.c, revision 1.1.1.1

1.1       root        1: #include "tdef.h"
                      2: #include "tw.h"
                      3: #include "ext.h"
                      4: #include <ctype.h>
                      5: 
                      6: /*
                      7:  * n6.c -- width functions, sizes and fonts
                      8: */
                      9: 
                     10: int    bdtab[NFONT+1] ={ 0, 0, 0, 3, 3, 0, };
                     11: int    sbold = 0;
                     12: int    fontlab[NFONT+1] = { 0, 'R', 'I', 'B', PAIR('B','I'), 'S', 0 };
                     13: 
                     14: extern int     nchtab;
                     15: 
                     16: width(j)
                     17: register tchar j;
                     18: {
                     19:        register i, k;
                     20: 
                     21:        if (j & (ZBIT|MOT)) {
                     22:                if (iszbit(j))
                     23:                        return(0);
                     24:                if (isvmot(j))
                     25:                        return(0);
                     26:                k = absmot(j);
                     27:                if (isnmot(j))
                     28:                        k = -k;
                     29:                return(k);
                     30:        }
                     31:        i = cbits(j);
                     32:        if (i < ' ') {
                     33:                if (i == '\b')
                     34:                        return(-widthp);
                     35:                if (i == PRESC)
                     36:                        i = eschar;
                     37:                else if (iscontrol(i))
                     38:                        return(0);
                     39:        }
                     40:        if (i==ohc)
                     41:                return(0);
                     42:        i = trtab[i];
                     43:        if (i < 32)
                     44:                return(0);
                     45:        k = t.width[i] * t.Char;
                     46:        widthp = k;
                     47:        return(k);
                     48: }
                     49: 
                     50: 
                     51: tchar setch(c)
                     52: {
                     53:        register j;
                     54:        char    temp[50];
                     55:        register char   *s;
                     56: 
                     57:        s = temp;
                     58:        if (c == '(') { /* \(xx */
                     59:                if ((*s++ = getach()) == 0 || (*s++ = getach()) == 0)
                     60:                        return(0);
                     61:        } else {        /* \C'...' */
                     62:                c = getach();
                     63:                while ((*s = getach()) != c && *s != 0 && s < temp + sizeof(temp) - 1)
                     64:                        s++;
                     65:        }
                     66:        *s = '\0';
                     67:        if ((j = findch(temp)) > 0)
                     68:                return j | chbits;
                     69:        else
                     70:                return 0;
                     71: }
                     72: 
                     73: tchar setabs()         /* set absolute char from \C'...' */
                     74: {                      /* for now, a no-op */
                     75:        int i, n, nf;
                     76: 
                     77:        getch();
                     78:        n = 0;
                     79:        n = inumb(&n);
                     80:        getch();
                     81:        if (nonumb)
                     82:                return 0;
                     83:        if (n >= nchtab + 128) {
                     84:                errprint("\\N'%d' toooo large", n);
                     85:                return 0;
                     86:        }
                     87:        return n + nchtab + 128;
                     88: }
                     89: 
                     90: findft(i)
                     91: register int   i;
                     92: {
                     93:        register k;
                     94: 
                     95:        if ((k = i - '0') >= 0 && k <= nfonts && k < smnt)
                     96:                return(k);
                     97:        for (k = 0; fontlab[k] != i; k++)
                     98:                if (k > nfonts)
                     99:                        return(-1);
                    100:        return(k);
                    101: }
                    102: 
                    103: 
                    104: caseps()
                    105: {
                    106: }
                    107: 
                    108: 
                    109: mchbits()
                    110: {
                    111:        chbits = 0;
                    112:        setfbits(chbits, font);
                    113:        sps = width(' ' | chbits);
                    114: }
                    115: 
                    116: 
                    117: setps()
                    118: {
                    119:        register i, j;
                    120: 
                    121:        i = cbits(getch());
                    122:        if (isdigit(i)) {               /* \sd or \sdd */
                    123:                i -= '0';
                    124:                if (i == 0)             /* \s0 */
                    125:                        ;
                    126:                else if (i <= 3 && isdigit(j = cbits(ch=getch()))) {    /* \sdd */
                    127:                        ch = 0;
                    128:                }
                    129:        } else if (i == '(') {          /* \s(dd */
                    130:                getch();
                    131:                getch();
                    132:        } else if (i == '+' || i == '-') {      /* \s+, \s- */
                    133:                j = cbits(getch());
                    134:                if (isdigit(j)) {               /* \s+d, \s-d */
                    135:                        ;
                    136:                } else if (j == '(') {          /* \s+(dd, \s-(dd */
                    137:                        getch();
                    138:                        getch();
                    139:                }
                    140:        }
                    141: }
                    142: 
                    143: 
                    144: tchar setht()          /* set character height from \H'...' */
                    145: {
                    146:        int     n;
                    147:        tchar c;
                    148: 
                    149:        getch();
                    150:        n = inumb(&apts);
                    151:        getch();
                    152:        return(0);
                    153: }
                    154: 
                    155: 
                    156: tchar setslant()               /* set slant from \S'...' */
                    157: {
                    158:        int     n;
                    159:        tchar c;
                    160: 
                    161:        getch();
                    162:        n = 0;
                    163:        n = inumb(&n);
                    164:        getch();
                    165:        return(0);
                    166: }
                    167: 
                    168: 
                    169: caseft()
                    170: {
                    171:        skip();
                    172:        setfont(1);
                    173: }
                    174: 
                    175: 
                    176: setfont(a)
                    177: int    a;
                    178: {
                    179:        register i, j;
                    180: 
                    181:        if (a)
                    182:                i = getrq();
                    183:        else 
                    184:                i = getsn();
                    185:        if (!i || i == 'P') {
                    186:                j = font1;
                    187:                goto s0;
                    188:        }
                    189:        if (i == 'S' || i == '0')
                    190:                return;
                    191:        if ((j = findft(i, fontlab)) == -1)
                    192:                return;
                    193: s0:
                    194:        font1 = font;
                    195:        font = j;
                    196:        mchbits();
                    197: }
                    198: 
                    199: 
                    200: setwd()
                    201: {
                    202:        register base, wid;
                    203:        register tchar i;
                    204:        int     delim, emsz, k;
                    205:        int     savhp, savapts, savapts1, savfont, savfont1, savpts, savpts1;
                    206: 
                    207:        base = numtab[ST].val = numtab[ST].val = wid = numtab[CT].val = 0;
                    208:        if (ismot(i = getch()))
                    209:                return;
                    210:        delim = cbits(i);
                    211:        savhp = numtab[HP].val;
                    212:        numtab[HP].val = 0;
                    213:        savapts = apts;
                    214:        savapts1 = apts1;
                    215:        savfont = font;
                    216:        savfont1 = font1;
                    217:        savpts = pts;
                    218:        savpts1 = pts1;
                    219:        setwdf++;
                    220:        while (cbits(i = getch()) != delim && !nlflg) {
                    221:                k = width(i);
                    222:                wid += k;
                    223:                numtab[HP].val += k;
                    224:                if (!ismot(i)) {
                    225:                        emsz = (INCH * pts + 36) / 72;
                    226:                } else if (isvmot(i)) {
                    227:                        k = absmot(i);
                    228:                        if (isnmot(i))
                    229:                                k = -k;
                    230:                        base -= k;
                    231:                        emsz = 0;
                    232:                } else 
                    233:                        continue;
                    234:                if (base < numtab[SB].val)
                    235:                        numtab[SB].val = base;
                    236:                if ((k = base + emsz) > numtab[ST].val)
                    237:                        numtab[ST].val = k;
                    238:        }
                    239:        setn1(wid, 0, (tchar) 0);
                    240:        numtab[HP].val = savhp;
                    241:        apts = savapts;
                    242:        apts1 = savapts1;
                    243:        font = savfont;
                    244:        font1 = savfont1;
                    245:        pts = savpts;
                    246:        pts1 = savpts1;
                    247:        mchbits();
                    248:        setwdf = 0;
                    249: }
                    250: 
                    251: 
                    252: tchar vmot()
                    253: {
                    254:        dfact = lss;
                    255:        vflag++;
                    256:        return(mot());
                    257: }
                    258: 
                    259: 
                    260: tchar hmot()
                    261: {
                    262:        dfact = EM;
                    263:        return(mot());
                    264: }
                    265: 
                    266: 
                    267: tchar mot()
                    268: {
                    269:        register int j, n;
                    270:        register tchar i;
                    271: 
                    272:        j = HOR;
                    273:        getch(); /*eat delim*/
                    274:        if (n = atoi()) {
                    275:                if (vflag)
                    276:                        j = VERT;
                    277:                i = makem(quant(n, j));
                    278:        } else
                    279:                i = 0;
                    280:        getch();
                    281:        vflag = 0;
                    282:        dfact = 1;
                    283:        return(i);
                    284: }
                    285: 
                    286: 
                    287: tchar sethl(k)
                    288: int    k;
                    289: {
                    290:        register j;
                    291:        tchar i;
                    292: 
                    293:        j = t.Halfline;
                    294:        if (k == 'u')
                    295:                j = -j;
                    296:        else if (k == 'r')
                    297:                j = -2 * j;
                    298:        vflag++;
                    299:        i = makem(j);
                    300:        vflag = 0;
                    301:        return(i);
                    302: }
                    303: 
                    304: 
                    305: tchar makem(i)
                    306: int    i;
                    307: {
                    308:        register tchar j;
                    309: 
                    310:        if ((j = i) < 0)
                    311:                j = -j;
                    312:        j |= MOT;
                    313:        if (i < 0)
                    314:                j |= NMOT;
                    315:        if (vflag)
                    316:                j |= VMOT;
                    317:        return(j);
                    318: }
                    319: 
                    320: 
                    321: tchar getlg(i)
                    322: tchar  i;
                    323: {
                    324:        return(i);
                    325: }
                    326: 
                    327: 
                    328: caselg()
                    329: {
                    330: }
                    331: 
                    332: 
                    333: casefp()
                    334: {
                    335:        register i, j;
                    336: 
                    337:        skip();
                    338:        if ((i = cbits(getch()) - '0') < 0 || i > nfonts)
                    339:                return;
                    340:        if (skip() || !(j = getrq()))
                    341:                return;
                    342:        fontlab[i] = j;
                    343: }
                    344: 
                    345: 
                    346: casecs()
                    347: {
                    348: }
                    349: 
                    350: 
                    351: casebd()
                    352: {
                    353:        register i, j, k;
                    354: 
                    355:        k = 0;
                    356: bd0:
                    357:        if (skip() || !(i = getrq()) || (j = findft(i)) == -1) {
                    358:                if (k)
                    359:                        goto bd1;
                    360:                else 
                    361:                        return;
                    362:        }
                    363:        if (j == smnt) {
                    364:                k = smnt;
                    365:                goto bd0;
                    366:        }
                    367:        if (k) {
                    368:                sbold = j;
                    369:                j = k;
                    370:        }
                    371: bd1:
                    372:        skip();
                    373:        noscale++;
                    374:        bdtab[j] = atoi();
                    375:        noscale = 0;
                    376: }
                    377: 
                    378: 
                    379: casevs()
                    380: {
                    381:        register i;
                    382: 
                    383:        skip();
                    384:        vflag++;
                    385:        dfact = INCH; /*default scaling is points!*/
                    386:        dfactd = 72;
                    387:        res = VERT;
                    388:        i = inumb(&lss);
                    389:        if (nonumb)
                    390:                i = lss1;
                    391:        if (i < VERT)
                    392:                i = VERT;       /* was VERT */
                    393:        lss1 = lss;
                    394:        lss = i;
                    395: }
                    396: 
                    397: 
                    398: 
                    399: 
                    400: casess()
                    401: {
                    402: }
                    403: 
                    404: 
                    405: tchar xlss()
                    406: {
                    407:        /* stores \x'...' into
                    408:        /* two successive tchars.
                    409:        /* the first contains HX, the second the value,
                    410:        /* encoded as a vertical motion.
                    411:        /* decoding is done in n2.c by pchar().
                    412:        */
                    413:        int     i;
                    414: 
                    415:        getch();
                    416:        dfact = lss;
                    417:        i = quant(atoi(), VERT);
                    418:        dfact = 1;
                    419:        getch();
                    420:        if (i >= 0)
                    421:                *pbp++ = MOT | VMOT | i;
                    422:        else
                    423:                *pbp++ = MOT | VMOT | NMOT | -i;
                    424:        return(HX);
                    425: }

unix.superglobalmegacorp.com

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