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