Annotation of 42BSD/usr.bin/tc.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)tc.c        4.2 (Berkeley) 7/6/81";
                      2: /*
                      3:  * Simulate typesetter on 4014
                      4: */
                      5: 
                      6: #include <signal.h>
                      7: #include <stdio.h>
                      8: 
                      9: #define        oput(c) if (pgskip==0) putchar(c); else (c);
                     10: #define MAXY 3071
                     11: #define US 037
                     12: #define GS 035
                     13: #define ESC 033
                     14: #define FF 014
                     15: #define DBL 0200
                     16: 
                     17: int pl = 11*144;
                     18: int mpy = 1;
                     19: int div = 1;
                     20: char *ap;
                     21: int ch;
                     22: int nonumb;
                     23: int psize = 10;
                     24: int dfact = 1;
                     25: int esc;
                     26: int escd;
                     27: int verd;
                     28: int esct;
                     29: int osize = 02;
                     30: int size = 02;
                     31: int rx;
                     32: int xx;
                     33: int yy = MAXY+62+48;
                     34: int leadtot = -31;
                     35: int ohy = -1;
                     36: int ohx = -1;
                     37: int oxb = -1;
                     38: int oly = -1;
                     39: int olx = -1;
                     40: int tflag;
                     41: int railmag;
                     42: int lead;
                     43: int skip;
                     44: int pgskip;
                     45: int ksize = ';';
                     46: int mcase;
                     47: int stab[] = {010,0,01,07,02,03,04,05,0211,06,0212,0213,0214,0215,0216,0217};
                     48: int rtab[] = {6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 28, 36, 18};
                     49: int ktab[] = {';',';',';',';',';',';',':',':','9','9','9','9','8','8','8','9'};
                     50: int first = 1;
                     51: int alpha;
                     52: extern char *asctab[128];
                     53: extern char *spectab[128];
                     54: int erase = 1;
                     55: int    (*sigint)();
                     56: int    (*sigquit)();
                     57: 
                     58: main(argc,argv)
                     59: int argc;
                     60: char **argv;
                     61: {
                     62:        register i, j;
                     63:        register char *k;
                     64:        extern ex();
                     65: 
                     66:        while((--argc > 0) && ((++argv)[0][0]=='-')){
                     67:                switch(argv[0][1]){
                     68:                        case 'p':
                     69:                                ap = &argv[0][2];
                     70:                                dfact = 72;
                     71:                                if(i = atoi())pl = i/3;
                     72:                                continue;
                     73:                        case 't':
                     74:                                tflag++;
                     75:                                continue;
                     76:                        case 's':
                     77:                                ap = &argv[0][2];
                     78:                                dfact = 1;
                     79:                                pgskip = atoi();
                     80:                                continue;
                     81:                        default:
                     82:                                dfact = 1;
                     83:                                ap = &argv[0][1];
                     84:                                if(i = atoi())mpy = i;
                     85:                                if(i = atoi())div = i;
                     86:                                continue;
                     87:                }
                     88:        }
                     89:        if(argc){
                     90:                if (freopen(argv[0], "r", stdin) == NULL) {
                     91:                        fprintf(stderr, "tc: cannot open %s\n", argv[0]);
                     92:                        exit(1);
                     93:                }
                     94:        }
                     95:        sigint = signal(SIGINT, ex);
                     96:        sigquit = signal(SIGQUIT, SIG_IGN);
                     97:        while((i = getchar()) != EOF){
                     98:                if(!i)continue;
                     99:                if(i & 0200){
                    100:                        esc += (~i) & 0177;
                    101:                        continue;
                    102:                }
                    103:                if(esc){
                    104:                        if(escd)esc = -esc;
                    105:                        esct += esc;
                    106:                        xx += (esc*mpy + rx)/div;
                    107:                        rx = (esc*mpy + rx)%div;
                    108:                        sendpt();
                    109:                        esc = 0;
                    110:                }
                    111:                switch(i){
                    112:                        case 0100:      /*init*/
                    113:                                escd = verd = mcase = railmag = xx = 0;
                    114:                                yy = MAXY + 48;
                    115:                                leadtot = -31;
                    116:                                ohy = oxb = oly = ohx = olx = -1;
                    117:                                oput(US);
                    118:                                fflush(stdout);
                    119:                                if(!first && !tflag)kwait();
                    120:                                if(first){
                    121:                                        first = 0;
                    122:                                        yy += 62;
                    123:                                }
                    124:                                init();
                    125:                                continue;
                    126:                        case 0101:      /*lower rail*/
                    127:                                railmag &= ~01;
                    128:                                continue;
                    129:                        case 0102:      /*upper rail*/
                    130:                                railmag |= 01;
                    131:                                continue;
                    132:                        case 0103:      /*upper mag*/
                    133:                                railmag |= 02;
                    134:                                continue;
                    135:                        case 0104:      /*lower mag*/
                    136:                                railmag &= ~02;
                    137:                                continue;
                    138:                        case 0105:      /*lower case*/
                    139:                                mcase = 0;
                    140:                                continue;
                    141:                        case 0106:      /*upper case*/
                    142:                                mcase = 0100;
                    143:                                continue;
                    144:                        case 0107:      /*escape forward*/
                    145:                                escd = 0;
                    146:                                continue;
                    147:                        case 0110:      /*escape backward*/
                    148:                                escd = 1;
                    149:                                continue;
                    150:                        case 0111:      /*stop*/
                    151:                                continue;
                    152:                        case 0112:      /*lead forward*/
                    153:                                verd = 0;
                    154:                                continue;
                    155:                        case 0113:      /*undefined*/
                    156:                                continue;
                    157:                        case 0114:      /*lead backward*/
                    158:                                verd = 1;
                    159:                                continue;
                    160:                        case 0115:      /*undefined*/
                    161:                        case 0116:
                    162:                        case 0117:
                    163:                                continue;
                    164:                }
                    165:                if((i & 0340) == 0140){ /*leading*/
                    166:                        lead = (~i) & 037;
                    167:                        if(verd)lead = -lead;
                    168:                        if((leadtot += lead) > pl){
                    169:                                leadtot = lead;
                    170:                                oput(US);
                    171:                                fflush(stdout);
                    172:                                if(!tflag)kwait();
                    173:                                yy = MAXY;
                    174:                                if(pgskip)--pgskip;
                    175:                                init();
                    176:                                continue;
                    177:                        }
                    178:                        if(skip)continue;
                    179:                        if((yy -= (lead<<1)) < 0){
                    180:                                skip++;
                    181:                                yy = 0;
                    182:                        }else sendpt();
                    183:                        continue;
                    184:                }
                    185:                if((i & 0360) == 0120){ /*size change*/
                    186:                        i &= 017;
                    187:                        for(j = 0; i != (stab[j] & 017); j++);
                    188:                        osize = size;
                    189:                        size = stab[j];
                    190:                        psize = rtab[j];
                    191:                        ksize = ktab[j];
                    192:                        oput(ESC);
                    193:                        oput(ksize);
                    194:                        i = 0;
                    195:                        if(!(osize & DBL) && (size & DBL))i = -55;
                    196:                        else if((osize & DBL) && !(size & DBL))i = 55;
                    197:                        if(escd)i = -i;
                    198:                        esc += i;
                    199:                        continue;
                    200:                }
                    201:                if(i & 0300)continue;
                    202:                i = (i & 077) | mcase;
                    203:                if(railmag != 03)k = asctab[i];
                    204:                else k = spectab[i];
                    205:                if(alpha)sendpt();
                    206:                if(*k!='\0'){
                    207:                        oput(US);
                    208:                        while(*k & 0377)oput(*k++);
                    209:                        alpha++;
                    210:                        continue;
                    211:                }else{
                    212:                        if(railmag != 03){
                    213:                                switch(i){
                    214:                                case 0124: lig("fi"); break;
                    215:                                case 0125: lig("fl"); break;
                    216:                                case 0126: lig("ff"); break;
                    217:                                case 0130: lig("ffl"); break;
                    218:                                case 0131: lig("ffi"); break;
                    219:                                default: continue;
                    220:                                }
                    221:                        }
                    222:                        continue;
                    223:                }
                    224:        }
                    225:        ex();
                    226: }
                    227: lig(x)
                    228: char *x;
                    229: {
                    230:        register i, j;
                    231:        register char *k;
                    232: 
                    233:        j = 0;
                    234:        k = x;
                    235:        oput(US);
                    236:        oput(*k++);
                    237:        i = psize * 8 * mpy / (div * 6); /* 8/36 em */
                    238:        while(*k){
                    239:                xx += i;
                    240:                j += i;
                    241:                sendpt();
                    242:                oput(US);
                    243:                oput(*k++);
                    244:        }
                    245:        xx -= j;
                    246:        sendpt();
                    247: }
                    248: init(){
                    249: 
                    250:        fflush(stdout);
                    251:        if(erase){
                    252:                oput(ESC);
                    253:                oput(FF);
                    254:        }else erase = 1;
                    255:        oput(ESC);
                    256:        oput(ksize);
                    257:        /*delay about a second*/
                    258: /* let the system do it...
                    259:        for(i = 960; i > 0; i--)oput(GS);
                    260: */
                    261:        skip = 0;
                    262:        sendpt();
                    263: }
                    264: ex(){
                    265:        yy = MAXY;
                    266:        xx = 0;
                    267:        sendpt();
                    268:        oput(ESC);
                    269:        oput(';');
                    270:        oput(US);
                    271:        fflush(stdout);
                    272:        exit(0);
                    273: }
                    274: kwait(){
                    275:        char buf[128]; char *bptr; char c;
                    276:        if(pgskip) return;
                    277: next:
                    278:        bptr=buf;
                    279:        while((c=readch())&&(c!='\n')) *bptr++=c;
                    280:        *bptr=0;
                    281:        if(bptr!=buf){
                    282:                bptr = buf;
                    283:                if(*bptr == '!'){callunix(&buf[1]); fputs("!\n", stderr); goto next;}
                    284:                else switch(*bptr++){
                    285:                        case 'e':
                    286:                                erase = 0;
                    287:                                goto next;
                    288:                        case 's':
                    289:                                ap = &buf[1];
                    290:                                dfact = 1;
                    291:                                pgskip = atoi() + 1;
                    292:                                goto next;
                    293:                        default:
                    294:                                fputs("?\n", stderr);
                    295:                                goto next;
                    296:                }
                    297:        }
                    298:        else if (c==0) ex();
                    299:        else    return;
                    300: }
                    301: callunix(line)
                    302: char line[];
                    303: {
                    304:        int rc, status, unixpid;
                    305:        if( (unixpid=fork())==0 ) {
                    306:                signal(SIGINT,sigint); signal(SIGQUIT,sigquit);
                    307:                close(0); dup(2);
                    308:                execl("/bin/sh", "-sh", "-c", line, 0);
                    309:                exit(255);
                    310:        }
                    311:        else if(unixpid == -1)
                    312:                return;
                    313:        else{   signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN);
                    314:                while( (rc = wait(&status)) != unixpid && rc != -1 ) ;
                    315:                signal(SIGINT,ex); signal(SIGQUIT,sigquit);
                    316:        }
                    317: }
                    318: readch(){
                    319:        char c;
                    320:        if (read(2,&c,1)<1) c=0;
                    321:        return(c);
                    322: }
                    323: sendpt(){
                    324:        int hy,xb,ly,hx,lx;
                    325: 
                    326:        oput(GS);
                    327:        hy = ((yy>>7) & 037);
                    328:        xb = ((xx & 03) + ((yy<<2) & 014) & 017);
                    329:        ly = ((yy>>2) & 037);
                    330:        hx = ((xx>>7) & 037);
                    331:        lx = ((xx>>2) & 037);
                    332:        if(hy != ohy)oput(hy | 040);
                    333:        if(xb != oxb)oput(xb | 0140);
                    334:        if((ly != oly) || (hx != ohx) || (xb != oxb))
                    335:                oput(ly | 0140);
                    336:        if(hx != ohx)oput(hx | 040);
                    337:        oput(lx | 0100);
                    338:        ohy = hy;
                    339:        oxb = xb;
                    340:        oly = ly;
                    341:        ohx = hx;
                    342:        olx = lx;
                    343:        alpha = 0;
                    344:        return;
                    345: }
                    346: atoi()
                    347: {
                    348:        register i, j, acc;
                    349:        int field, digits;
                    350:        long dd;
                    351:        long tscale();
                    352: 
                    353:        field = digits = acc = 0;
                    354: a1:
                    355:        while(((j = (i = getch()) - '0') >= 0) && (j <= 9)){
                    356:                field++;
                    357:                digits++;
                    358:                acc = 10*acc + j;
                    359:        }
                    360:        if(i == '.'){
                    361:                field++;
                    362:                digits = 0;
                    363:                goto a1;
                    364:        }
                    365:        if(!(ch = i))ch = 'x';
                    366:        dd = tscale(acc);
                    367:        acc = dd;
                    368:        if((field != digits) && (digits > 0)){
                    369:                j = 1;
                    370:                while(digits--)j *= 10;
                    371:                acc = dd/j;
                    372:        }
                    373:        nonumb = !field;
                    374:        ch = 0;
                    375:        return(acc);
                    376: }
                    377: long tscale(n)
                    378: int n;
                    379: {
                    380:        register i, j;
                    381: 
                    382:        switch(i = getch()){
                    383:                case 'u':
                    384:                        j = 1;
                    385:                        break;
                    386:                case 'p':       /*Points*/
                    387:                        j = 6;
                    388:                        break;
                    389:                case 'i':       /*Inches*/
                    390:                        j = 432;
                    391:                        break;
                    392:                case 'c':       /*Centimeters; should be 170.0787*/
                    393:                        j = 170;
                    394:                        break;
                    395:                case 'P':       /*Picas*/
                    396:                        j = 72;
                    397:                        break;
                    398:                default:
                    399:                        j = dfact;
                    400:                        ch = i;
                    401:        }
                    402:        return((long)n*j);
                    403: }
                    404: getch(){
                    405:        register i;
                    406: 
                    407:        if(ch){
                    408:                i = ch;
                    409:                ch = 0;
                    410:                return(i);
                    411:        }
                    412:        return(*ap++);
                    413: }
                    414: 
                    415: char *asctab[128] = {
                    416: "\0",  /*blank*/
                    417: "h",   /*h*/
                    418: "t",   /*t*/
                    419: "n",   /*n*/
                    420: "m",   /*m*/
                    421: "l",   /*l*/
                    422: "i",   /*i*/
                    423: "z",   /*z*/
                    424: "s",   /*s*/
                    425: "d",   /*d*/
                    426: "b",   /*b*/
                    427: "x",   /*x*/
                    428: "f",   /*f*/
                    429: "j",   /*j*/
                    430: "u",   /*u*/
                    431: "k",   /*k*/
                    432: "\0",  /*blank*/
                    433: "p",   /*p*/
                    434: "-",   /*_ 3/4 em dash*/
                    435: ";",   /*;*/
                    436: "\0",  /*blank*/
                    437: "a",   /*a*/
                    438: "_",   /*rule*/
                    439: "c",   /*c*/
                    440: "`",   /*` open*/
                    441: "e",   /*e*/
                    442: "\'",  /*' close*/
                    443: "o",   /*o*/
                    444: "\0",  /*1/4*/
                    445: "r",   /*r*/
                    446: "\0",  /*1/2*/
                    447: "v",   /*v*/
                    448: "-",   /*- hyphen*/
                    449: "w",   /*w*/
                    450: "q",   /*q*/
                    451: "/",   /*/*/
                    452: ".",   /*.*/
                    453: "g",   /*g*/
                    454: "\0",  /*3/4*/
                    455: ",",   /*,*/
                    456: "&",   /*&*/
                    457: "y",   /*y*/
                    458: "\0",  /*blank*/
                    459: "%",   /*%*/
                    460: "\0",  /*blank*/
                    461: "Q",   /*Q*/
                    462: "T",   /*T*/
                    463: "O",   /*O*/
                    464: "H",   /*H*/
                    465: "N",   /*N*/
                    466: "M",   /*M*/
                    467: "L",   /*L*/
                    468: "R",   /*R*/
                    469: "G",   /*G*/
                    470: "I",   /*I*/
                    471: "P",   /*P*/
                    472: "C",   /*C*/
                    473: "V",   /*V*/
                    474: "E",   /*E*/
                    475: "Z",   /*Z*/
                    476: "D",   /*D*/
                    477: "B",   /*B*/
                    478: "S",   /*S*/
                    479: "Y",   /*Y*/
                    480: "\0",  /*blank*/
                    481: "F",   /*F*/
                    482: "X",   /*X*/
                    483: "A",   /*A*/
                    484: "W",   /*W*/
                    485: "J",   /*J*/
                    486: "U",   /*U*/
                    487: "K",   /*K*/
                    488: "0",   /*0*/
                    489: "1",   /*1*/
                    490: "2",   /*2*/
                    491: "3",   /*3*/
                    492: "4",   /*4*/
                    493: "5",   /*5*/
                    494: "6",   /*6*/
                    495: "7",   /*7*/
                    496: "8",   /*8*/
                    497: "9",   /*9*/
                    498: "*",   /***/
                    499: "-",   /*minus*/
                    500: "",    /*fi*/
                    501: "",    /*fl*/
                    502: "",    /*ff*/
                    503: "\033\016Z\bM\033\017",        /*cent sign*/
                    504: "",    /*ffl*/
                    505: "",    /*ffi*/
                    506: "(",   /*(*/
                    507: ")",   /*)*/
                    508: "[",   /*[*/
                    509: "]",   /*]*/
                    510: "\033\016J\033\017",   /*degree*/
                    511: "\033\016M\b_\033\017",        /*dagger*/
                    512: "=",   /*=*/
                    513: "\033\016O\b&\033\017",        /*registered*/
                    514: ":",   /*:*/
                    515: "+",   /*+*/
                    516: "\0",  /*blank*/
                    517: "!",   /*!*/
                    518: "\033\016O\b~\033\017",        /*bullet*/
                    519: "?",   /*?*/
                    520: "\'",  /*foot mark*/
                    521: "|",   /*|*/
                    522: "\0",  /*blank*/
                    523: "\033\016O\b#\033\017",        /*copyright*/
                    524: "\033\016L\033\017",   /*square*/
                    525: "$" }; /*$*/
                    526: 
                    527: char *spectab[128] = {
                    528: "\0",  /*blank*/
                    529: "\033\016(\bM\033\017",        /*psi*/
                    530: "\033\016o\b_\033\017",        /*theta*/
                    531: "v\b)",        /*nu*/
                    532: "\033\016V\b,\033\017",        /*mu*/
                    533: "\033\016)\b?\033\017",        /*lambda*/
                    534: "\033\016I\033\017",   /*iota*/
                    535: "S\b\033\016Z\033\017",        /*zeta*/
                    536: "o\b\'",       /*sigma*/
                    537: "o\b\033\0165\033\017",        /*delta*/
                    538: "\033\016b\033\017",   /*beta*/
                    539: "\033\016e\bc\033\017",        /*xi*/
                    540: "j\b\033\016C\033\017",        /*eta*/
                    541: "\033\016O\bM\033\017",        /*phi*/
                    542: "\033\016(\033\017",   /*upsilon*/
                    543: "\033\016k\033\017",   /*kappa*/
                    544: "\0",  /*blank*/
                    545: "T\b\033\016S\033\017",        /*pi*/
                    546: "@",   /*at-sign*/
                    547: "\033\016U\033\017",   /*down arrow*/
                    548: "\0",  /*blank*/
                    549: "\033\016A\033\017",   /*alpha*/
                    550: "|",   /*or*/
                    551: "l\b/",        /*chi*/
                    552: "\"",  /*"*/
                    553: "\033\016E\033\017",   /*epsilon*/
                    554: "=",   /*=*/
                    555: "\033\016O\033\017",   /*omicron*/
                    556: "\033\016[\033\017",   /*left arrow*/
                    557: "\033\016R\033\017",   /*rho*/
                    558: "\033\016Y\033\017",   /*up arrow*/
                    559: "\033\016N\033\017",   /*tau*/
                    560: "_",   /*underrule*/
                    561: "\\",  /*\*/
                    562: "I\b\033\016(\033\017",        /*Psi*/
                    563: "\033\016O\bJ\033\017",        /*bell system sign*/
                    564: "\033\016W\bX\033\017",        /*infinity*/
                    565: "`\b/",        /*gamma*/
                    566: "\033\016X\bF\033\017",        /*improper superset*/
                    567: "\033\016A\033\017",   /*proportional to*/
                    568: "\033\016\\\b]\033\017",       /*right hand*/
                    569: "\033\016W\033\017",   /*omega*/
                    570: "\0",  /*blank*/
                    571: "\033\016G\033\017",   /*gradient*/
                    572: "\0",  /*blank*/
                    573: "I\033\016\bO\033\017",        /*Phi*/
                    574: "O\b=",        /*Theta*/
                    575: "O\b_",        /*Omega*/
                    576: "\033\016V\033\017",   /*cup (union)*/
                    577: "\033\016@\033\017",   /*root en*/
                    578: "s",   /*terminal sigma*/
                    579: "\033\016)\bK\033\017",        /*Lambda*/
                    580: "-",   /*minus*/
                    581: "\033\016S\bK\033\017",        /*Gamma*/
                    582: "\033\016i\033\017",   /*integral sign*/
                    583: "\033\016t\b'\033\017",        /*Pi*/
                    584: "\033\016Z\033\017",   /*subset of*/
                    585: "\033\016X\033\017",   /*superset of*/
                    586: "\033\016T\033\017",   /*approximates*/
                    587: "o\b`",        /*partial derivative*/
                    588: "\033\016H\033\017",   /*Delta*/
                    589: "\033\016I\b'\033\017",        /*square root*/
                    590: ">\b\033\016F\b@\033\017",     /*Sigma*/
                    591: "\033\016T\bF\033\017",        /*approx =*/
                    592: "\0",  /*blank*/
                    593: ">",   /*>*/
                    594: "\033\016_\bF\b@\033\017",     /*Xi*/
                    595: "<",   /*<*/
                    596: "/",   /*slash (longer)*/
                    597: "\033\016C\033\017",   /*cap (intersection)*/
                    598: "\033\016y\033\017",   /*Upsilon*/
                    599: "\033\016|\033\017",   /*not*/
                    600: "|",   /*right ceiling (rt of ")*/
                    601: "|",   /*left top (of big curly)*/
                    602: "|",   /*bold vertical*/
                    603: "|",   /*left center of big curly bracket*/
                    604: "|",   /*left bottom*/
                    605: "|",   /*right top*/
                    606: "|",   /*right center of big curly bracket*/
                    607: "|",   /*right bot*/
                    608: "|",   /*right floor (rb of ")*/
                    609: "|",   /*left floor (left bot of big sq bract)*/
                    610: "|",   /*left ceiling (lt of ")*/
                    611: "\033\016=\033\017",   /*multiply*/
                    612: "\033\016+\033\017",   /*divide*/
                    613: "+\b_",        /*plus-minus*/
                    614: "\033\016$\033\017",   /*<=*/
                    615: "\033\016^\033\017",   /*>=*/
                    616: "=\b_",        /*identically equal*/
                    617: "\033\016*\033\017",   /*not equal*/
                    618: "{",   /*{*/
                    619: "}",   /*}*/
                    620: "\'",  /*' acute accent*/
                    621: "`",   /*` grave accent*/
                    622: "^",   /*^*/
                    623: "#",   /*sharp*/
                    624: "\033\016|\b[\033\017",        /*left hand*/
                    625: "\033\016c\b_\033\017",        /*member of*/
                    626: "~",   /*~*/
                    627: "\033\016O\b/\033\017",        /*empty set*/
                    628: "\0",  /*blank*/
                    629: "\033\016%\bM\033\017",        /*dbl dagger*/
                    630: "|",   /*box rule*/
                    631: "*",   /*asterisk*/
                    632: "\033\016Z\bF\033\017",        /*improper subset*/
                    633: "\033\016O\033\017",   /*circle*/
                    634: "\0",  /*blank*/
                    635: "+",   /*eqn plus*/
                    636: "\033\016]\033\017",   /*right arrow*/
                    637: "g\b\033\016C\033\017" };      /*section mark*/

unix.superglobalmegacorp.com

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