Research V7 development
[unix-history] / usr / src / cmd / c / cvopt.c
CommitLineData
1a3b21a9
DR
1#include <stdio.h>
2
3int tabflg;
4int labno = 1;
5FILE *curbuf;
6FILE *obuf;
7
8main(argc, argv)
9char **argv;
10{
11/*
12 A1 -> A
13 A2 B
14 A O
15 B1 C
16 B2 D
17 BE L
18 BF P
19 C1 E
20 C2 F
21 F G
22 H H
23 R I
24 R1 J
25 S K
26 I M
27 M N
28
29 * +1
30 S +2
31 C +4
32 1 +8
33
34 z -> 4
35 c 10
36 a 14
37 e 20
38 n 63
39 * +0100
40*/
41
42 int c, snlflg, nlflg, t, smode, m, ssmode, peekc;
43
44 smode = nlflg = snlflg = ssmode = 0;
45 if (argc>1)
46 if (freopen(argv[1], "r", stdin) == NULL) {
47 fprintf(stderr, "%s?\n", argv[1]);
48 return(1);
49 }
50 if (argc>2)
51 if (freopen(argv[2], "w", stdout) == NULL) {
52 fprintf(stderr, "%s?\n", argv[2]);
53 return(1);
54 }
55 if ((obuf = fopen("cvopt.tmp", "w")) == NULL) {
56 fprintf(stderr, "cvopt.tmp?\n");
57 exit(1);
58 }
59 curbuf = obuf;
60loop:
61 c = getchar();
62 if (c!='\n' && c!='\t')
63 nlflg = 0;
64 if (ssmode!=0 && c!='%') {
65 ssmode = 0;
66 curbuf = stdout;
67 fprintf(curbuf, "L%d:<", labno++);
68 }
69 switch(c) {
70
71 case EOF:
72 fprintf(obuf, "0\n");
73 fclose(obuf);
74 fprintf(stdout, ".even\n");
75 if (freopen("cvopt.tmp", "r", stdin) == NULL) {
76 fprintf(stderr, "tmp?\n");
77 exit(1);
78 }
79 while ((c = getchar()) != EOF)
80 putchar(c);
81 unlink("cvopt.tmp");
82 return(0);
83
84 case ':':
85 if (!smode)
86 fprintf(curbuf, "=.+2; 0"); else
87 put(':');
88 goto loop;
89
90 case 'A':
91 if ((c=getchar())=='1' || c=='2') {
92 put(c+'A'-'1');
93 goto loop;
94 }
95 put('O');
96 ungetc(c, stdin);
97 goto loop;
98
99 case 'B':
100 switch (getchar()) {
101
102 case '1':
103 put('C');
104 goto loop;
105
106 case '2':
107 put('D');
108 goto loop;
109
110 case 'E':
111 put('L');
112 goto loop;
113
114 case 'F':
115 put('P');
116 goto loop;
117 }
118 put('?');
119 goto loop;
120
121 case 'C':
122 put(getchar()+'E'-'1');
123 goto loop;
124
125 case 'F':
126 put('G');
127 goto subtre;
128
129 case 'R':
130 if ((c=getchar()) == '1')
131 put('J'); else {
132 put('I');
133 ungetc(c, stdin);
134 }
135 goto loop;
136
137 case 'H':
138 put('H');
139 goto subtre;
140
141 case 'I':
142 put('M');
143 goto loop;
144
145 case 'S':
146 put('K');
147subtre:
148 snlflg = 1;
149 t = 'A';
150l1:
151 switch (c=getchar()) {
152
153 case '*':
154 t++;
155 goto l1;
156
157 case 'S':
158 t =+ 2;
159 goto l1;
160
161 case 'C':
162 t =+ 4;
163 goto l1;
164
165 case '1':
166 t =+ 8;
167 goto l1;
168
169 case '2':
170 t =+ 16;
171 goto l1;
172 }
173 ungetc(c, stdin);
174 put(t);
175 goto loop;
176
177 case '#':
178 if(getchar()=='1')
179 put('#'); else
180 put('"');
181 goto loop;
182
183 case '%':
184 if (smode)
185 curbuf = obuf;
186 if (ssmode==0) {
187 if ((peekc=getchar())=='[') {
188 curbuf = stdout;
189 while((c=getchar())!=']')
190 put(c);
191 getchar();
192 fprintf(curbuf, ";");
193 curbuf = obuf;
194 goto loop;
195 }
196 ungetc(peekc, stdin);
197 }
198loop1:
199 switch (c=getchar()) {
200
201 case ' ':
202 case '\t':
203 goto loop1;
204 case 'a':
205 m = 16;
206 t = flag();
207 goto pf;
208
209 case ',':
210 put(';');
211 goto loop1;
212
213 case 'i':
214 m = 12;
215 t = flag();
216 goto pf;
217 case 'z':
218 m = 4;
219 t = flag();
220 goto pf;
221
222 case 'r':
223 m = 9;
224 t = flag();
225 goto pf;
226
227 case '1':
228 m = 5;
229 t = flag();
230 goto pf;
231
232 case 'c':
233 t = 0;
234 m = 8;
235 goto pf;
236
237 case 'e':
238 t = flag();
239 m = 20;
240 goto pf;
241
242 case 'n':
243 t = flag();
244 m = 63;
245pf:
246 if ((c=getchar())=='*')
247 m =+ 0100; else
248 ungetc(c, stdin);
249 fprintf(curbuf, ".byte %o,%o", m, t);
250 goto loop1;
251 case '[':
252 fprintf(curbuf, "L%d=", labno++);
253 while ((c=getchar())!=']')
254 put(c);
255 ssmode = 0;
256 smode = 0;
257 goto loop;
258
259 case '\n':
260 fprintf(curbuf, "\nL%d\n", labno);
261 ssmode = 1;
262 nlflg = 1;
263 smode = 1;
264 goto loop;
265 }
266 put(c);
267 goto loop1;
268
269 case '\t':
270 if (nlflg) {
271 nlflg = 0;
272 goto loop;
273 }
274 if (smode) {
275 tabflg++;
276 goto loop;
277 }
278 put('\t');
279 goto loop;
280
281 case '\n':
282 if (!smode) {
283 put('\n');
284 goto loop;
285 }
286 if (nlflg) {
287 nlflg = 0;
288 fprintf(curbuf, "\\0>\n");
289 curbuf = obuf;
290 smode = 0;
291 goto loop;
292 }
293 if (!snlflg)
294 fprintf(curbuf, "\\n");
295 snlflg = 0;
296 fprintf(curbuf, ">\n<");
297 nlflg = 1;
298 goto loop;
299
300 case 'X':
301 case 'Y':
302 case 'T':
303 snlflg++;
304 }
305 put(c);
306 goto loop;
307}
308
309flag() {
310 register c, f;
311
312 f = 0;
313l1:
314 switch(c=getchar()) {
315
316 case 'w':
317 f = 1;
318 goto l1;
319
320 case 'i':
321 f = 2;
322 goto l1;
323
324 case 'b':
325 f = 3;
326 goto l1;
327
328 case 'f':
329 f = 4;
330 goto l1;
331
332 case 'd':
333 f = 5;
334 goto l1;
335
336 case 'u':
337 f = 9;
338 goto l1;
339
340 case 's':
341 f = 6;
342 goto l1;
343
344 case 'l':
345 f = 8;
346 goto l1;
347
348 case 'p':
349 f =+ 16;
350 goto l1;
351 }
352 ungetc(c, stdin);
353 return(f);
354}
355
356put(c)
357{
358 if (tabflg) {
359 tabflg = 0;
360 fprintf(curbuf, ">;.byte %o;<", c+0200);
361 } else
362 putc(c, curbuf);
363}