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

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

unix.superglobalmegacorp.com

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