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

1.1       root        1: #include "tdef.h"
                      2: #include <ctype.h>
                      3: #include "ext.h"
                      4: /*
                      5:  * troff10.c
                      6:  * 
                      7:  * typesetter interface
                      8:  */
                      9: 
                     10: int    vpos     = 0;   /* absolute vertical position on page */
                     11: int    hpos     = 0;   /* ditto horizontal */
                     12: 
                     13: short  *chtab;
                     14: char   *chname;
                     15: char   *fontab[NFONT+1];
                     16: char   *kerntab[NFONT+1];
                     17: char   *fitab[NFONT+1];
                     18: char   *codetab[NFONT+1];
                     19: 
                     20: int    Inch;
                     21: int    Hor;
                     22: int    Vert;
                     23: int    Unitwidth;
                     24: int    nfonts;
                     25: int    nsizes;
                     26: int    nchtab;
                     27: 
                     28: /* these characters are used as various signals or values
                     29: /* in miscellaneous places.
                     30: /* values are set in specnames in t10.c
                     31: */
                     32: 
                     33: int    c_hyphen;
                     34: int    c_emdash;
                     35: int    c_rule;
                     36: int    c_minus;
                     37: int    c_fi;
                     38: int    c_fl;
                     39: int    c_ff;
                     40: int    c_ffi;
                     41: int    c_ffl;
                     42: int    c_acute;
                     43: int    c_grave;
                     44: int    c_under;
                     45: int    c_rooten;
                     46: int    c_boxrule;
                     47: int    c_lefthand;
                     48: int    c_dagger;
                     49: 
                     50: #include "dev.h"
                     51: struct dev dev;
                     52: struct Font *fontbase[NFONT+1];
                     53: 
                     54: 
                     55: ptinit()
                     56: {
                     57:        int     i, fin, nw;
                     58:        char    *setbrk(), *filebase, *p;
                     59: 
                     60:        /* open table for device,
                     61:        /* read in resolution, size info, font info, etc.
                     62:        /* and set params
                     63:        */
                     64:        strcat(termtab, "/dev");
                     65:        strcat(termtab, devname);
                     66:        strcat(termtab, "/DESC.out");   /* makes "..../devXXX/DESC.out" */
                     67:        if ((fin = open(termtab, 0)) < 0) {
                     68:                errprint("can't open tables for %s", termtab);
                     69:                done3(1);
                     70:        }
                     71:        read(fin, (char *) &dev, sizeof(struct dev ));
                     72:        Inch = dev.res;
                     73:        Hor = dev.hor;
                     74:        Vert = dev.vert;
                     75:        Unitwidth = dev.unitwidth;
                     76:        nfonts = dev.nfonts;
                     77:        nsizes = dev.nsizes;
                     78:        nchtab = dev.nchtab;
                     79:        if (nchtab >= NCHARS - 128) {
                     80:                errprint("too many special characters in file %s", termtab);
                     81:                done3(1);
                     82:        }
                     83:        filebase = setbrk(dev.filesize + 3*(dev.biggestfont+1) + dev.nchtab + 128 - 32);        /* room for file + 1 font */
                     84:        read(fin, filebase, dev.filesize);      /* all at once */
                     85:        pstab = (short *) filebase;
                     86:        chtab = pstab + nsizes + 1;
                     87:        chname = (char *) (chtab + dev.nchtab);
                     88:        p = chname + dev.lchname;
                     89:        for (i = 1; i <= nfonts; i++) {
                     90:                fontbase[i] = (struct Font *) p;
                     91:                nw = *p & BYTEMASK;     /* 1st thing is width count */
                     92:                fontlab[i] = PAIR(fontbase[i]->namefont[0], fontbase[i]->namefont[1]);
                     93:                /* for now, still 2 char names */
                     94:                if (smnt == 0 && fontbase[i]->specfont == 1)
                     95:                        smnt = i;       /* first special font */
                     96:                p += sizeof(struct Font);       /* that's what's on the beginning */
                     97:                fontab[i] = p;
                     98:                kerntab[i] = p + nw;
                     99:                codetab[i] = p + 2 * nw;
                    100:                fitab[i] = p + 3 * nw;  /* skip width, kern, code */
                    101:                p += 3 * nw + dev.nchtab + 128 - 32;
                    102:        }
                    103:        fontbase[0] = (struct Font *) p;        /* the last shall be first */
                    104:        fontbase[0]->nwfont = dev.biggestfont + 1;
                    105:        fontab[0] = p + sizeof (struct Font);
                    106:        close(fin);
                    107: 
                    108:        sps = SPS;
                    109:        ics = ICS;
                    110:        for (i = 0; i < 16; i++)
                    111:                tabtab[i] = DTAB * (i + 1);
                    112:        pl = 11 * INCH;
                    113:        po = PO;
                    114:        spacesz = SS;
                    115:        lss = lss1 = VS;
                    116:        ll = ll1 = lt = lt1 = LL;
                    117:        specnames();    /* install names like "hyphen", etc. */
                    118:        if (ascii)
                    119:                return;
                    120:        fdprintf(ptid, "x T %s\n", devname);
                    121:        fdprintf(ptid, "x res %d %d %d\n", Inch, Hor, Vert);
                    122:        fdprintf(ptid, "x init\n");     /* do initialization for particular device */
                    123:   /*
                    124:        for (i = 1; i <= nfonts; i++)
                    125:                fdprintf(ptid, "x font %d %.10s\n", i, fontbase[i]->namefont);
                    126:        fdprintf(ptid, "x xxx fonts=%d sizes=%d unit=%d\n", nfonts, nsizes, Unitwidth);
                    127:        fdprintf(ptid, "x xxx nchtab=%d lchname=%d nfitab=%d\n",
                    128:                dev.nchtab, dev.lchname, dev.nchtab+128-32);
                    129:        fdprintf(ptid, "x xxx sizes:\nx xxx ");
                    130:        for (i = 0; i < nsizes; i++)
                    131:                fdprintf(ptid, " %d", pstab[i]);
                    132:        fdprintf(ptid, "\nx xxx chars:\nx xxx ");
                    133:        for (i = 0; i < dev.nchtab; i++)
                    134:                fdprintf(ptid, " %s", &chname[chtab[i]]);
                    135:        fdprintf(ptid, "\nx xxx\n");
                    136:   */
                    137: }
                    138: 
                    139: specnames()
                    140: {
                    141:        static struct {
                    142:                int     *n;
                    143:                char    *v;
                    144:        } spnames[] = {
                    145:                &c_hyphen, "hy",
                    146:                &c_emdash, "em",
                    147:                &c_rule, "ru",
                    148:                &c_minus, "\\-",
                    149:                &c_fi, "fi",
                    150:                &c_fl, "fl",
                    151:                &c_ff, "ff",
                    152:                &c_ffi, "Fi",
                    153:                &c_ffl, "Fl",
                    154:                &c_acute, "aa",
                    155:                &c_grave, "ga",
                    156:                &c_under, "ul",
                    157:                &c_rooten, "rn",
                    158:                &c_boxrule, "br",
                    159:                &c_lefthand, "lh",
                    160:                &c_dagger, "dg",
                    161:                0, 0
                    162:        };
                    163:        int     i;
                    164: 
                    165:        for (i = 0; spnames[i].n; i++)
                    166:                *spnames[i].n = findch(spnames[i].v);
                    167: }
                    168: 
                    169: findch(s)      /* find char s in chname */
                    170: register char  *s;
                    171: {
                    172:        register int    i;
                    173: 
                    174:        for (i = 0; i < nchtab; i++)
                    175:                if (strcmp(s, &chname[chtab[i]]) == 0)
                    176:                        return(i + 128);
                    177:        return(0);
                    178: }
                    179: 
                    180: ptout(i)
                    181: register tchar i;
                    182: {
                    183:        register dv;
                    184:        register tchar  *k;
                    185:        int temp, a, b;
                    186: 
                    187:        if (cbits(i) != '\n') {
                    188:                if (olinep >= oline + OLNSIZE) {
                    189:                        errprint("Output line overflow.");
                    190:                        done(2);
                    191:                }
                    192:                *olinep++ = i;
                    193:                return;
                    194:        }
                    195:        if (olinep == oline) {
                    196:                lead += lss;
                    197:                return;
                    198:        }
                    199: 
                    200:        hpos = po;      /* ??? */
                    201:        esc = 0;        /* ??? */
                    202:        ptesc();        /* the problem is to get back to the left end of the line */
                    203:        dv = 0;
                    204:        for (k = oline; k < olinep; k++) {
                    205:                if (ismot(*k) && isvmot(*k)) {
                    206:                        temp = absmot(*k);
                    207:                        if (isnmot(*k))
                    208:                                temp = -temp;
                    209:                        dv += temp;
                    210:                }
                    211:        }
                    212:        if (dv) {
                    213:                vflag++;
                    214:                *olinep++ = makem(-dv);
                    215:                vflag = 0;
                    216:        }
                    217: 
                    218:        b = dip->blss + lss;
                    219:        lead += dip->blss + lss;
                    220:        dip->blss = 0;
                    221:        for (k = oline; k < olinep; )
                    222:                k += ptout0(k); /* now passing a pointer! */
                    223:        olinep = oline;
                    224:        lead += dip->alss;
                    225:        a = dip->alss;
                    226:        dip->alss = 0;
                    227:        /*
                    228:        fdprintf(ptid, "x xxx end of line: hpos=%d, vpos=%d\n", hpos, vpos);
                    229: */
                    230:        fdprintf(ptid, "n%d %d\n", b, a);       /* be nice to chuck */
                    231: }
                    232: 
                    233: ptout0(pi)
                    234: tchar  *pi;
                    235: {
                    236:        register short j, k, w;
                    237:        short   z, dx, dy, dx2, dy2, n;
                    238:        register tchar  i;
                    239:        int outsize;    /* size of object being printed */
                    240: 
                    241:        outsize = 1;    /* default */
                    242:        i = *pi;
                    243:        k = cbits(i);
                    244:        if (ismot(i)) {
                    245:                j = absmot(i);
                    246:                if (isnmot(i))
                    247:                        j = -j;
                    248:                if (isvmot(i))
                    249:                        lead += j;
                    250:                else 
                    251:                        esc += j;
                    252:                return(outsize);
                    253:        }
                    254:        if (k == CHARHT) {
                    255:                if (xpts != mpts)
                    256:                        ptps();
                    257:                fdprintf(ptid, "x H %d\n", sbits(i));
                    258:                return(outsize);
                    259:        }
                    260:        if (k == SLANT) {
                    261:                fdprintf(ptid, "x S %d\n", sfbits(i)-180);
                    262:                return(outsize);
                    263:        }
                    264:        if (k == WORDSP) {
                    265:                oput('w');
                    266:                return(outsize);
                    267:        }
                    268:        if (k == FONTPOS) {
                    269:                char temp[3];
                    270:                n = i >> 16;
                    271:                temp[0] = n & BYTEMASK;
                    272:                temp[1] = n >> BYTE;
                    273:                temp[2] = 0;
                    274:                ptfpcmd(0, temp);
                    275:                return(outsize);
                    276:        }
                    277:        if (sfbits(i) == oldbits) {
                    278:                xfont = pfont;
                    279:                xpts = ppts;
                    280:        } else 
                    281:                xbits(i, 2);
                    282:        if (k == XON) {
                    283:                if (esc)
                    284:                        ptesc();
                    285:                if (xfont != mfont)
                    286:                        ptfont();
                    287:                if (xpts != mpts)
                    288:                        ptps();
                    289:                if (lead)
                    290:                        ptlead();
                    291:                fdprintf(ptid, "x X ");
                    292:                for (j = 1; cbits(pi[j]) != XOFF; j++)
                    293:                        outascii(pi[j]);
                    294:                oput('\n');
                    295:                return j+1;
                    296:        }
                    297:        if (k < 040 && k != DRAWFCN)
                    298:                return(outsize);
                    299:        j = z = 0;
                    300:        if (k != DRAWFCN) {
                    301:                if (widcache[k-32].fontpts == (xfont<<8) + xpts  && !setwdf) {
                    302:                        w = widcache[k-32].width;
                    303:                        bd = 0;
                    304:                        cs = 0;
                    305:                } else
                    306:                        w = getcw(k-32);
                    307:                if (cs) {
                    308:                        if (bd)
                    309:                                w += (bd - 1) * HOR;
                    310:                        j = (cs - w) / 2;
                    311:                        w = cs - j;
                    312:                        if (bd)
                    313:                                w -= (bd - 1) * HOR;
                    314:                }
                    315:                if (iszbit(i)) {
                    316:                        if (cs)
                    317:                                w = -j; 
                    318:                        else 
                    319:                                w = 0;
                    320:                        z = 1;
                    321:                }
                    322:        }
                    323:        esc += j;
                    324:        if (xfont != mfont)
                    325:                ptfont();
                    326:        if (xpts != mpts)
                    327:                ptps();
                    328:        if (lead)
                    329:                ptlead();
                    330:        /* put out the real character here */
                    331:        if (k == DRAWFCN) {
                    332:                if (esc)
                    333:                        ptesc();
                    334:                w = 0;
                    335:                dx = absmot(pi[3]);
                    336:                if (isnmot(pi[3]))
                    337:                        dx = -dx;
                    338:                dy = absmot(pi[4]);
                    339:                if (isnmot(pi[4]))
                    340:                        dy = -dy;
                    341:                switch (cbits(pi[1])) {
                    342:                case DRAWCIRCLE:        /* circle */
                    343:                        fdprintf(ptid, "D%c %d\n", DRAWCIRCLE, dx);     /* dx is diameter */
                    344:                        hpos += dx;
                    345:                        break;
                    346:                case DRAWELLIPSE:
                    347:                        fdprintf(ptid, "D%c %d %d\n", DRAWELLIPSE, dx, dy);
                    348:                        hpos += dx;
                    349:                        break;
                    350:                case DRAWLINE:  /* line */
                    351:                        k = cbits(pi[2]);
                    352:                        fdprintf(ptid, "D%c %d %d ", DRAWLINE, dx, dy);
                    353:                        if (k < 128)
                    354:                                fdprintf(ptid, "%c\n", k);
                    355:                        else
                    356:                                fdprintf(ptid, "%s\n", &chname[chtab[k - 128]]);
                    357:                        hpos += dx;
                    358:                        vpos += dy;
                    359:                        break;
                    360:                case DRAWARC:   /* arc */
                    361:                        dx2 = absmot(pi[5]);
                    362:                        if (isnmot(pi[5]))
                    363:                                dx2 = -dx2;
                    364:                        dy2 = absmot(pi[6]);
                    365:                        if (isnmot(pi[6]))
                    366:                                dy2 = -dy2;
                    367:                        fdprintf(ptid, "D%c %d %d %d %d\n", DRAWARC,
                    368:                                dx, dy, dx2, dy2);
                    369:                        hpos += dx + dx2;
                    370:                        vpos += dy + dy2;
                    371:                        break;
                    372:                case DRAWSPLINE:        /* spline */
                    373:                default:        /* something else; copy it like spline */
                    374:                        fdprintf(ptid, "D%c %d %d", cbits(pi[1]), dx, dy);
                    375:                        hpos += dx;
                    376:                        vpos += dy;
                    377:                        if (cbits(pi[3]) == DRAWFCN || cbits(pi[4]) == DRAWFCN) {
                    378:                                /* it was somehow defective */
                    379:                                fdprintf(ptid, "\n");
                    380:                                break;
                    381:                        }
                    382:                        for (n = 5; cbits(pi[n]) != DRAWFCN; n += 2) {
                    383:                                dx = absmot(pi[n]);
                    384:                                if (isnmot(pi[n]))
                    385:                                        dx = -dx;
                    386:                                dy = absmot(pi[n+1]);
                    387:                                if (isnmot(pi[n+1]))
                    388:                                        dy = -dy;
                    389:                                fdprintf(ptid, " %d %d", dx, dy);
                    390:                                hpos += dx;
                    391:                                vpos += dy;
                    392:                        }
                    393:                        fdprintf(ptid, "\n");
                    394:                        break;
                    395:                }
                    396:                for (n = 3; cbits(pi[n]) != DRAWFCN; n++)
                    397:                        ;
                    398:                outsize = n + 1;
                    399:        } else if (k < 128) {
                    400:                /* try to go faster and compress output */
                    401:                /* by printing nnc for small positive motion followed by c */
                    402:                /* kludgery; have to make sure set all the vars too */
                    403:                if (esc > 0 && esc < 100) {
                    404:                        oput(esc / 10 + '0');
                    405:                        oput(esc % 10 + '0');
                    406:                        oput(k);
                    407:                        hpos += esc;
                    408:                        esc = 0;
                    409:                } else {
                    410:                        if (esc)
                    411:                                ptesc();
                    412:                        oput('c');
                    413:                        oput(k);
                    414:                        oput('\n');
                    415:                }
                    416:        } else {
                    417:                if (esc)
                    418:                        ptesc();
                    419:                if (k >= nchtab + 128)
                    420:                        fdprintf(ptid, "N%d\n", k - (nchtab+128));
                    421:                else
                    422:                        fdprintf(ptid, "C%s\n", &chname[chtab[k - 128]]);
                    423:        }
                    424:        if (bd) {
                    425:                bd -= HOR;
                    426:                if (esc += bd)
                    427:                        ptesc();
                    428:                if (k < 128) {
                    429:                        fdprintf(ptid, "c%c\n", k);
                    430:                } else if (k >= nchtab + 128) {
                    431:                        fdprintf(ptid, "N%d\n", k - (nchtab+128));
                    432:                } else
                    433:                        fdprintf(ptid, "C%s\n", &chname[chtab[k - 128]]);
                    434:                if (z)
                    435:                        esc -= bd;
                    436:        }
                    437:        esc += w;
                    438:        return(outsize);
                    439: }
                    440: 
                    441: ptps()
                    442: {
                    443:        register i, j, k;
                    444: 
                    445:        i = xpts;
                    446:        for (j = 0; i > (k = pstab[j]); j++)
                    447:                if (!k) {
                    448:                        k = pstab[--j];
                    449:                        break;
                    450:                }
                    451:        fdprintf(ptid, "s%d\n", k);     /* really should put out string rep of size */
                    452:        mpts = i;
                    453: }
                    454: 
                    455: ptfont()
                    456: {
                    457:        mfont = xfont;
                    458:        fdprintf(ptid, "f%d\n", xfont);
                    459: }
                    460: 
                    461: ptfpcmd(f, s)
                    462: int    f;
                    463: char   *s;
                    464: {
                    465:        if (ascii)
                    466:                return;
                    467:        fdprintf(ptid, "x font %d %s\n", f, s);
                    468:        ptfont();       /* make sure that it gets noticed */
                    469: }
                    470: 
                    471: ptlead()
                    472: {
                    473:        vpos += lead;
                    474:        if (!ascii)
                    475:                fdprintf(ptid, "V%d\n", vpos);
                    476:        lead = 0;
                    477: }
                    478: 
                    479: ptesc()
                    480: {
                    481:        hpos += esc;
                    482:        if (esc > 0) {
                    483:                oput('h');
                    484:                if (esc>=10 && esc<100) {
                    485:                        oput(esc/10 + '0');
                    486:                        oput(esc%10 + '0');
                    487:                } else
                    488:                        fdprintf(ptid, "%d", esc);
                    489:        } else
                    490:                fdprintf(ptid, "H%d\n", hpos);
                    491:        esc = 0;
                    492: }
                    493: 
                    494: newpage(n)     /* called at end of each output page (we hope) */
                    495: {
                    496:        int i;
                    497:        char temp[20];
                    498: 
                    499:        ptlead();
                    500:        vpos = 0;
                    501:        if (ascii)
                    502:                return;
                    503:        fdprintf(ptid, "p%d\n", n);     /* new page */
                    504:        for (i = 0; i <= nfonts; i++)
                    505:                if (fontbase[i] && fontbase[i]->namefont[0]) {
                    506:                        /* long names not terminated in dev.h; 10 is size! */
                    507:                        strncpy(temp, fontbase[i]->namefont, 10);
                    508:                        fdprintf(ptid, "x font %d %s\n", i, temp);
                    509:                }
                    510:        ptps();
                    511:        ptfont();
                    512: }
                    513: 
                    514: pttrailer()
                    515: {
                    516:        fdprintf(ptid, "x trailer\n");
                    517: }
                    518: 
                    519: ptstop()
                    520: {
                    521:        fdprintf(ptid, "x stop\n");
                    522: }
                    523: 
                    524: dostop()
                    525: {
                    526:        if (ascii)
                    527:                return;
                    528:        ptlead();
                    529:        vpos = 0;
                    530:        /* fdprintf(ptid, "x xxx end of page\n");*/
                    531:        if (!nofeed)
                    532:                pttrailer();
                    533:        ptlead();
                    534:        fdprintf(ptid, "x pause\n");
                    535:        flusho();
                    536:        mpts = mfont = 0;
                    537:        ptesc();
                    538:        esc = po;
                    539:        hpos = vpos = 0;        /* probably in wrong place */
                    540: }

unix.superglobalmegacorp.com

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