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

1.1       root        1: /*
                      2:  *     drive 4014 scope
                      3:  */
                      4: 
                      5: /*
                      6: output language from troff:
                      7: all numbers are character strings
                      8: 
                      9: sn     size in points
                     10: fn     font as number from 1-n
                     11: cx     ascii character x
                     12: Cxyz   funny char xyz. terminated by white space
                     13: Hn     go to absolute horizontal position n
                     14: Vn     go to absolute vertical position n (down is positive)
                     15: hn     go n units horizontally (relative)
                     16: vn     ditto vertically
                     17: nnc    move right nn, then print c (exactly 2 digits!)
                     18:                (this wart is an optimization that shrinks output file size
                     19:                 about 35% and run-time about 15% while preserving ascii-ness)
                     20: Dt ...\n       draw operation 't':
                     21:        Dl x y          line from here by x,y
                     22:        Dc d            circle of diameter d with left side here
                     23:        De x y          ellipse of axes x,y with left side here
                     24:        Da x y r        arc counter-clockwise by x,y of radius r
                     25:        D~ x y x y ...  wiggly line by x,y then x,y ...
                     26: nb a   end of line (information only -- no action needed)
                     27:        b = space before line, a = after
                     28: p      new page begins -- set v to 0
                     29: #...\n comment
                     30: x ...\n        device control functions:
                     31:        x i     init
                     32:        x T s   name of device is s
                     33:        x r n h v       resolution is n/inch
                     34:                h = min horizontal motion, v = min vert
                     35:        x p     pause (can restart)
                     36:        x s     stop -- done for ever
                     37:        x t     generate trailer
                     38:        x f n s font position n contains font s
                     39:        x H n   set character height to n
                     40:        x S n   set slant to N
                     41: 
                     42:        Subcommands like "i" are often spelled out like "init".
                     43: */
                     44: 
                     45: #include       <stdio.h>
                     46: #include       <signal.h>
                     47: #include       <ctype.h>
                     48: 
                     49: #include "dev.h"
                     50: #define        NFONT   10
                     51: 
                     52: int    output  = 0;    /* do we do output at all? */
                     53: int    nolist  = 0;    /* output page list if > 0 */
                     54: int    olist[20];      /* pairs of page numbers */
                     55: 
                     56: int    erase   = 1;
                     57: float  aspect  = 1.5;  /* default aspect ratio */
                     58: int    (*sigint)();
                     59: int    (*sigquit)();
                     60: 
                     61: struct dev dev;
                     62: struct font *fontbase[NFONT];
                     63: short  psizes[]        ={ 11, 16, 22, 36, 0};  /* approx sizes available */
                     64: short  *pstab          = psizes;
                     65: int    nsizes  = 4;
                     66: int    pscode[]        ={ ';', ':', '9', '8'};
                     67: int    nfonts;
                     68: int    smnt;   /* index of first special font */
                     69: int    nchtab;
                     70: char   *chname;
                     71: short  *chtab;
                     72: char   *fitab[NFONT];
                     73: char   *widthtab[NFONT];       /* widtab would be a better name */
                     74: char   *codetab[NFONT];        /* device codes */
                     75: 
                     76: #define        FATAL   1
                     77: #define        BMASK   0377
                     78: int    keepon  = 0;
                     79: int    dbg     = 0;
                     80: long   lineno  = 0;
                     81: int    res     = 972;          /* input assumed computed according to this resolution */
                     82:                                /* initial value to avoid 0 divide */
                     83: FILE   *tf     = stdout;       /* output file */
                     84: char   *fontdir        = "/usr/lib/font";
                     85: extern char devname[];
                     86: 
                     87: FILE *fp       = stdin;        /* input file pointer */
                     88: 
                     89: main(argc, argv)
                     90: char *argv[];
                     91: {
                     92:        char buf[BUFSIZ];
                     93:        float atof();
                     94:        int done();
                     95: 
                     96:        setbuf(stdout, buf);
                     97:        while (argc > 1 && argv[1][0] == '-') {
                     98:                switch (argv[1][1]) {
                     99:                case 'T':
                    100:                        if (strcmp(&argv[1][2], "cat") == 0) {  /* use the old one */
                    101:                                if (fork() == 0) {
                    102:                                        execv("/usr/bin/oldtc", argv);
                    103:                                        fprintf(stderr, "tc: can't find oldtc\n");
                    104:                                }
                    105:                                wait();
                    106:                                exit(1);
                    107:                        }
                    108:                        break;
                    109:                case 'a':
                    110:                        aspect = atof(&argv[1][2]);
                    111:                        break;
                    112:                case 'e':
                    113:                        erase = 0;
                    114:                        break;
                    115:                case 'o':
                    116:                        outlist(&argv[1][2]);
                    117:                        break;
                    118:                case 'd':
                    119:                        dbg = atoi(&argv[1][2]);
                    120:                        if (dbg == 0) dbg = 1;
                    121:                        break;
                    122:                case 'c':
                    123:                        keepon = 1;
                    124:                        break;
                    125:                }
                    126:                argc--;
                    127:                argv++;
                    128:        }
                    129: 
                    130:        sigint = signal(SIGINT, done);
                    131:        sigquit = signal(SIGQUIT, SIG_IGN);
                    132:        if (argc <= 1)
                    133:                conv(stdin);
                    134:        else
                    135:                while (--argc > 0) {
                    136:                        if (strcmp(*++argv, "-") == 0)
                    137:                                fp = stdin;
                    138:                        else if ((fp = fopen(*argv, "r")) == NULL)
                    139:                                error(FATAL, "can't open %s", *argv);
                    140:                        conv(fp);
                    141:                        fclose(fp);
                    142:                }
                    143:        done();
                    144: }
                    145: 
                    146: outlist(s)     /* process list of page numbers to be printed */
                    147: char *s;
                    148: {
                    149:        int n1, n2, i;
                    150: 
                    151:        nolist = 0;
                    152:        while (*s) {
                    153:                n1 = 0;
                    154:                if (isdigit(*s))
                    155:                        do
                    156:                                n1 = 10 * n1 + *s++ - '0';
                    157:                        while (isdigit(*s));
                    158:                else
                    159:                        n1 = -9999;
                    160:                n2 = n1;
                    161:                if (*s == '-') {
                    162:                        s++;
                    163:                        n2 = 0;
                    164:                        if (isdigit(*s))
                    165:                                do
                    166:                                        n2 = 10 * n2 + *s++ - '0';
                    167:                                while (isdigit(*s));
                    168:                        else
                    169:                                n2 = 9999;
                    170:                }
                    171:                olist[nolist++] = n1;
                    172:                olist[nolist++] = n2;
                    173:                if (*s != '\0')
                    174:                        s++;
                    175:        }
                    176:        olist[nolist] = 0;
                    177:        if (dbg)
                    178:                for (i=0; i<nolist; i += 2)
                    179:                        printf("%3d %3d\n", olist[i], olist[i+1]);
                    180: }
                    181: 
                    182: in_olist(n)    /* is n in olist? */
                    183: int n;
                    184: {
                    185:        int i;
                    186: 
                    187:        if (nolist == 0)
                    188:                return(1);      /* everything is included */
                    189:        for (i = 0; i < nolist; i += 2)
                    190:                if (n >= olist[i] && n <= olist[i+1])
                    191:                        return(1);
                    192:        return(0);
                    193: }
                    194: 
                    195: conv(fp)
                    196: register FILE *fp;
                    197: {
                    198:        register int c, k;
                    199:        int m, n, i, n1, m1;
                    200:        char str[100], buf[300];
                    201: 
                    202:        while ((c = getc(fp)) != EOF) {
                    203:                switch (c) {
                    204:                case '\n':      /* when input is text */
                    205:                        lineno++;
                    206:                case ' ':
                    207:                case 0:         /* occasional noise creeps in */
                    208:                        break;
                    209:                case '{':       /* push down current environment */
                    210:                        t_push();
                    211:                        break;
                    212:                case '}':
                    213:                        t_pop();
                    214:                        break;
                    215:                case '0': case '1': case '2': case '3': case '4':
                    216:                case '5': case '6': case '7': case '8': case '9':
                    217:                        /* two motion digits plus a character */
                    218:                        hmot((c-'0')*10 + getc(fp)-'0');
                    219:                        put1(getc(fp));
                    220:                        break;
                    221:                case 'c':       /* single ascii character */
                    222:                        put1(getc(fp));
                    223:                        break;
                    224:                case 'C':
                    225:                        fscanf(fp, "%s", str);
                    226:                        put1s(str);
                    227:                        break;
                    228:                case 't':       /* straight text */
                    229:                        fgets(buf, sizeof(buf), fp);
                    230:                        lineno++;
                    231:                        t_text(buf);
                    232:                        break;
                    233:                case 'D':       /* draw function */
                    234:                        fgets(buf, sizeof(buf), fp);
                    235:                        lineno++;
                    236:                        switch (buf[0]) {
                    237:                        case 'l':       /* draw a line */
                    238:                                sscanf(buf+1, "%d %d", &n, &m);
                    239:                                drawline(n, m, ".");
                    240:                                break;
                    241:                        case 'c':       /* circle */
                    242:                                sscanf(buf+1, "%d", &n);
                    243:                                drawcirc(n);
                    244:                                break;
                    245:                        case 'e':       /* ellipse */
                    246:                                sscanf(buf+1, "%d %d", &m, &n);
                    247:                                drawellip(m, n);
                    248:                                break;
                    249:                        case 'a':       /* arc */
                    250:                                sscanf(buf+1, "%d %d %d %d", &n, &m, &n1, &m1);
                    251:                                drawarc(n, m, n1, m1);
                    252:                                break;
                    253:                        case '~':       /* wiggly line */
                    254:                                drawwig(buf+1);
                    255:                                break;
                    256:                        default:
                    257:                                error(FATAL, "unknown drawing function %s\n", buf);
                    258:                                break;
                    259:                        }
                    260:                        break;
                    261:                case 's':
                    262:                        fscanf(fp, "%d", &n);   /* ignore fractional sizes */
                    263:                        setsize(t_size(n));
                    264:                        break;
                    265:                case 'f':
                    266:                        fscanf(fp, "%s", str);
                    267:                        setfont(t_font(str));
                    268:                        break;
                    269:                case 'H':       /* absolute horizontal motion */
                    270:                        /* fscanf(fp, "%d", &n); */
                    271:                        while ((c = getc(fp)) == ' ')
                    272:                                ;
                    273:                        k = 0;
                    274:                        do {
                    275:                                k = 10 * k + c - '0';
                    276:                        } while (isdigit(c = getc(fp)));
                    277:                        ungetc(c, fp);
                    278:                        hgoto(k);
                    279:                        break;
                    280:                case 'h':       /* relative horizontal motion */
                    281:                        /* fscanf(fp, "%d", &n); */
                    282:                        while ((c = getc(fp)) == ' ')
                    283:                                ;
                    284:                        k = 0;
                    285:                        do {
                    286:                                k = 10 * k + c - '0';
                    287:                        } while (isdigit(c = getc(fp)));
                    288:                        ungetc(c, fp);
                    289:                        hmot(k);
                    290:                        break;
                    291:                case 'w':       /* word space */
                    292:                        break;
                    293:                case 'V':
                    294:                        fscanf(fp, "%d", &n);
                    295:                        vgoto(n);
                    296:                        break;
                    297:                case 'v':
                    298:                        fscanf(fp, "%d", &n);
                    299:                        vmot(n);
                    300:                        break;
                    301:                case 'p':       /* new page */
                    302:                        fscanf(fp, "%d", &n);
                    303:                        t_page(n);
                    304:                        break;
                    305:                case 'n':       /* end of line */
                    306:                        while (getc(fp) != '\n')
                    307:                                ;
                    308:                        t_newline();
                    309:                        break;
                    310:                case '#':       /* comment */
                    311:                        while (getc(fp) != '\n')
                    312:                                ;
                    313:                        lineno++;
                    314:                        break;
                    315:                case 'x':       /* device control */
                    316:                        devcntrl(fp);
                    317:                        lineno++;
                    318:                        break;
                    319:                default:
                    320:                        error(!FATAL, "unknown input character %o %c\n", c, c);
                    321:                        while (getc(fp) != '\n')
                    322:                                ;
                    323:                }
                    324:        }
                    325: }
                    326: 
                    327: devcntrl(fp)   /* interpret device control functions */
                    328: FILE *fp;
                    329: {
                    330:        char str[20];
                    331:        int c, n;
                    332: 
                    333:        fscanf(fp, "%s", str);
                    334:        switch (str[0]) {       /* crude for now */
                    335:        case 'i':       /* initialize */
                    336:                fileinit();
                    337:                t_init(0);
                    338:                break;
                    339:        case 'T':       /* device name */
                    340:                fscanf(fp, "%s", devname);
                    341:                break;
                    342:        case 't':       /* trailer */
                    343:                t_trailer();
                    344:                break;
                    345:        case 'p':       /* pause -- can restart */
                    346:                t_reset('p');
                    347:                break;
                    348:        case 's':       /* stop */
                    349:                t_reset('s');
                    350:                break;
                    351:        case 'r':       /* resolution assumed when prepared */
                    352:                fscanf(fp, "%d", &res);
                    353:                break;
                    354:        case 'f':       /* font used */
                    355:                fscanf(fp, "%d %s", &n, str);
                    356:                loadfont(n, str);
                    357:                break;
                    358:        }
                    359:        while (getc(fp) != '\n')        /* skip rest of input line */
                    360:                ;
                    361: }
                    362: 
                    363: fileinit()     /* read in font and code files, etc. */
                    364: {
                    365: }
                    366: 
                    367: fontprint(i)   /* debugging print of font i (0,...) */
                    368: {
                    369: }
                    370: 
                    371: loadcode(n, nw)        /* load codetab on position n (0...); #chars is nw */
                    372: int n, nw;
                    373: {
                    374: }
                    375: 
                    376: loadfont(n, s) /* load font info for font s on position n (1...) */
                    377: int n;
                    378: char *s;
                    379: {
                    380: }
                    381: 
                    382: #define        ESC     033
                    383: #define        MAXY    (3071-100)
                    384: #define        US      037     /* text mode */
                    385: #define        GS      035     /* graphics mode */
                    386: #define        FF      014
                    387: 
                    388: error(f, s, a1, a2, a3, a4, a5, a6, a7) {
                    389:        fprintf(stderr, "%c%c%c", US, ESC, ';');        /* reset terminal sensibly */
                    390:        fprintf(stderr, "tc: ");
                    391:        fprintf(stderr, s, a1, a2, a3, a4, a5, a6, a7);
                    392:        fprintf(stderr, " near line %ld\n", lineno);
                    393:        if (f)
                    394:                done(2);
                    395: }
                    396: 
                    397: 
                    398: /*
                    399:        Here beginneth all the stuff that really depends
                    400:        on the 202 (we hope).
                    401: */
                    402: 
                    403: 
                    404: char   devname[20]     = "4014";
                    405: 
                    406: #define        oput(c) if (output) putchar(c); else;
                    407: 
                    408: int    stopped = 0;
                    409: int    ohx     = -1;
                    410: int    ohy     = -1;
                    411: int    oxb     = -1;
                    412: int    oly     = -1;
                    413: int    olx     = -1;
                    414: int    skip;
                    415: int    size    = 1;
                    416: int    font    = 1;            /* current font */
                    417: int    hpos;           /* horizontal position where we are supposed to be next (left = 0) */
                    418: int    vpos;           /* current vertical position (down positive) */
                    419: 
                    420: int    horig;          /* h origin of current block; hpos rel to this */
                    421: int    vorig;          /* v origin of current block; vpos rel to this */
                    422: 
                    423: int    DX      = 10;   /* step size in x for drawing */
                    424: int    DY      = 10;   /* step size in y for drawing */
                    425: int    drawdot = '.';  /* draw with this character */
                    426: int    drawsize = 1;   /* shrink by this factor when drawing */
                    427: 
                    428: t_init(reinit) /* initialize device */
                    429: int reinit;
                    430: {
                    431:        fflush(stdout);
                    432:        stopped = 0;
                    433:        if (erase) {
                    434:                oput(ESC);
                    435:                oput(FF);
                    436:                oput(US);
                    437:        }
                    438:        hpos = vpos = 0;
                    439:        setsize(t_size(10));    /* start somewhere */
                    440:        sendpt();
                    441: }
                    442: 
                    443: #define        MAXSTATE        5
                    444: 
                    445: struct state {
                    446:        int     ssize;
                    447:        int     sfont;
                    448:        int     shpos;
                    449:        int     svpos;
                    450:        int     shorig;
                    451:        int     svorig;
                    452: };
                    453: struct state   state[MAXSTATE];
                    454: struct state   *statep = state;
                    455: 
                    456: t_push()       /* begin a new block */
                    457: {
                    458:        hflush();
                    459:        statep->ssize = size;
                    460:        statep->sfont = font;
                    461:        statep->shorig = horig;
                    462:        statep->svorig = vorig;
                    463:        statep->shpos = hpos;
                    464:        statep->svpos = vpos;
                    465:        horig = hpos;
                    466:        vorig = vpos;
                    467:        hpos = vpos = 0;
                    468:        if (statep++ >= state+MAXSTATE)
                    469:                error(FATAL, "{ nested too deep");
                    470:        hpos = vpos = 0;
                    471: }
                    472: 
                    473: t_pop()        /* pop to previous state */
                    474: {
                    475:        if (--statep < state)
                    476:                error(FATAL, "extra }");
                    477:        size = statep->ssize;
                    478:        font = statep->sfont;
                    479:        hpos = statep->shpos;
                    480:        vpos = statep->svpos;
                    481:        horig = statep->shorig;
                    482:        vorig = statep->svorig;
                    483: }
                    484: 
                    485: int    np;     /* number of pages seen */
                    486: int    npmax;  /* high-water mark of np */
                    487: int    pgnum[100];     /* their actual numbers */
                    488: long   pgadr[100];     /* their seek addresses */
                    489: 
                    490: t_page(n)      /* do whatever new page functions */
                    491: {
                    492:        long ftell();
                    493:        int c, m, i;
                    494:        char buf[100], *bp;
                    495: 
                    496:        pgnum[np++] = n;
                    497:        pgadr[np] = ftell(fp);
                    498:        if (np > npmax)
                    499:                npmax = np;
                    500:        if (output == 0) {
                    501:                output = in_olist(n);
                    502:                t_init(1);
                    503:                return;
                    504:        }
                    505:        /* have just printed something, and seen p<n> for next one */
                    506:        vgoto(11 * res - 100);
                    507:        sendpt();
                    508:        oput(US);
                    509:        fflush(stdout);
                    510: 
                    511: 
                    512:        if (keepon) {
                    513:                t_init(1);
                    514:                return;
                    515:        }
                    516:   next:
                    517:        for (bp = buf; (*bp = readch()); )
                    518:                if (*bp++ == '\n')
                    519:                        break;
                    520:        *bp = 0;
                    521:        switch (buf[0]) {
                    522:        case 0:
                    523:                done();
                    524:                break;
                    525:        case '\n':
                    526:                if (stopped)
                    527:                        done();
                    528:                output = in_olist(n);
                    529:                t_init(1);
                    530:                return;
                    531:        case '!':
                    532:                callunix(&buf[1]);
                    533:                fputs("!\n", stderr);
                    534:                break;
                    535:        case 'e':
                    536:                erase = 1 - erase;
                    537:                break;
                    538:        case 'a':
                    539:                aspect = atof(&buf[1]);
                    540:                break;
                    541:        case '-':
                    542:        case 'p':
                    543:                m = atoi(&buf[1]) + 1;
                    544:                if (fp == stdin) {
                    545:                        fputs("you can't; it's not a file\n", stderr);
                    546:                        break;
                    547:                }
                    548:                if (np - m <= 0) {
                    549:                        fputs("too far back\n", stderr);
                    550:                        break;
                    551:                }
                    552:                np -= m;
                    553:                fseek(fp, pgadr[np], 0);
                    554:                output = 1;
                    555:                t_init(1);
                    556:                return;
                    557:        case '0': case '1': case '2': case '3': case '4':
                    558:        case '5': case '6': case '7': case '8': case '9':
                    559:                m = atoi(&buf[0]);
                    560:                for (i = 0; i < npmax; i++)
                    561:                        if (m == pgnum[i])
                    562:                                break;
                    563:                if (i >= npmax || fp == stdin) {
                    564:                        fputs("you can't\n", stderr);
                    565:                        break;
                    566:                }
                    567:                np = i + 1;
                    568:                fseek(fp, pgadr[np], 0);
                    569:                output = 1;
                    570:                t_init(1);
                    571:                return;
                    572:        case 'o':
                    573:                outlist(&buf[1]);
                    574:                output = 0;
                    575:                t_init(1);
                    576:                return;
                    577:        case '?':
                    578:                fputs("!cmd     unix cmd\n", stderr);
                    579:                fputs("p        print this page again\n", stderr);
                    580:                fputs("-n       go back n pages\n", stderr);
                    581:                fputs("n        print page n (previously printed)\n", stderr);
                    582:                fputs("o...     set the -o output list to ...\n", stderr);
                    583:                fputs("en       n=0 -> don't erase; n=1 -> erase\n", stderr);
                    584:                fputs("an       sets aspect ratio to n\n", stderr);
                    585:                break;
                    586:        default:
                    587:                fputs("?\n", stderr);
                    588:                break;
                    589:        }
                    590:        goto next;
                    591: }
                    592: 
                    593: t_newline()    /* do whatever for the end of a line */
                    594: {
                    595:        hpos = 0;
                    596: }
                    597: 
                    598: t_size(n)      /* convert integer to internal size number*/
                    599: int n;
                    600: {
                    601:        int i;
                    602: 
                    603:        if (n <= pstab[0])
                    604:                return(1);
                    605:        else if (n >= pstab[nsizes-1])
                    606:                return(nsizes);
                    607:        for (i = 0; n > pstab[i]; i++)
                    608:                ;
                    609:        return(i+1);
                    610: }
                    611: 
                    612: t_font(s)      /* convert string to internal font number */
                    613: char *s;
                    614: {
                    615:        int n;
                    616: 
                    617:        n = atoi(s);
                    618:        if (n < 1 || n > nfonts)
                    619:                n = 1;
                    620:        return(n);
                    621: }
                    622: 
                    623: t_text(s)      /* print string s as text */
                    624: char *s;
                    625: {
                    626:        int c, w;
                    627:        char str[100];
                    628: 
                    629:        if (!output)
                    630:                return;
                    631:        w = res / 2 * pstab[size-1] / 72;
                    632:        while ((c = *s++) != '\n') {
                    633:                if (c == '\\') {
                    634:                        switch (c = *s++) {
                    635:                        case '\\':
                    636:                        case 'e':
                    637:                                put1('\\');
                    638:                                break;
                    639:                        case '(':
                    640:                                str[0] = *s++;
                    641:                                str[1] = *s++;
                    642:                                str[2] = '\0';
                    643:                                put1s(str);
                    644:                                break;
                    645:                        }
                    646:                } else {
                    647:                        put1(c);
                    648:                }
                    649:                hmot(w);
                    650:        }
                    651: }
                    652: 
                    653: t_reset(c)
                    654: {
                    655:        int n;
                    656: 
                    657:        output = 1;
                    658:        fflush(stdout);
                    659:        if (c == 's') {
                    660:                stopped = 1;
                    661:                t_page(9999);
                    662:        }
                    663: }
                    664: 
                    665: t_trailer()
                    666: {
                    667: }
                    668: 
                    669: hgoto(n)
                    670: {
                    671:        hpos = n;       /* this is where we want to be */
                    672:                        /* before printing a character, */
                    673:                        /* have to make sure it's true */
                    674: }
                    675: 
                    676: hmot(n)        /* generate n units of horizontal motion */
                    677: int n;
                    678: {
                    679:        hgoto(hpos + n);
                    680: }
                    681: 
                    682: hflush()       /* actual horizontal output occurs here */
                    683: {
                    684:        if (output)
                    685:                sendpt();
                    686: }
                    687: 
                    688: vgoto(n)
                    689: {
                    690:        vpos = n;
                    691: }
                    692: 
                    693: vmot(n)        /* generate n units of vertical motion */
                    694: int n;
                    695: {
                    696:        vgoto(vpos + n);        /* ignores rounding */
                    697: }
                    698: 
                    699: put1s(s)       /* s is a funny char name */
                    700: char *s;
                    701: {
                    702:        int i;
                    703:        char *p;
                    704:        extern char *spectab[];
                    705:        static char prev[10] = "";
                    706:        static int previ;
                    707: 
                    708:        if (!output)
                    709:                return;
                    710:        if (strcmp(s, prev) != 0) {
                    711:                previ = -1;
                    712:                for (i = 0; spectab[i] != 0; i += 2)
                    713:                        if (strcmp(spectab[i], s) == 0) {
                    714:                                strcpy(prev, s);
                    715:                                previ = i;
                    716:                                break;
                    717:                        }
                    718:        }
                    719:        if (previ >= 0) {
                    720:                hflush();
                    721:                oput(US);
                    722:                for (p = spectab[previ+1]; *p; p++)
                    723:                        oput(*p);
                    724:        } else
                    725:                prev[0] = 0;
                    726: }
                    727: 
                    728: put1(c)        /* output char c */
                    729: int c;
                    730: {
                    731:        if (!output)
                    732:                return;
                    733:        hflush();
                    734:        oput(US);
                    735:        oput(c);
                    736: }
                    737: 
                    738: setsize(n)     /* set point size to n (internal) */
                    739: int n;
                    740: {
                    741: 
                    742:        if (!output)
                    743:                return;
                    744:        if (n == size)
                    745:                return; /* already there */
                    746:        oput(ESC);
                    747:        oput(pscode[n-1]);
                    748:        size = n;
                    749: }
                    750: 
                    751: t_fp(n, s)     /* font position n now contains font s */
                    752: int n;
                    753: char *s;
                    754: {
                    755: }
                    756: 
                    757: setfont(n)     /* set font to n */
                    758: int n;
                    759: {
                    760: }
                    761: 
                    762: done()
                    763: {
                    764:        output = 1;
                    765:        hgoto(0);
                    766:        vgoto(11 * res - 100);  /* bottom of page */
                    767:        sendpt();
                    768:        oput(US);
                    769:        oput(ESC);
                    770:        oput(';');
                    771:        oput(US);
                    772:        fflush(stdout);
                    773:        exit(0);
                    774: }
                    775: 
                    776: callunix(line)
                    777: char line[];
                    778: {
                    779:        int rc, status, unixpid;
                    780:        if( (unixpid=fork())==0 ) {
                    781:                signal(SIGINT,sigint); signal(SIGQUIT,sigquit);
                    782:                close(0); dup(2);
                    783:                execl("/bin/sh", "-sh", "-c", line, 0);
                    784:                exit(255);
                    785:        }
                    786:        else if(unixpid == -1)
                    787:                return;
                    788:        else{   signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN);
                    789:                while( (rc = wait(&status)) != unixpid && rc != -1 ) ;
                    790:                signal(SIGINT, done); signal(SIGQUIT,sigquit);
                    791:        }
                    792: }
                    793: readch(){
                    794:        char c;
                    795:        if (read(2,&c,1)<1) c=0;
                    796:        return(c);
                    797: }
                    798: sendpt(){
                    799:        int hy,xb,ly,hx,lx;
                    800:        int xx, yy;
                    801:        float fx, fy;
                    802: 
                    803: 
                    804:        fx = hpos + horig;
                    805:        fy = vpos + vorig;
                    806:        xx = (fx * MAXY / 11) / res * aspect + 0.5;
                    807:        yy = MAXY - (fy * MAXY / 11) / res + 0.5;
                    808:        oput(GS);
                    809:        hy = ((yy>>7) & 037);
                    810:        xb = ((xx & 03) + ((yy<<2) & 014) & 017);
                    811:        ly = ((yy>>2) & 037);
                    812:        hx = ((xx>>7) & 037);
                    813:        lx = ((xx>>2) & 037);
                    814:        if(hy != ohy)oput(hy | 040);
                    815:        if(xb != oxb)oput(xb | 0140);
                    816:        if((ly != oly) || (hx != ohx) || (xb != oxb))
                    817:                oput(ly | 0140);
                    818:        if(hx != ohx)oput(hx | 040);
                    819:        oput(lx | 0100);
                    820:        ohy = hy;
                    821:        oxb = xb;
                    822:        oly = ly;
                    823:        ohx = hx;
                    824:        olx = lx;
                    825: }
                    826: 
                    827: char *spectab[] ={
                    828:        "em", "--",
                    829:        "en", "-",
                    830:        "hy", "-",
                    831:        "ff", "ff",
                    832:        "fi", "fi",
                    833:        "fl", "fl",
                    834:        "Fi", "ffi",
                    835:        "Fl", "ffl",
                    836:        "ct", "\033\016Z\bM\033\017",   /*cent sign*/
                    837:        "de", "\033\016J\033\017",      /*degree*/
                    838:        "dg", "\033\016M\b_\033\017",   /*dagger*/
                    839:        "rg", "\033\016O\b&\033\017",   /*registered*/
                    840:        "bu", "\033\016O\b~\033\017",   /*bullet*/
                    841:        "fm", "'",
                    842:        "co", "\033\016O\b#\033\017",   /*copyright*/
                    843:        "sq", "\033\016L\033\017",      /*square*/
                    844:        "*q", "\033\016(\bM\033\017",   /*psi*/
                    845:        "*h", "\033\016o\b_\033\017",   /*theta*/
                    846:        "*n", "v\b)",   /*nu*/
                    847:        "*m", "\033\016V\b,\033\017",   /*mu*/
                    848:        "*l", "\033\016)\b?\033\017",   /*lambda*/
                    849:        "*i", "\033\016I\033\017",      /*iota*/
                    850:        "*z", "S\b\033\016Z\033\017",   /*zeta*/
                    851:        "*s", "o\b\'",  /*sigma*/
                    852:        "*d", "o\b\033\0165\033\017",   /*delta*/
                    853:        "*b", "\033\016b\033\017",      /*beta*/
                    854:        "*c", "\033\016e\bc\033\017",   /*xi*/
                    855:        "*y", "j\b\033\016C\033\017",   /*eta*/
                    856:        "*f", "\033\016O\bM\033\017",   /*phi*/
                    857:        "*u", "\033\016(\033\017",      /*upsilon*/
                    858:        "*k", "\033\016k\033\017",      /*kappa*/
                    859:        "*p", "T\b\033\016S\033\017",   /*pi*/
                    860:        "da", "\033\016U\033\017",      /*down arrow*/
                    861:        "*a", "\033\016A\033\017",      /*alpha*/
                    862:        "or", "|",
                    863:        "*x", "l\b/",   /*chi*/
                    864:        "*e", "\033\016E\033\017",      /*epsilon*/
                    865:        "*o", "\033\016O\033\017",      /*omicron*/
                    866:        "<-", "\033\016[\033\017",      /*left arrow*/
                    867:        "*r", "\033\016R\033\017",      /*rho*/
                    868:        "ua", "\033\016Y\033\017",      /*up arrow*/
                    869:        "*t", "\033\016N\033\017",      /*tau*/
                    870:        "ul", "_",
                    871:        "ru", "_",
                    872:        "\\_", "_",
                    873:        "*Q", "I\b\033\016(\033\017",   /*Psi*/
                    874:        "bs", "\033\016O\bJ\033\017",   /*bell system sign*/
                    875:        "if", "\033\016W\bX\033\017",   /*infinity*/
                    876:        "*g", "`\b/",   /*gamma*/
                    877:        "ip", "\033\016X\bF\033\017",   /*improper superset*/
                    878:        "pt", "\033\016A\033\017",      /*proportional to*/
                    879:        "rh", "\033\016\\\b]\033\017",  /*right hand*/
                    880:        "*w", "\033\016W\033\017",      /*omega*/
                    881:        "gr", "\033\016G\033\017",      /*gradient*/
                    882:        "*F", "I\033\016\bO\033\017",   /*Phi*/
                    883:        "*H", "O\b=",   /*Theta*/
                    884:        "*W", "O\b_",   /*Omega*/
                    885:        "cu", "\033\016V\033\017",      /*cup (union)*/
                    886:        "rn", "\033\016@\033\017",      /*root en*/
                    887:        "ts", "s",      /*terminal sigma*/
                    888:        "*L", "\033\016)\bK\033\017",   /*Lambda*/
                    889:        "\\-", "-",
                    890:        "*G", "\033\016S\bK\033\017",   /*Gamma*/
                    891:        "is", "\033\016i\033\017",      /*integral sign*/
                    892:        "Sl", "l",
                    893:        "*P", "\033\016t\b'\033\017",   /*Pi*/
                    894:        "sb", "\033\016Z\033\017",      /*subset of*/
                    895:        "sp", "\033\016X\033\017",      /*superset of*/
                    896:        "ap", "\033\016T\033\017",      /*approximates*/
                    897:        "pd", "o\b`",   /*partial derivative*/
                    898:        "*D", "\033\016H\033\017",      /*Delta*/
                    899:        "sr", "\033\016I\b'\033\017",   /*square root*/
                    900:        "*S", ">\b\033\016F\b@\033\017",        /*Sigma*/
                    901:        "~~", "\033\016T\bF\033\017",   /*approx =*/
                    902:        "*C", "\033\016_\bF\b@\033\017",        /*Xi*/
                    903:        "sl", "/",
                    904:        "ca", "\033\016C\033\017",      /*cap (intersection)*/
                    905:        "U", "\033\016y\033\017",       /*Upsilon*/
                    906:        "no", "\033\016|\033\017",      /*not*/
                    907:        "rc", "|",      /*right ceiling (rt of ")*/
                    908:        "lt", "|",      /*left top (of big curly)*/
                    909:        "bv", "|",      /*bold vertical*/
                    910:        "lk", "|",      /*left center of big curly bracket*/
                    911:        "lb", "|",      /*left bottom*/
                    912:        "rt", "|",      /*right top*/
                    913:        "rk", "|",      /*right center of big curly bracket*/
                    914:        "rb", "|",      /*right bot*/
                    915:        "rf", "|",      /*right floor (rb of ")*/
                    916:        "lf", "|",      /*left floor (left bot of big sq bract)*/
                    917:        "lc", "|",      /*left ceiling (lt of ")*/
                    918:        "mu", "\033\016=\033\017",      /*multiply*/
                    919:        "di", "\033\016+\033\017",      /*divide*/
                    920:        "+-", "+\b_",   /*plus-minus*/
                    921:        "<=", "\033\016$\033\017",      /*<=*/
                    922:        ">=", "\033\016^\033\017",      /*>=*/
                    923:        "==", "=\b_",   /*identically equal*/
                    924:        "!=", "\033\016*\033\017",      /*not equal*/
                    925:        "aa", "'",
                    926:        "ga", "`",
                    927:        "lh", "\033\016|\b[\033\017",   /*left hand*/
                    928:        "mo", "\033\016c\b_\033\017",   /*member of*/
                    929:        "es", "\033\016O\b/\033\017",   /*empty set*/
                    930:        "dd", "\033\016%\bM\033\017",   /*dbl dagger*/
                    931:        "br", "|",      /*box rule*/
                    932:        "vr", "|",      /* vertical rule */
                    933:        "ib", "\033\016Z\bF\033\017",   /*improper subset*/
                    934:        "ci", "\033\016O\033\017",      /*circle*/
                    935:        "eq", "=",
                    936:        "pl", "+",
                    937:        "mi", "-",
                    938:        "12", "1/2",
                    939:        "14", "1/4",
                    940:        "34", "3/4",
                    941:        "->", "\033\016]\033\017",      /*right arrow*/
                    942:        "sc", "g\b\033\016C\033\017",   /*section mark*/
                    943:        "**", "*",
                    944:        "l.", ".",
                    945:        "L.", ".",
                    946:        "bx", "[\b]",
                    947:        "ob", "o",      /* open bullet */
                    948:        "cd", ",",      /* cedilla */
                    949:        "..", "\033\016!\033\017",      /* umlaut */
                    950:        0, 0,
                    951: };

unix.superglobalmegacorp.com

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