static char *sccsid
= "@(#)tc.c 4.2 (Berkeley) %G%";
* Simulate typesetter on 4014
#define oput(c) if (pgskip==0) putchar(c); else (c);
int stab
[] = {010,0,01,07,02,03,04,05,0211,06,0212,0213,0214,0215,0216,0217};
int rtab
[] = {6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 28, 36, 18};
int ktab
[] = {';',';',';',';',';',';',':',':','9','9','9','9','8','8','8','9'};
extern char *asctab
[128];
extern char *spectab
[128];
while((--argc
> 0) && ((++argv
)[0][0]=='-')){
if (freopen(argv
[0], "r", stdin
) == NULL
) {
fprintf(stderr
, "tc: cannot open %s\n", argv
[0]);
sigint
= signal(SIGINT
, ex
);
sigquit
= signal(SIGQUIT
, SIG_IGN
);
while((i
= getchar()) != EOF
){
xx
+= (esc
*mpy
+ rx
)/div
;
escd
= verd
= mcase
= railmag
= xx
= 0;
ohy
= oxb
= oly
= ohx
= olx
= -1;
if(!first
&& !tflag
)kwait();
case 0101: /*lower rail*/
case 0102: /*upper rail*/
case 0105: /*lower case*/
case 0106: /*upper case*/
case 0107: /*escape forward*/
case 0110: /*escape backward*/
case 0112: /*lead forward*/
case 0114: /*lead backward*/
if((i
& 0340) == 0140){ /*leading*/
if((leadtot
+= lead
) > pl
){
if((yy
-= (lead
<<1)) < 0){
if((i
& 0360) == 0120){ /*size change*/
for(j
= 0; i
!= (stab
[j
] & 017); j
++);
if(!(osize
& DBL
) && (size
& DBL
))i
= -55;
else if((osize
& DBL
) && !(size
& DBL
))i
= 55;
if(railmag
!= 03)k
= asctab
[i
];
while(*k
& 0377)oput(*k
++);
case 0124: lig("fi"); break;
case 0125: lig("fl"); break;
case 0126: lig("ff"); break;
case 0130: lig("ffl"); break;
case 0131: lig("ffi"); break;
i
= psize
* 8 * mpy
/ (div
* 6); /* 8/36 em */
/* let the system do it...
for(i = 960; i > 0; i--)oput(GS);
char buf
[128]; char *bptr
; char c
;
while((c
=readch())&&(c
!='\n')) *bptr
++=c
;
if(*bptr
== '!'){callunix(&buf
[1]); fputs("!\n", stderr
); goto next
;}
if( (unixpid
=fork())==0 ) {
signal(SIGINT
,sigint
); signal(SIGQUIT
,sigquit
);
execl("/bin/sh", "-sh", "-c", line
, 0);
else{ signal(SIGINT
, SIG_IGN
); signal(SIGQUIT
, SIG_IGN
);
while( (rc
= wait(&status
)) != unixpid
&& rc
!= -1 ) ;
signal(SIGINT
,ex
); signal(SIGQUIT
,sigquit
);
xb
= ((xx
& 03) + ((yy
<<2) & 014) & 017);
if(hy
!= ohy
)oput(hy
| 040);
if(xb
!= oxb
)oput(xb
| 0140);
if((ly
!= oly
) || (hx
!= ohx
) || (xb
!= oxb
))
if(hx
!= ohx
)oput(hx
| 040);
field
= digits
= acc
= 0;
while(((j
= (i
= getch()) - '0') >= 0) && (j
<= 9)){
if((field
!= digits
) && (digits
> 0)){
case 'c': /*Centimeters; should be 170.0787*/
"\033\016Z\bM\033\017", /*cent sign*/
"\033\016J\033\017", /*degree*/
"\033\016M\b_\033\017", /*dagger*/
"\033\016O\b&\033\017", /*registered*/
"\033\016O\b~\033\017", /*bullet*/
"\033\016O\b#\033\017", /*copyright*/
"\033\016L\033\017", /*square*/
"\033\016(\bM\033\017", /*psi*/
"\033\016o\b_\033\017", /*theta*/
"\033\016V\b,\033\017", /*mu*/
"\033\016)\b?\033\017", /*lambda*/
"\033\016I\033\017", /*iota*/
"S\b\033\016Z\033\017", /*zeta*/
"o\b\033\0165\033\017", /*delta*/
"\033\016b\033\017", /*beta*/
"\033\016e\bc\033\017", /*xi*/
"j\b\033\016C\033\017", /*eta*/
"\033\016O\bM\033\017", /*phi*/
"\033\016(\033\017", /*upsilon*/
"\033\016k\033\017", /*kappa*/
"T\b\033\016S\033\017", /*pi*/
"\033\016U\033\017", /*down arrow*/
"\033\016A\033\017", /*alpha*/
"\033\016E\033\017", /*epsilon*/
"\033\016O\033\017", /*omicron*/
"\033\016[\033\017", /*left arrow*/
"\033\016R\033\017", /*rho*/
"\033\016Y\033\017", /*up arrow*/
"\033\016N\033\017", /*tau*/
"I\b\033\016(\033\017", /*Psi*/
"\033\016O\bJ\033\017", /*bell system sign*/
"\033\016W\bX\033\017", /*infinity*/
"\033\016X\bF\033\017", /*improper superset*/
"\033\016A\033\017", /*proportional to*/
"\033\016\\\b]\033\017", /*right hand*/
"\033\016W\033\017", /*omega*/
"\033\016G\033\017", /*gradient*/
"I\033\016\bO\033\017", /*Phi*/
"\033\016V\033\017", /*cup (union)*/
"\033\016@\033\017", /*root en*/
"\033\016)\bK\033\017", /*Lambda*/
"\033\016S\bK\033\017", /*Gamma*/
"\033\016i\033\017", /*integral sign*/
"\033\016t\b'\033\017", /*Pi*/
"\033\016Z\033\017", /*subset of*/
"\033\016X\033\017", /*superset of*/
"\033\016T\033\017", /*approximates*/
"o\b`", /*partial derivative*/
"\033\016H\033\017", /*Delta*/
"\033\016I\b'\033\017", /*square root*/
">\b\033\016F\b@\033\017", /*Sigma*/
"\033\016T\bF\033\017", /*approx =*/
"\033\016_\bF\b@\033\017", /*Xi*/
"\033\016C\033\017", /*cap (intersection)*/
"\033\016y\033\017", /*Upsilon*/
"\033\016|\033\017", /*not*/
"|", /*right ceiling (rt of ")*/
"|", /*left top (of big curly)*/
"|", /*left center of big curly bracket*/
"|", /*right center of big curly bracket*/
"|", /*right floor (rb of ")*/
"|", /*left floor (left bot of big sq bract)*/
"|", /*left ceiling (lt of ")*/
"\033\016=\033\017", /*multiply*/
"\033\016+\033\017", /*divide*/
"\033\016$\033\017", /*<=*/
"\033\016^\033\017", /*>=*/
"=\b_", /*identically equal*/
"\033\016*\033\017", /*not equal*/
"\033\016|\b[\033\017", /*left hand*/
"\033\016c\b_\033\017", /*member of*/
"\033\016O\b/\033\017", /*empty set*/
"\033\016%\bM\033\017", /*dbl dagger*/
"\033\016Z\bF\033\017", /*improper subset*/
"\033\016O\033\017", /*circle*/
"\033\016]\033\017", /*right arrow*/
"g\b\033\016C\033\017" }; /*section mark*/