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