1*8184Smckusick static char sccsid[] = "@(#)chktroff.c 4.1 (Berkeley) 09/12/82";
2*8184Smckusick
3*8184Smckusick /* sccs id variable */
4*8184Smckusick static char *chktroff_sid = "@(#)chktroff.c 1.2";
5*8184Smckusick
6*8184Smckusick /*
7*8184Smckusick chktroff [-l] [-num] [file]
8*8184Smckusick
9*8184Smckusick -l says list the code
10*8184Smckusick -num num is octal offset into file
11*8184Smckusick file if specified, read from file, otherwise stdin
12*8184Smckusick */
13*8184Smckusick # include "local.h"
14*8184Smckusick # ifdef ONYX
15*8184Smckusick # define NOFP
16*8184Smckusick # endif
17*8184Smckusick
18*8184Smckusick # define FEET 15.0
19*8184Smckusick #define DBL 0200
20*8184Smckusick #define BUFSIZ 1024
21*8184Smckusick /*
22*8184Smckusick C version of pti
23*8184Smckusick */
24*8184Smckusick
25*8184Smckusick char *ap;
26*8184Smckusick char ibuf[BUFSIZ];
27*8184Smckusick char *ibufp = ibuf;
28*8184Smckusick char *eibufp = ibuf;
29*8184Smckusick int fid;
30*8184Smckusick int esc;
31*8184Smckusick int escd;
32*8184Smckusick int verd;
33*8184Smckusick int esct;
34*8184Smckusick int osize = 02;
35*8184Smckusick int size = 02;
36*8184Smckusick int leadtot;
37*8184Smckusick int railmag;
38*8184Smckusick int lead;
39*8184Smckusick int mcase;
40*8184Smckusick int stab[] = {010,0,01,07,02,03,04,05,0211,06,0212,0213,0214,0215,0216,0217};
41*8184Smckusick int rtab[] = {6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 28, 36, 18};
42*8184Smckusick char *asctab[128];
43*8184Smckusick char *spectab[128];
44*8184Smckusick long offset;
45*8184Smckusick int lflg = 1;
46*8184Smckusick int xxx;
47*8184Smckusick long bytetot = 0L;
48*8184Smckusick int init = 0, stop = 0;
49*8184Smckusick
main(argc,argv)50*8184Smckusick main(argc,argv)
51*8184Smckusick int argc;
52*8184Smckusick char **argv;
53*8184Smckusick {
54*8184Smckusick register i, j;
55*8184Smckusick register char *k;
56*8184Smckusick extern ex();
57*8184Smckusick double f;
58*8184Smckusick
59*8184Smckusick while((--argc > 0) && ((++argv)[0][0]=='-')){
60*8184Smckusick switch(argv[0][1]){
61*8184Smckusick case 'l':
62*8184Smckusick lflg = 0;
63*8184Smckusick continue;
64*8184Smckusick default:
65*8184Smckusick ap = &argv[0][1];
66*8184Smckusick while(((j = *ap++ - '0') >= 0)
67*8184Smckusick && (j <= 9))offset = 8*offset +j;
68*8184Smckusick continue;
69*8184Smckusick }
70*8184Smckusick }
71*8184Smckusick if(argc){
72*8184Smckusick if((fid=open(argv[0], 0)) < 0){
73*8184Smckusick perror(argv[0]);
74*8184Smckusick exit(1);
75*8184Smckusick }
76*8184Smckusick }
77*8184Smckusick if((i = getc()) != 0100){
78*8184Smckusick printf("Not typesetter format file. Sorry.\n");
79*8184Smckusick exit(1);
80*8184Smckusick }
81*8184Smckusick escd = verd = mcase = railmag = 0;
82*8184Smckusick if(!lflg)printf("Initialize\n");
83*8184Smckusick init++;
84*8184Smckusick /*
85*8184Smckusick lseek(fid,offset,0);
86*8184Smckusick */
87*8184Smckusick while((i = getc()) >= 0){
88*8184Smckusick if(i & 0200){
89*8184Smckusick if(!lflg)printf("%o ",i);
90*8184Smckusick esc += (~i) & 0177;
91*8184Smckusick continue;
92*8184Smckusick }
93*8184Smckusick if(esc){
94*8184Smckusick if(escd){
95*8184Smckusick if(!lflg)printf("< %d\n",esc);
96*8184Smckusick esc = -esc;
97*8184Smckusick }else{
98*8184Smckusick if(!lflg)printf("> %d\n",esc);
99*8184Smckusick }
100*8184Smckusick esct += esc;
101*8184Smckusick esc = 0;
102*8184Smckusick }
103*8184Smckusick if(!lflg)printf("%o ",i);
104*8184Smckusick if(!i){if(!lflg)printf("\n"); continue;}
105*8184Smckusick switch(i){
106*8184Smckusick case 0100: /*init*/
107*8184Smckusick escd = verd = mcase = railmag = 0;
108*8184Smckusick if(!lflg)printf("Initialize\n");
109*8184Smckusick init++;
110*8184Smckusick continue;
111*8184Smckusick case 0101: /*lower rail*/
112*8184Smckusick railmag &= ~01;
113*8184Smckusick if(!lflg)printf("Lower rail\n");
114*8184Smckusick continue;
115*8184Smckusick case 0102: /*upper rail*/
116*8184Smckusick railmag |= 01;
117*8184Smckusick if(!lflg)printf("Upper rail\n");
118*8184Smckusick continue;
119*8184Smckusick case 0103: /*upper mag*/
120*8184Smckusick railmag |= 02;
121*8184Smckusick if(!lflg)printf("Upper mag\n");
122*8184Smckusick continue;
123*8184Smckusick case 0104: /*lower mag*/
124*8184Smckusick railmag &= ~02;
125*8184Smckusick if(!lflg)printf("Lower mag\n");
126*8184Smckusick continue;
127*8184Smckusick case 0105: /*lower case*/
128*8184Smckusick mcase = 0;
129*8184Smckusick if(!lflg)printf("Lower case\n");
130*8184Smckusick continue;
131*8184Smckusick case 0106: /*upper case*/
132*8184Smckusick mcase = 0100;
133*8184Smckusick if(!lflg)printf("Upper case\n");
134*8184Smckusick continue;
135*8184Smckusick case 0107: /*escape forward*/
136*8184Smckusick escd = 0;
137*8184Smckusick if(!lflg)printf("> mode, %d\n",esct);
138*8184Smckusick continue;
139*8184Smckusick case 0110: /*escape backward*/
140*8184Smckusick escd = 1;
141*8184Smckusick if(!lflg)printf("< mode, %d\n",esct);
142*8184Smckusick continue;
143*8184Smckusick case 0111: /*stop*/
144*8184Smckusick if(!lflg)printf("STOP\n");
145*8184Smckusick stop++;
146*8184Smckusick continue;
147*8184Smckusick case 0112: /*lead forward*/
148*8184Smckusick verd = 0;
149*8184Smckusick if(!lflg)printf("Lead forward, %d\n",leadtot);
150*8184Smckusick continue;
151*8184Smckusick case 0114: /*lead backward*/
152*8184Smckusick verd = 1;
153*8184Smckusick if(!lflg)printf("Lead backward, %d\n",leadtot);
154*8184Smckusick continue;
155*8184Smckusick case 0115: /*undefined*/
156*8184Smckusick case 0116:
157*8184Smckusick case 0117:
158*8184Smckusick case 0113:
159*8184Smckusick if(!lflg)printf("Undefined code\n");
160*8184Smckusick continue;
161*8184Smckusick }
162*8184Smckusick if((i & 0340) == 0140){ /*leading*/
163*8184Smckusick lead = (~i) & 037;
164*8184Smckusick if(!lflg)printf("Lead %d\n",lead);
165*8184Smckusick if(verd)lead = -lead;
166*8184Smckusick leadtot += lead;
167*8184Smckusick #ifndef NOFP
168*8184Smckusick f = ((float)leadtot / (float)(144 * 12));
169*8184Smckusick if(f > FEET){
170*8184Smckusick printf("Only %3.0f feet maximum per request. Sorry.\n",FEET);
171*8184Smckusick exit(1);
172*8184Smckusick }
173*8184Smckusick #endif
174*8184Smckusick continue;
175*8184Smckusick }
176*8184Smckusick if((i & 0360) == 0120){ /*size change*/
177*8184Smckusick i &= 017;
178*8184Smckusick for(j = 0; i != (stab[j] & 017); j++);
179*8184Smckusick osize = size;
180*8184Smckusick size = stab[j];
181*8184Smckusick if(!lflg){
182*8184Smckusick printf("Size %d",rtab[j]);
183*8184Smckusick if(!(osize & DBL) && (size & DBL))printf(", double\n");
184*8184Smckusick else if((osize & DBL) && !(size & DBL))printf(", single\n");
185*8184Smckusick else printf("\n");
186*8184Smckusick }
187*8184Smckusick continue;
188*8184Smckusick }
189*8184Smckusick if(i & 0300)continue;
190*8184Smckusick i = (i & 077) | mcase;
191*8184Smckusick if(railmag != 03)k = asctab[i];
192*8184Smckusick else k = spectab[i];
193*8184Smckusick if(!lflg)printf("%s\n",k);
194*8184Smckusick continue;
195*8184Smckusick }
196*8184Smckusick ex();
197*8184Smckusick }
ex()198*8184Smckusick ex(){
199*8184Smckusick double f1;
200*8184Smckusick #ifndef NOFP
201*8184Smckusick f1 = ((leadtot * 3)/432.0)/12.0;
202*8184Smckusick printf("Total bytes %ld, lead %d, feet %4.2f\n",bytetot,leadtot,f1);
203*8184Smckusick #endif
204*8184Smckusick if(stop != 1 || init != 2){
205*8184Smckusick printf("Error - wrong # init %d, # stop %d\n",init,stop);
206*8184Smckusick exit(1);
207*8184Smckusick }
208*8184Smckusick exit(0);
209*8184Smckusick }
getc()210*8184Smckusick getc(){
211*8184Smckusick register i;
212*8184Smckusick
213*8184Smckusick if(ibufp >= eibufp){
214*8184Smckusick if((i=read(fid,ibuf,BUFSIZ)) <= 0)ex();
215*8184Smckusick eibufp = ibuf + i;
216*8184Smckusick ibufp = ibuf;
217*8184Smckusick bytetot += i;
218*8184Smckusick }
219*8184Smckusick return(*ibufp++ & 0377);
220*8184Smckusick }
221*8184Smckusick char *asctab[128] = {
222*8184Smckusick 0, /*blank*/
223*8184Smckusick "h", /*h*/
224*8184Smckusick "t", /*t*/
225*8184Smckusick "n", /*n*/
226*8184Smckusick "m", /*m*/
227*8184Smckusick "l", /*l*/
228*8184Smckusick "i", /*i*/
229*8184Smckusick "z", /*z*/
230*8184Smckusick "s", /*s*/
231*8184Smckusick "d", /*d*/
232*8184Smckusick "b", /*b*/
233*8184Smckusick "x", /*x*/
234*8184Smckusick "f", /*f*/
235*8184Smckusick "j", /*j*/
236*8184Smckusick "u", /*u*/
237*8184Smckusick "k", /*k*/
238*8184Smckusick 0, /*blank*/
239*8184Smckusick "p", /*p*/
240*8184Smckusick "-", /*_ 3/4 em dash*/
241*8184Smckusick ";", /*;*/
242*8184Smckusick 0, /*blank*/
243*8184Smckusick "a", /*a*/
244*8184Smckusick "_", /*rule*/
245*8184Smckusick "c", /*c*/
246*8184Smckusick "`", /*` open*/
247*8184Smckusick "e", /*e*/
248*8184Smckusick "'", /*' close*/
249*8184Smckusick "o", /*o*/
250*8184Smckusick 0, /*1/4*/
251*8184Smckusick "r", /*r*/
252*8184Smckusick 0, /*1/2*/
253*8184Smckusick "v", /*v*/
254*8184Smckusick "-", /*- hyphen*/
255*8184Smckusick "w", /*w*/
256*8184Smckusick "q", /*q*/
257*8184Smckusick "/", /*/*/
258*8184Smckusick ".", /*.*/
259*8184Smckusick "g", /*g*/
260*8184Smckusick 0, /*3/4*/
261*8184Smckusick ",", /*,*/
262*8184Smckusick "&", /*&*/
263*8184Smckusick "y", /*y*/
264*8184Smckusick 0, /*blank*/
265*8184Smckusick "%", /*%*/
266*8184Smckusick 0, /*blank*/
267*8184Smckusick "Q", /*Q*/
268*8184Smckusick "T", /*T*/
269*8184Smckusick "O", /*O*/
270*8184Smckusick "H", /*H*/
271*8184Smckusick "N", /*N*/
272*8184Smckusick "M", /*M*/
273*8184Smckusick "L", /*L*/
274*8184Smckusick "R", /*R*/
275*8184Smckusick "G", /*G*/
276*8184Smckusick "I", /*I*/
277*8184Smckusick "P", /*P*/
278*8184Smckusick "C", /*C*/
279*8184Smckusick "V", /*V*/
280*8184Smckusick "E", /*E*/
281*8184Smckusick "Z", /*Z*/
282*8184Smckusick "D", /*D*/
283*8184Smckusick "B", /*B*/
284*8184Smckusick "S", /*S*/
285*8184Smckusick "Y", /*Y*/
286*8184Smckusick 0, /*blank*/
287*8184Smckusick "F", /*F*/
288*8184Smckusick "X", /*X*/
289*8184Smckusick "A", /*A*/
290*8184Smckusick "W", /*W*/
291*8184Smckusick "J", /*J*/
292*8184Smckusick "U", /*U*/
293*8184Smckusick "K", /*K*/
294*8184Smckusick "0", /*0*/
295*8184Smckusick "1", /*1*/
296*8184Smckusick "2", /*2*/
297*8184Smckusick "3", /*3*/
298*8184Smckusick "4", /*4*/
299*8184Smckusick "5", /*5*/
300*8184Smckusick "6", /*6*/
301*8184Smckusick "7", /*7*/
302*8184Smckusick "8", /*8*/
303*8184Smckusick "9", /*9*/
304*8184Smckusick "*", /***/
305*8184Smckusick "-", /*minus*/
306*8184Smckusick 0, /*fi*/
307*8184Smckusick 0, /*fl*/
308*8184Smckusick 0, /*ff*/
309*8184Smckusick 0, /*cent mark*/
310*8184Smckusick 0, /*ffl*/
311*8184Smckusick 0, /* ffi */
312*8184Smckusick "(", /*(*/
313*8184Smckusick ")", /*)*/
314*8184Smckusick "[", /*[*/
315*8184Smckusick "]", /*]*/
316*8184Smckusick 0, /*degree*/
317*8184Smckusick 0, /*dagger*/
318*8184Smckusick "=", /*=*/
319*8184Smckusick 0, /*registered*/
320*8184Smckusick ":", /*:*/
321*8184Smckusick "+", /*+*/
322*8184Smckusick 0, /*blank*/
323*8184Smckusick "!", /*!*/
324*8184Smckusick 0, /*bullet*/
325*8184Smckusick "?", /*?*/
326*8184Smckusick "'", /*foot mark*/
327*8184Smckusick "|", /*|*/
328*8184Smckusick 0, /*blank*/
329*8184Smckusick 0, /*copyright*/
330*8184Smckusick 0, /*square*/
331*8184Smckusick "$" }; /*$*/
332*8184Smckusick
333*8184Smckusick char *spectab[128] = {
334*8184Smckusick 0, /*blank*/
335*8184Smckusick 0, /*psi*/
336*8184Smckusick 0, /*theta*/
337*8184Smckusick 0, /*nu*/
338*8184Smckusick 0, /*mu*/
339*8184Smckusick 0, /*lambda*/
340*8184Smckusick 0, /*iota*/
341*8184Smckusick 0, /*zeta*/
342*8184Smckusick 0, /*sigma*/
343*8184Smckusick 0, /*delta*/
344*8184Smckusick 0, /*beta*/
345*8184Smckusick 0, /*xi*/
346*8184Smckusick 0, /*eta*/
347*8184Smckusick 0, /*phi*/
348*8184Smckusick "u", /*upsilon*/
349*8184Smckusick 0, /*kappa*/
350*8184Smckusick 0, /*blank*/
351*8184Smckusick 0, /*pi*/
352*8184Smckusick "@", /*at sign @*/
353*8184Smckusick 0, /*down arrow*/
354*8184Smckusick 0, /*blank*/
355*8184Smckusick 0, /*alpha*/
356*8184Smckusick "|", /*or*/
357*8184Smckusick 0, /*chi*/
358*8184Smckusick "\"", /*"*/
359*8184Smckusick 0, /*epsilon*/
360*8184Smckusick "=", /*equals*/
361*8184Smckusick "o", /*omicron*/
362*8184Smckusick 0, /*left arrow*/
363*8184Smckusick 0, /*rho*/
364*8184Smckusick 0, /*up arrow*/
365*8184Smckusick 0, /*tau*/
366*8184Smckusick "_", /*underrule*/
367*8184Smckusick "\\", /*\*/
368*8184Smckusick 0, /*Psi*/
369*8184Smckusick 0, /*bell system sign*/
370*8184Smckusick 0, /*infinity*/
371*8184Smckusick 0, /*gamma*/
372*8184Smckusick 0, /*improper superset*/
373*8184Smckusick 0, /*proportional to*/
374*8184Smckusick 0, /*right hand*/
375*8184Smckusick 0, /*omega*/
376*8184Smckusick 0, /*blank*/
377*8184Smckusick 0, /*gradient*/
378*8184Smckusick 0, /*blank*/
379*8184Smckusick 0, /*Phi*/
380*8184Smckusick 0, /*Theta*/
381*8184Smckusick 0, /*Omega*/
382*8184Smckusick 0, /*cup (union)*/
383*8184Smckusick 0, /*root en*/
384*8184Smckusick 0, /*terminal sigma*/
385*8184Smckusick 0, /*Lambda*/
386*8184Smckusick "-", /*some horizontal line*/
387*8184Smckusick 0, /*Gamma*/
388*8184Smckusick 0, /*integral sign*/
389*8184Smckusick 0, /*Pi*/
390*8184Smckusick 0, /*subset of*/
391*8184Smckusick 0, /*superset of*/
392*8184Smckusick 0, /*approximates*/
393*8184Smckusick 0, /*partial derivative*/
394*8184Smckusick 0, /*Delta*/
395*8184Smckusick 0, /*square root*/
396*8184Smckusick 0, /*Sigma*/
397*8184Smckusick 0, /*approx =*/
398*8184Smckusick 0, /*blank*/
399*8184Smckusick ">", /*>*/
400*8184Smckusick 0, /*Xi*/
401*8184Smckusick "<", /*<*/
402*8184Smckusick "/", /*slash (longer)*/
403*8184Smckusick 0, /*cap (intersection)*/
404*8184Smckusick "Y", /*Upsilon*/
405*8184Smckusick 0, /*not*/
406*8184Smckusick "|", /*right ceiling (rt of ")*/
407*8184Smckusick "|", /*left top (of big curly)*/
408*8184Smckusick "|", /*bold vertical*/
409*8184Smckusick "|", /*left center of big curly bracket*/
410*8184Smckusick "|", /*left bottom*/
411*8184Smckusick "|", /*right top*/
412*8184Smckusick "|", /*right center of big curly bracket*/
413*8184Smckusick "|", /*right bot*/
414*8184Smckusick "|", /*right floor (rb of ")*/
415*8184Smckusick "|", /*left floor (left bot of big sq bract)*/
416*8184Smckusick "|", /*left ceiling (lt of ")*/
417*8184Smckusick "x", /*multiply*/
418*8184Smckusick 0, /*divide*/
419*8184Smckusick 0, /*plus-minus*/
420*8184Smckusick 0, /*<=*/
421*8184Smckusick 0, /*>=*/
422*8184Smckusick 0, /*identically equal*/
423*8184Smckusick 0, /*not equal*/
424*8184Smckusick "{", /*{*/
425*8184Smckusick "}", /*}*/
426*8184Smckusick "'", /*' acute accent*/
427*8184Smckusick "`", /*` grave accent*/
428*8184Smckusick "^", /*^*/
429*8184Smckusick "#", /*sharp*/
430*8184Smckusick 0, /*left hand*/
431*8184Smckusick 0, /*member of*/
432*8184Smckusick "~", /*~*/
433*8184Smckusick 0, /*empty set*/
434*8184Smckusick 0, /*blank*/
435*8184Smckusick 0, /*dbl dagger*/
436*8184Smckusick "|", /*box rule*/
437*8184Smckusick "*", /*telephone asterisk?*/
438*8184Smckusick 0, /*improper subset*/
439*8184Smckusick 0, /*circle*/
440*8184Smckusick 0, /*blank*/
441*8184Smckusick "+", /*eqn plus sign*/
442*8184Smckusick 0, /*right arrow*/
443*8184Smckusick 0 }; /*section mark*/
444