update location of pc2 and pc3 for -T option.
[unix-history] / usr / src / usr.bin / pascal / pc2 / langpats.c
CommitLineData
b3e05d18
KM
1/* Copyright (c) 1979 Regents of the University of California */
2
25d46c52 3static 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
13struct 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\
261:\n\
27 addl3 $4,(sp)+,r1\n\
28 movzbl *(r1),r0\n\
29 incl (r1)\n\
302:\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\
361:\n\
37 movl (sp)+,r0\n\
38 addl3 $4,(sp)+,r1\n\
39 movb r0,*(r1)\n\
40 incl (r1)\n\
412:\n" },
42
25d46c52 43 { "3,_blkcpy\n",
b3e05d18
KM
44" movl 4(sp),r1\n\
45 movl 8(sp),r3\n\
461:\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
531:\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 621:\n\
25d46c52
KM
63 subl2 r0,(sp)\n\
64 movc5 $0,(r3),$0,r0,(r3)\n\
652:\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\
761:\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
851:\n\
86 locc r5,r4,(r1)\n\
872:\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 1221:\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\
1302:\n\
131 cmpc3 r4,(r1),(r3)\n\
132 jneq 3f\n\
133 incl r0\n\
134 jbr 4f\n\
1353:\n\
136 clrl r0\n\
1374:\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 1431:\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\
1512:\n\
152 cmpc3 r4,(r1),(r3)\n\
153 jeql 4f\n\
1543:\n\
b3e05d18 155 movl $1,r0\n\
f703f747 1564:\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 1621:\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\
1702:\n\
171 cmpc3 r4,(r1),(r3)\n\
1723:\n\
173 jlss 4f\n\
174 clrl r0\n\
175 jbr 5f\n\
1764:\n\
b3e05d18 177 movl $1,r0\n\
f703f747 1785:\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 1841:\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\
1922:\n\
193 cmpc3 r4,(r1),(r3)\n\
1943:\n\
195 jleq 4f\n\
196 clrl r0\n\
197 jbr 5f\n\
1984:\n\
b3e05d18 199 movl $1,r0\n\
f703f747 2005:\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 2061:\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\
2142:\n\
215 cmpc3 r4,(r1),(r3)\n\
2163:\n\
217 jgtr 4f\n\
218 clrl r0\n\
219 jbr 5f\n\
2204:\n\
b3e05d18 221 movl $1,r0\n\
f703f747 2225:\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 2281:\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\
2362:\n\
237 cmpc3 r4,(r1),(r3)\n\
2383:\n\
239 jgeq 4f\n\
240 clrl r0\n\
241 jbr 5f\n\
2424:\n\
b3e05d18 243 movl $1,r0\n\
f703f747 2445:\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\
2521:\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\
2621:\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\
2721:\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
2851:\n\
286 addl2 $4,sp\n" }
b3e05d18
KM
287};
288
289struct 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
309main(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 }
349copy:
350 fputs(line, stdout);
351nextline:;
352 }
353 exit(0);
354}