|
|
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*/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.