Annotation of researchv10no/cmd/troff/Old/t10.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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