Commit | Line | Data |
---|---|---|
1a3b21a9 DR |
1 | #include <stdio.h> |
2 | ||
3 | int tabflg; | |
4 | int labno = 1; | |
5 | FILE *curbuf; | |
6 | FILE *obuf; | |
7 | ||
8 | main(argc, argv) | |
9 | char **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; | |
60 | loop: | |
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'); | |
147 | subtre: | |
148 | snlflg = 1; | |
149 | t = 'A'; | |
150 | l1: | |
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 | } | |
198 | loop1: | |
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; | |
245 | pf: | |
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 | ||
309 | flag() { | |
310 | register c, f; | |
311 | ||
312 | f = 0; | |
313 | l1: | |
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 | ||
356 | put(c) | |
357 | { | |
358 | if (tabflg) { | |
359 | tabflg = 0; | |
360 | fprintf(curbuf, ">;.byte %o;<", c+0200); | |
361 | } else | |
362 | putc(c, curbuf); | |
363 | } |