|
|
1.1 root 1: static char sccsid[] = "@(#)chktroff.c 4.1 (Berkeley) 9/12/82";
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*/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.