Commit | Line | Data |
---|---|---|
b3e05d18 KM |
1 | /* Copyright (c) 1979 Regents of the University of California */ |
2 | ||
25d46c52 | 3 | static char sccsid[] = "@(#)langpats.c 1.3 %G%"; |
b3e05d18 KM |
4 | |
5 | #include <stdio.h> | |
6 | #include <ctype.h> | |
7 | /* | |
8 | * The hash table must be at least twice as big as the number | |
9 | * of patterns, preferably bigger. It must also be a prime number | |
10 | */ | |
11 | #define HSHSIZ 101 | |
12 | ||
13 | struct pats { | |
14 | char *name; | |
15 | char *replace; | |
16 | } ptab[] = { | |
17 | ||
25d46c52 | 18 | { "1,_ACTFILE\n", |
b3e05d18 KM |
19 | " movl (sp)+,r1\n\ |
20 | movl 12(r1),r0\n" }, | |
21 | ||
25d46c52 KM |
22 | { "1,_fgetc\n", |
23 | " sobgeq *(sp),1f\n\ | |
b3e05d18 KM |
24 | calls $1,__filbuf\n\ |
25 | jbr 2f\n\ | |
26 | 1:\n\ | |
27 | addl3 $4,(sp)+,r1\n\ | |
28 | movzbl *(r1),r0\n\ | |
29 | incl (r1)\n\ | |
30 | 2:\n" }, | |
31 | ||
25d46c52 KM |
32 | { "2,_fputc\n", |
33 | " sobgeq *4(sp),1f\n\ | |
b3e05d18 KM |
34 | calls $2,__flsbuf\n\ |
35 | jbr 2f\n\ | |
36 | 1:\n\ | |
37 | movl (sp)+,r0\n\ | |
38 | addl3 $4,(sp)+,r1\n\ | |
39 | movb r0,*(r1)\n\ | |
40 | incl (r1)\n\ | |
41 | 2:\n" }, | |
42 | ||
25d46c52 | 43 | { "3,_blkcpy\n", |
b3e05d18 KM |
44 | " movl 4(sp),r1\n\ |
45 | movl 8(sp),r3\n\ | |
46 | 1:\n\ | |
47 | movzwl $65535,r0\n\ | |
48 | cmpl (sp),r0\n\ | |
f703f747 | 49 | jleq 1f\n\ |
b3e05d18 KM |
50 | subl2 r0,(sp)\n\ |
51 | movc3 r0,(r1),(r3)\n\ | |
f703f747 | 52 | jbr 1b\n\ |
b3e05d18 KM |
53 | 1:\n\ |
54 | movl (sp)+,r0\n\ | |
55 | addl2 $8,sp\n\ | |
56 | movc3 r0,(r1),(r3)\n" }, | |
57 | ||
25d46c52 | 58 | { "2,_blkclr\n", |
b3e05d18 | 59 | " movl 4(sp),r3\n\ |
25d46c52 KM |
60 | subl3 r3,r3,-4(sp)\n\ |
61 | jbr 2f\n\ | |
b3e05d18 | 62 | 1:\n\ |
25d46c52 KM |
63 | subl2 r0,(sp)\n\ |
64 | movc5 $0,(r3),$0,r0,(r3)\n\ | |
65 | 2:\n\ | |
b3e05d18 KM |
66 | movzwl $65535,r0\n\ |
67 | cmpl (sp),r0\n\ | |
25d46c52 KM |
68 | jgtr 1b\n\ |
69 | movq (sp)+,r0\n\ | |
70 | movc5 $0,(r3),$0,r0,(r3)\n" }, | |
b3e05d18 | 71 | |
25d46c52 | 72 | { "3,_LOCC\n", |
b3e05d18 KM |
73 | " movl (sp)+,r5\n\ |
74 | movl (sp)+,r4\n\ | |
75 | movl (sp)+,r1\n\ | |
76 | 1:\n\ | |
77 | movzwl $65535,r0\n\ | |
78 | cmpl r4,r0\n\ | |
f703f747 | 79 | jleq 1f\n\ |
b3e05d18 KM |
80 | subl2 r0,r4\n\ |
81 | locc r5,r0,(r1)\n\ | |
f703f747 | 82 | jeql 1b\n\ |
b3e05d18 | 83 | addl2 r4,r0\n\ |
f703f747 | 84 | jbr 2f\n\ |
b3e05d18 KM |
85 | 1:\n\ |
86 | locc r5,r4,(r1)\n\ | |
87 | 2:\n" }, | |
88 | ||
25d46c52 | 89 | { "1,_ROUND\n", |
b3e05d18 KM |
90 | " cvtrdl (sp)+,r0\n" }, |
91 | ||
25d46c52 | 92 | { "1,_TRUNC\n", |
b3e05d18 KM |
93 | " cvtdl (sp)+,r0\n" }, |
94 | ||
25d46c52 | 95 | { "1,_FCALL\n", |
b3e05d18 KM |
96 | " movl (sp),r0\n\ |
97 | ashl $3,4(r0),r1\n\ | |
98 | movc3 r1,__disply+8,8(r0)[r1]\n\ | |
99 | movl (sp),r0\n\ | |
100 | ashl $3,4(r0),r1\n\ | |
101 | movc3 r1,8(r0),__disply+8\n\ | |
102 | movl *(sp)+,r0\n" }, | |
103 | ||
25d46c52 | 104 | { "2,_FRTN\n", |
b3e05d18 KM |
105 | " movl (sp)+,r0\n\ |
106 | ashl $3,4(r0),r1\n\ | |
107 | movc3 r1,8(r0)[r1],__disply+8\n\ | |
108 | movl (sp)+,r0\n" }, | |
109 | ||
25d46c52 | 110 | { "3,_FSAV\n", |
b3e05d18 KM |
111 | " movl 8(sp),r0\n\ |
112 | movl (sp)+,(r0)\n\ | |
113 | movl (sp)+,4(r0)\n\ | |
114 | ashl $3,4(r0),r1\n\ | |
115 | movc3 r1,__disply+8,8(r0)\n\ | |
116 | movl (sp)+,r0\n" }, | |
117 | ||
25d46c52 | 118 | { "3,_RELEQ\n", |
f703f747 KM |
119 | " movl (sp)+,r4\n\ |
120 | movl (sp)+,r1\n\ | |
121 | movl (sp)+,r3\n\ | |
b3e05d18 | 122 | 1:\n\ |
f703f747 KM |
123 | movzwl $65535,r0\n\ |
124 | cmpl r4,r0\n\ | |
125 | jleq 2f\n\ | |
126 | subl2 r0,r4\n\ | |
127 | cmpc3 r0,(r1),(r3)\n\ | |
128 | jeql 1b\n\ | |
129 | jbr 3f\n\ | |
130 | 2:\n\ | |
131 | cmpc3 r4,(r1),(r3)\n\ | |
132 | jneq 3f\n\ | |
133 | incl r0\n\ | |
134 | jbr 4f\n\ | |
135 | 3:\n\ | |
136 | clrl r0\n\ | |
137 | 4:\n" }, | |
b3e05d18 | 138 | |
25d46c52 | 139 | { "3,_RELNE\n", |
f703f747 KM |
140 | " movl (sp)+,r4\n\ |
141 | movl (sp)+,r1\n\ | |
142 | movl (sp)+,r3\n\ | |
b3e05d18 | 143 | 1:\n\ |
f703f747 KM |
144 | movzwl $65535,r0\n\ |
145 | cmpl r4,r0\n\ | |
146 | jleq 2f\n\ | |
147 | subl2 r0,r4\n\ | |
148 | cmpc3 r0,(r1),(r3)\n\ | |
149 | jeql 1b\n\ | |
150 | jbr 3f\n\ | |
151 | 2:\n\ | |
152 | cmpc3 r4,(r1),(r3)\n\ | |
153 | jeql 4f\n\ | |
154 | 3:\n\ | |
b3e05d18 | 155 | movl $1,r0\n\ |
f703f747 | 156 | 4:\n" }, |
b3e05d18 | 157 | |
25d46c52 | 158 | { "3,_RELSLT\n", |
f703f747 KM |
159 | " movl (sp)+,r4\n\ |
160 | movl (sp)+,r1\n\ | |
161 | movl (sp)+,r3\n\ | |
b3e05d18 | 162 | 1:\n\ |
f703f747 KM |
163 | movzwl $65535,r0\n\ |
164 | cmpl r4,r0\n\ | |
165 | jleq 2f\n\ | |
166 | subl2 r0,r4\n\ | |
167 | cmpc3 r0,(r1),(r3)\n\ | |
168 | jeql 1b\n\ | |
169 | jbr 3f\n\ | |
170 | 2:\n\ | |
171 | cmpc3 r4,(r1),(r3)\n\ | |
172 | 3:\n\ | |
173 | jlss 4f\n\ | |
174 | clrl r0\n\ | |
175 | jbr 5f\n\ | |
176 | 4:\n\ | |
b3e05d18 | 177 | movl $1,r0\n\ |
f703f747 | 178 | 5:\n" }, |
b3e05d18 | 179 | |
25d46c52 | 180 | { "3,_RELSLE\n", |
f703f747 KM |
181 | " movl (sp)+,r4\n\ |
182 | movl (sp)+,r1\n\ | |
183 | movl (sp)+,r3\n\ | |
b3e05d18 | 184 | 1:\n\ |
f703f747 KM |
185 | movzwl $65535,r0\n\ |
186 | cmpl r4,r0\n\ | |
187 | jleq 2f\n\ | |
188 | subl2 r0,r4\n\ | |
189 | cmpc3 r0,(r1),(r3)\n\ | |
190 | jeql 1b\n\ | |
191 | jbr 3f\n\ | |
192 | 2:\n\ | |
193 | cmpc3 r4,(r1),(r3)\n\ | |
194 | 3:\n\ | |
195 | jleq 4f\n\ | |
196 | clrl r0\n\ | |
197 | jbr 5f\n\ | |
198 | 4:\n\ | |
b3e05d18 | 199 | movl $1,r0\n\ |
f703f747 | 200 | 5:\n" }, |
b3e05d18 | 201 | |
25d46c52 | 202 | { "3,_RELSGT\n", |
f703f747 KM |
203 | " movl (sp)+,r4\n\ |
204 | movl (sp)+,r1\n\ | |
205 | movl (sp)+,r3\n\ | |
b3e05d18 | 206 | 1:\n\ |
f703f747 KM |
207 | movzwl $65535,r0\n\ |
208 | cmpl r4,r0\n\ | |
209 | jleq 2f\n\ | |
210 | subl2 r0,r4\n\ | |
211 | cmpc3 r0,(r1),(r3)\n\ | |
212 | jeql 1b\n\ | |
213 | jbr 3f\n\ | |
214 | 2:\n\ | |
215 | cmpc3 r4,(r1),(r3)\n\ | |
216 | 3:\n\ | |
217 | jgtr 4f\n\ | |
218 | clrl r0\n\ | |
219 | jbr 5f\n\ | |
220 | 4:\n\ | |
b3e05d18 | 221 | movl $1,r0\n\ |
f703f747 | 222 | 5:\n" }, |
b3e05d18 | 223 | |
25d46c52 | 224 | { "3,_RELSGE\n", |
f703f747 KM |
225 | " movl (sp)+,r4\n\ |
226 | movl (sp)+,r1\n\ | |
227 | movl (sp)+,r3\n\ | |
b3e05d18 | 228 | 1:\n\ |
f703f747 KM |
229 | movzwl $65535,r0\n\ |
230 | cmpl r4,r0\n\ | |
231 | jleq 2f\n\ | |
232 | subl2 r0,r4\n\ | |
233 | cmpc3 r0,(r1),(r3)\n\ | |
234 | jeql 1b\n\ | |
235 | jbr 3f\n\ | |
236 | 2:\n\ | |
237 | cmpc3 r4,(r1),(r3)\n\ | |
238 | 3:\n\ | |
239 | jgeq 4f\n\ | |
240 | clrl r0\n\ | |
241 | jbr 5f\n\ | |
242 | 4:\n\ | |
b3e05d18 | 243 | movl $1,r0\n\ |
f703f747 | 244 | 5:\n" }, |
b3e05d18 | 245 | |
25d46c52 | 246 | { "4,_ADDT\n", |
b3e05d18 KM |
247 | " movl (sp)+,r0\n\ |
248 | movl (sp)+,r1\n\ | |
249 | movl (sp)+,r2\n\ | |
250 | movl r0,r3\n\ | |
251 | movl (sp)+,r4\n\ | |
252 | 1:\n\ | |
253 | bisl3 (r1)+,(r2)+,(r3)+\n\ | |
254 | sobgtr r4,1b\n" }, | |
255 | ||
25d46c52 | 256 | { "4,_SUBT\n", |
b3e05d18 KM |
257 | " movl (sp)+,r0\n\ |
258 | movl (sp)+,r1\n\ | |
259 | movl (sp)+,r2\n\ | |
260 | movl r0,r3\n\ | |
261 | movl (sp)+,r4\n\ | |
262 | 1:\n\ | |
263 | bicl3 (r2)+,(r1)+,(r3)+\n\ | |
264 | sobgtr r4,1b\n" }, | |
265 | ||
25d46c52 | 266 | { "4,_MULT\n", |
b3e05d18 KM |
267 | " movl (sp)+,r0\n\ |
268 | movl (sp)+,r1\n\ | |
269 | movl (sp)+,r2\n\ | |
270 | movl r0,r3\n\ | |
271 | movl (sp)+,r4\n\ | |
272 | 1:\n\ | |
273 | mcoml (r1)+,r5\n\ | |
274 | bicl3 r5,(r2)+,(r3)+\n\ | |
275 | sobgtr r4,1b\n" }, | |
276 | ||
25d46c52 | 277 | { "4,_IN\n", |
b3e05d18 KM |
278 | " clrl r0\n\ |
279 | movl (sp)+,r1\n\ | |
280 | subl2 (sp)+,r1\n\ | |
281 | cmpl r1,(sp)+\n\ | |
f703f747 | 282 | jgtru 1f\n\ |
25d46c52 | 283 | jbc r1,*(sp),1f\n\ |
b3e05d18 | 284 | movl $1,r0\n\ |
25d46c52 KM |
285 | 1:\n\ |
286 | addl2 $4,sp\n" } | |
b3e05d18 KM |
287 | }; |
288 | ||
289 | struct pats *htbl[HSHSIZ]; | |
290 | ||
291 | ||
292 | #define CHK(c) if (*cp++ != c) goto copy; | |
293 | ||
294 | #define HASH(cp, hp) {\ | |
295 | hash = 0; rehash = 1; ccp = cp; \ | |
296 | do { \ | |
297 | hash *= (int)*ccp++; \ | |
298 | } while (*ccp && *ccp != '\n'); \ | |
299 | hash >>= 7; hash %= HSHSIZ; hp = &htbl[hash]; size = ccp - cp + 1; \ | |
300 | } | |
301 | ||
302 | #define REHASH(hp) {\ | |
303 | hp += rehash; rehash += 2; \ | |
304 | if (hp >= &htbl[HSHSIZ]) \ | |
305 | hp -= HSHSIZ; \ | |
306 | } | |
307 | ||
308 | ||
309 | main(argc, argv) | |
310 | ||
311 | int argc; | |
312 | char **argv; | |
313 | { | |
314 | register struct pats *pp; | |
315 | register struct pats **hp; | |
316 | register char *cp, *ccp; | |
317 | register int hash, rehash, size; | |
318 | char line[BUFSIZ]; | |
319 | ||
320 | if (argc > 1) | |
321 | freopen(argv[1], "r", stdin); | |
322 | if (argc > 2) | |
323 | freopen(argv[2], "w", stdout); | |
324 | /* | |
325 | * set up the hash table | |
326 | */ | |
327 | for(pp = ptab; pp < &ptab[sizeof ptab/sizeof ptab[0]]; pp++) { | |
328 | HASH(pp->name, hp); | |
329 | while (*hp) | |
330 | REHASH(hp); | |
331 | *hp = pp; | |
332 | } | |
333 | /* | |
334 | * check each line and replace as appropriate | |
335 | */ | |
336 | while (fgets(line, BUFSIZ, stdin)) { | |
337 | for (cp = line; *cp && *cp == '\t'; ) | |
338 | cp++; | |
25d46c52 KM |
339 | CHK('c'); CHK('a'); CHK('l'); CHK('l'); CHK('s'); |
340 | CHK('\t'); CHK('$'); | |
b3e05d18 KM |
341 | HASH(cp, hp); |
342 | while (*hp) { | |
343 | if (RELEQ(size, (*hp)->name, cp)) { | |
344 | fputs((*hp)->replace, stdout); | |
345 | goto nextline; | |
346 | } | |
347 | REHASH(hp); | |
348 | } | |
349 | copy: | |
350 | fputs(line, stdout); | |
351 | nextline:; | |
352 | } | |
353 | exit(0); | |
354 | } |