xref: /csrg-svn/old/berknet/chktroff.c (revision 8184)
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