date and time created 90/04/26 23:41:39 by mckusick
[unix-history] / usr / src / old / tc / tc.c
CommitLineData
6894b138 1static char *sccsid = "@(#)tc.c 4.4 (Berkeley) %G%";
de1afe16
BJ
2/*
3 * Simulate typesetter on 4014
4*/
5
229ff552
KB
6#include <sys/signal.h>
7#include <paths.h>
de1afe16
BJ
8#include <stdio.h>
9
6a775cad 10#define oput(c) if (pgskip==0) putchar(c); else (c);
de1afe16
BJ
11#define MAXY 3071
12#define US 037
13#define GS 035
14#define ESC 033
15#define FF 014
16#define DBL 0200
17
18int pl = 11*144;
19int mpy = 1;
20int div = 1;
21char *ap;
22int ch;
23int nonumb;
24int psize = 10;
25int dfact = 1;
26int esc;
27int escd;
28int verd;
29int esct;
30int osize = 02;
31int size = 02;
32int rx;
33int xx;
34int yy = MAXY+62+48;
35int leadtot = -31;
36int ohy = -1;
37int ohx = -1;
38int oxb = -1;
39int oly = -1;
40int olx = -1;
41int tflag;
42int railmag;
43int lead;
44int skip;
45int pgskip;
46int ksize = ';';
47int mcase;
48int stab[] = {010,0,01,07,02,03,04,05,0211,06,0212,0213,0214,0215,0216,0217};
49int rtab[] = {6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 28, 36, 18};
50int ktab[] = {';',';',';',';',';',';',':',':','9','9','9','9','8','8','8','9'};
51int first = 1;
52int alpha;
53extern char *asctab[128];
54extern char *spectab[128];
55int erase = 1;
6894b138 56sig_t sigint, sigquit;
de1afe16
BJ
57
58main(argc,argv)
59int argc;
60char **argv;
61{
62 register i, j;
63 register char *k;
6894b138 64 extern void ex();
de1afe16
BJ
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}
227lig(x)
228char *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}
248init(){
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}
6894b138
KB
264
265void
de1afe16
BJ
266ex(){
267 yy = MAXY;
268 xx = 0;
269 sendpt();
270 oput(ESC);
271 oput(';');
272 oput(US);
273 fflush(stdout);
274 exit(0);
275}
276kwait(){
277 char buf[128]; char *bptr; char c;
278 if(pgskip) return;
279next:
280 bptr=buf;
281 while((c=readch())&&(c!='\n')) *bptr++=c;
282 *bptr=0;
283 if(bptr!=buf){
284 bptr = buf;
285 if(*bptr == '!'){callunix(&buf[1]); fputs("!\n", stderr); goto next;}
286 else switch(*bptr++){
287 case 'e':
288 erase = 0;
289 goto next;
290 case 's':
291 ap = &buf[1];
292 dfact = 1;
293 pgskip = atoi() + 1;
294 goto next;
295 default:
296 fputs("?\n", stderr);
297 goto next;
298 }
299 }
300 else if (c==0) ex();
301 else return;
302}
303callunix(line)
304char line[];
305{
306 int rc, status, unixpid;
307 if( (unixpid=fork())==0 ) {
308 signal(SIGINT,sigint); signal(SIGQUIT,sigquit);
309 close(0); dup(2);
229ff552 310 execl(_PATH_BSHELL, "-sh", "-c", line, 0);
de1afe16
BJ
311 exit(255);
312 }
313 else if(unixpid == -1)
314 return;
315 else{ signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN);
316 while( (rc = wait(&status)) != unixpid && rc != -1 ) ;
317 signal(SIGINT,ex); signal(SIGQUIT,sigquit);
318 }
319}
320readch(){
321 char c;
322 if (read(2,&c,1)<1) c=0;
323 return(c);
324}
325sendpt(){
326 int hy,xb,ly,hx,lx;
327
328 oput(GS);
329 hy = ((yy>>7) & 037);
330 xb = ((xx & 03) + ((yy<<2) & 014) & 017);
331 ly = ((yy>>2) & 037);
332 hx = ((xx>>7) & 037);
333 lx = ((xx>>2) & 037);
334 if(hy != ohy)oput(hy | 040);
335 if(xb != oxb)oput(xb | 0140);
336 if((ly != oly) || (hx != ohx) || (xb != oxb))
337 oput(ly | 0140);
338 if(hx != ohx)oput(hx | 040);
339 oput(lx | 0100);
340 ohy = hy;
341 oxb = xb;
342 oly = ly;
343 ohx = hx;
344 olx = lx;
345 alpha = 0;
346 return;
347}
348atoi()
349{
350 register i, j, acc;
351 int field, digits;
352 long dd;
353 long tscale();
354
355 field = digits = acc = 0;
356a1:
357 while(((j = (i = getch()) - '0') >= 0) && (j <= 9)){
358 field++;
359 digits++;
360 acc = 10*acc + j;
361 }
362 if(i == '.'){
363 field++;
364 digits = 0;
365 goto a1;
366 }
367 if(!(ch = i))ch = 'x';
368 dd = tscale(acc);
369 acc = dd;
370 if((field != digits) && (digits > 0)){
371 j = 1;
372 while(digits--)j *= 10;
373 acc = dd/j;
374 }
375 nonumb = !field;
376 ch = 0;
377 return(acc);
378}
379long tscale(n)
380int n;
381{
382 register i, j;
383
384 switch(i = getch()){
385 case 'u':
386 j = 1;
387 break;
388 case 'p': /*Points*/
389 j = 6;
390 break;
391 case 'i': /*Inches*/
392 j = 432;
393 break;
394 case 'c': /*Centimeters; should be 170.0787*/
395 j = 170;
396 break;
397 case 'P': /*Picas*/
398 j = 72;
399 break;
400 default:
401 j = dfact;
402 ch = i;
403 }
404 return((long)n*j);
405}
406getch(){
407 register i;
408
409 if(ch){
410 i = ch;
411 ch = 0;
412 return(i);
413 }
414 return(*ap++);
415}
416
417char *asctab[128] = {
418"\0", /*blank*/
419"h", /*h*/
420"t", /*t*/
421"n", /*n*/
422"m", /*m*/
423"l", /*l*/
424"i", /*i*/
425"z", /*z*/
426"s", /*s*/
427"d", /*d*/
428"b", /*b*/
429"x", /*x*/
430"f", /*f*/
431"j", /*j*/
432"u", /*u*/
433"k", /*k*/
434"\0", /*blank*/
435"p", /*p*/
436"-", /*_ 3/4 em dash*/
437";", /*;*/
438"\0", /*blank*/
439"a", /*a*/
440"_", /*rule*/
441"c", /*c*/
442"`", /*` open*/
443"e", /*e*/
444"\'", /*' close*/
445"o", /*o*/
446"\0", /*1/4*/
447"r", /*r*/
448"\0", /*1/2*/
449"v", /*v*/
450"-", /*- hyphen*/
451"w", /*w*/
452"q", /*q*/
453"/", /*/*/
454".", /*.*/
455"g", /*g*/
456"\0", /*3/4*/
457",", /*,*/
458"&", /*&*/
459"y", /*y*/
460"\0", /*blank*/
461"%", /*%*/
462"\0", /*blank*/
463"Q", /*Q*/
464"T", /*T*/
465"O", /*O*/
466"H", /*H*/
467"N", /*N*/
468"M", /*M*/
469"L", /*L*/
470"R", /*R*/
471"G", /*G*/
472"I", /*I*/
473"P", /*P*/
474"C", /*C*/
475"V", /*V*/
476"E", /*E*/
477"Z", /*Z*/
478"D", /*D*/
479"B", /*B*/
480"S", /*S*/
481"Y", /*Y*/
482"\0", /*blank*/
483"F", /*F*/
484"X", /*X*/
485"A", /*A*/
486"W", /*W*/
487"J", /*J*/
488"U", /*U*/
489"K", /*K*/
490"0", /*0*/
491"1", /*1*/
492"2", /*2*/
493"3", /*3*/
494"4", /*4*/
495"5", /*5*/
496"6", /*6*/
497"7", /*7*/
498"8", /*8*/
499"9", /*9*/
500"*", /***/
501"-", /*minus*/
502"", /*fi*/
503"", /*fl*/
504"", /*ff*/
505"\033\016Z\bM\033\017", /*cent sign*/
506"", /*ffl*/
507"", /*ffi*/
508"(", /*(*/
509")", /*)*/
510"[", /*[*/
511"]", /*]*/
512"\033\016J\033\017", /*degree*/
513"\033\016M\b_\033\017", /*dagger*/
514"=", /*=*/
515"\033\016O\b&\033\017", /*registered*/
516":", /*:*/
517"+", /*+*/
518"\0", /*blank*/
519"!", /*!*/
520"\033\016O\b~\033\017", /*bullet*/
521"?", /*?*/
522"\'", /*foot mark*/
523"|", /*|*/
524"\0", /*blank*/
525"\033\016O\b#\033\017", /*copyright*/
526"\033\016L\033\017", /*square*/
527"$" }; /*$*/
528
529char *spectab[128] = {
530"\0", /*blank*/
531"\033\016(\bM\033\017", /*psi*/
532"\033\016o\b_\033\017", /*theta*/
533"v\b)", /*nu*/
534"\033\016V\b,\033\017", /*mu*/
535"\033\016)\b?\033\017", /*lambda*/
536"\033\016I\033\017", /*iota*/
537"S\b\033\016Z\033\017", /*zeta*/
538"o\b\'", /*sigma*/
539"o\b\033\0165\033\017", /*delta*/
540"\033\016b\033\017", /*beta*/
541"\033\016e\bc\033\017", /*xi*/
542"j\b\033\016C\033\017", /*eta*/
543"\033\016O\bM\033\017", /*phi*/
544"\033\016(\033\017", /*upsilon*/
545"\033\016k\033\017", /*kappa*/
546"\0", /*blank*/
547"T\b\033\016S\033\017", /*pi*/
548"@", /*at-sign*/
549"\033\016U\033\017", /*down arrow*/
550"\0", /*blank*/
551"\033\016A\033\017", /*alpha*/
552"|", /*or*/
553"l\b/", /*chi*/
554"\"", /*"*/
555"\033\016E\033\017", /*epsilon*/
556"=", /*=*/
557"\033\016O\033\017", /*omicron*/
558"\033\016[\033\017", /*left arrow*/
559"\033\016R\033\017", /*rho*/
560"\033\016Y\033\017", /*up arrow*/
561"\033\016N\033\017", /*tau*/
562"_", /*underrule*/
563"\\", /*\*/
564"I\b\033\016(\033\017", /*Psi*/
565"\033\016O\bJ\033\017", /*bell system sign*/
566"\033\016W\bX\033\017", /*infinity*/
567"`\b/", /*gamma*/
568"\033\016X\bF\033\017", /*improper superset*/
569"\033\016A\033\017", /*proportional to*/
570"\033\016\\\b]\033\017", /*right hand*/
571"\033\016W\033\017", /*omega*/
572"\0", /*blank*/
573"\033\016G\033\017", /*gradient*/
574"\0", /*blank*/
575"I\033\016\bO\033\017", /*Phi*/
576"O\b=", /*Theta*/
577"O\b_", /*Omega*/
578"\033\016V\033\017", /*cup (union)*/
579"\033\016@\033\017", /*root en*/
580"s", /*terminal sigma*/
581"\033\016)\bK\033\017", /*Lambda*/
582"-", /*minus*/
583"\033\016S\bK\033\017", /*Gamma*/
584"\033\016i\033\017", /*integral sign*/
585"\033\016t\b'\033\017", /*Pi*/
586"\033\016Z\033\017", /*subset of*/
587"\033\016X\033\017", /*superset of*/
588"\033\016T\033\017", /*approximates*/
589"o\b`", /*partial derivative*/
590"\033\016H\033\017", /*Delta*/
591"\033\016I\b'\033\017", /*square root*/
592">\b\033\016F\b@\033\017", /*Sigma*/
593"\033\016T\bF\033\017", /*approx =*/
594"\0", /*blank*/
595">", /*>*/
596"\033\016_\bF\b@\033\017", /*Xi*/
597"<", /*<*/
598"/", /*slash (longer)*/
599"\033\016C\033\017", /*cap (intersection)*/
600"\033\016y\033\017", /*Upsilon*/
601"\033\016|\033\017", /*not*/
602"|", /*right ceiling (rt of ")*/
603"|", /*left top (of big curly)*/
604"|", /*bold vertical*/
605"|", /*left center of big curly bracket*/
606"|", /*left bottom*/
607"|", /*right top*/
608"|", /*right center of big curly bracket*/
609"|", /*right bot*/
610"|", /*right floor (rb of ")*/
611"|", /*left floor (left bot of big sq bract)*/
612"|", /*left ceiling (lt of ")*/
613"\033\016=\033\017", /*multiply*/
614"\033\016+\033\017", /*divide*/
615"+\b_", /*plus-minus*/
616"\033\016$\033\017", /*<=*/
617"\033\016^\033\017", /*>=*/
618"=\b_", /*identically equal*/
619"\033\016*\033\017", /*not equal*/
620"{", /*{*/
621"}", /*}*/
622"\'", /*' acute accent*/
623"`", /*` grave accent*/
624"^", /*^*/
625"#", /*sharp*/
626"\033\016|\b[\033\017", /*left hand*/
627"\033\016c\b_\033\017", /*member of*/
628"~", /*~*/
629"\033\016O\b/\033\017", /*empty set*/
630"\0", /*blank*/
631"\033\016%\bM\033\017", /*dbl dagger*/
632"|", /*box rule*/
633"*", /*asterisk*/
634"\033\016Z\bF\033\017", /*improper subset*/
635"\033\016O\033\017", /*circle*/
636"\0", /*blank*/
637"+", /*eqn plus*/
638"\033\016]\033\017", /*right arrow*/
639"g\b\033\016C\033\017" }; /*section mark*/