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