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*/

Defined functions

callunix defined in line 301; used 1 times
ex defined in line 264; used 5 times
getch defined in line 404; used 2 times
init defined in line 248; used 2 times
kwait defined in line 274; used 2 times
lig defined in line 227; used 5 times
main defined in line 58; never used
readch defined in line 318; used 1 times
sendpt defined in line 323; used 7 times
tscale defined in line 377; used 2 times

Defined variables

alpha defined in line 51; used 3 times
ap defined in line 20; used 5 times
asctab declared in line 52; defined in line 415; used 2 times
ch defined in line 21; used 7 times
dfact defined in line 24; used 5 times
div defined in line 19; used 4 times
erase defined in line 54; used 3 times
esc defined in line 25; used 9 times
escd defined in line 26; used 5 times
esct defined in line 28; used 1 times
first defined in line 50; used 3 times
ksize defined in line 45; used 3 times
ktab defined in line 49; used 1 times
lead defined in line 42; used 6 times
leadtot defined in line 34; used 3 times
mcase defined in line 46; used 4 times
mpy defined in line 18; used 4 times
nonumb defined in line 22; used 1 times
ohx defined in line 36; used 4 times
ohy defined in line 35; used 3 times
olx defined in line 39; used 2 times
oly defined in line 38; used 3 times
osize defined in line 29; used 3 times
oxb defined in line 37; used 4 times
pgskip defined in line 44; used 6 times
pl defined in line 17; used 2 times
psize defined in line 23; used 2 times
railmag defined in line 41; used 7 times
rtab defined in line 48; used 1 times
rx defined in line 31; used 3 times
sccsid defined in line 1; never used
size defined in line 30; used 4 times
skip defined in line 43; used 3 times
spectab declared in line 53; defined in line 527; used 2 times
stab defined in line 47; used 2 times
tflag defined in line 40; used 3 times
verd defined in line 27; used 4 times
xx defined in line 32; used 8 times
yy defined in line 33; used 9 times

Defined macros

DBL defined in line 15; used 4 times
ESC defined in line 13; used 4 times
FF defined in line 14; used 1 times
GS defined in line 12; used 1 times
MAXY defined in line 10; used 4 times
US defined in line 11; used 6 times
oput defined in line 9; used 23 times
Last modified: 1987-02-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 4758
Valid CSS Valid XHTML 1.0 Strict