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

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

unix.superglobalmegacorp.com

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