Annotation of 3BSD/cmd/tc.c, revision 1.1.1.1

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