|
|
1.1 root 1: #include <stdio.h>
2: #include <ctype.h>
3: /*
4: * The hash table must be at least twice as big as the number
5: * of patterns, preferably bigger. It must also be a prime number
6: */
7: #define HSHSIZ 101
8:
9: struct pats {
10: char *name;
11: char *replace;
12: } ptab[] = {
13:
14: { "ACTFILE\n",
15: " movl (sp)+,r1\n\
16: movl 12(r1),r0\n" },
17:
18: { "fgetc\n",
19: " decl *(sp)\n\
20: jgeq 1f\n\
21: calls $1,__filbuf\n\
22: jbr 2f\n\
23: 1:\n\
24: addl3 $4,(sp)+,r1\n\
25: movzbl *(r1),r0\n\
26: incl (r1)\n\
27: 2:\n" },
28:
29: { "fputc\n",
30: " decl *4(sp)\n\
31: jgeq 1f\n\
32: calls $2,__flsbuf\n\
33: jbr 2f\n\
34: 1:\n\
35: movl (sp)+,r0\n\
36: addl3 $4,(sp)+,r1\n\
37: movb r0,*(r1)\n\
38: incl (r1)\n\
39: 2:\n" },
40:
41: { "MOVC3\n",
42: " movl (sp)+,r5\n\
43: movc3 r5,*(sp)+,*(sp)+\n" },
44:
45: { "LOCC\n",
46: " movl (sp)+,r5\n\
47: movl (sp)+,r4\n\
48: locc r5,r4,*(sp)+\n" },
49:
50: { "ROUND\n",
51: " cvtrdl (sp)+,r0\n" },
52:
53: { "TRUNC\n",
54: " cvtdl (sp)+,r0\n" },
55:
56: { "FCALL\n",
57: " movl (sp),r0\n\
58: ashl $3,4(r0),r1\n\
59: movc3 r1,__disply+8,8(r0)[r1]\n\
60: movl (sp),r0\n\
61: ashl $3,4(r0),r1\n\
62: movc3 r1,8(r0),__disply+8\n\
63: movl *(sp)+,r0\n" },
64:
65: { "FRTN\n",
66: " movl (sp)+,r0\n\
67: ashl $3,4(r0),r1\n\
68: movc3 r1,8(r0)[r1],__disply+8\n\
69: movl (sp)+,r0\n" },
70:
71: { "FSAV\n",
72: " movl 8(sp),r0\n\
73: movl (sp)+,(r0)\n\
74: movl (sp)+,4(r0)\n\
75: ashl $3,4(r0),r1\n\
76: movc3 r1,__disply+8,8(r0)\n\
77: movl (sp)+,r0\n" },
78:
79: { "RELEQ\n",
80: " movl (sp)+,r1\n\
81: cmpc3 r1,*(sp)+,*(sp)+\n\
82: beql 1f\n\
83: clrl r0\n\
84: brb 2f\n\
85: 1:\n\
86: movl $1,r0\n\
87: 2:\n" },
88:
89: { "RELNE\n",
90: " movl (sp)+,r1\n\
91: cmpc3 r1,*(sp)+,*(sp)+\n\
92: bneq 1f\n\
93: clrl r0\n\
94: brb 2f\n\
95: 1:\n\
96: movl $1,r0\n\
97: 2:\n" },
98:
99: { "RELSLT\n",
100: " movl (sp)+,r1\n\
101: cmpc3 r1,*(sp)+,*(sp)+\n\
102: blss 1f\n\
103: clrl r0\n\
104: brb 2f\n\
105: 1:\n\
106: movl $1,r0\n\
107: 2:\n" },
108:
109: { "RELSLE\n",
110: " movl (sp)+,r1\n\
111: cmpc3 r1,*(sp)+,*(sp)+\n\
112: bleq 1f\n\
113: clrl r0\n\
114: brb 2f\n\
115: 1:\n\
116: movl $1,r0\n\
117: 2:\n" },
118:
119: { "RELSGT\n",
120: " movl (sp)+,r1\n\
121: cmpc3 r1,*(sp)+,*(sp)+\n\
122: bgtr 1f\n\
123: clrl r0\n\
124: brb 2f\n\
125: 1:\n\
126: movl $1,r0\n\
127: 2:\n" },
128:
129: { "RELSGE\n",
130: " movl (sp)+,r1\n\
131: cmpc3 r1,*(sp)+,*(sp)+\n\
132: bgeq 1f\n\
133: clrl r0\n\
134: brb 2f\n\
135: 1:\n\
136: movl $1,r0\n\
137: 2:\n" },
138:
139: { "ADDT\n",
140: " movl (sp)+,r0\n\
141: movl (sp)+,r1\n\
142: movl (sp)+,r2\n\
143: movl r0,r3\n\
144: movl (sp)+,r4\n\
145: 1:\n\
146: bisl3 (r1)+,(r2)+,(r3)+\n\
147: sobgtr r4,1b\n" },
148:
149: { "SUBT\n",
150: " movl (sp)+,r0\n\
151: movl (sp)+,r1\n\
152: movl (sp)+,r2\n\
153: movl r0,r3\n\
154: movl (sp)+,r4\n\
155: 1:\n\
156: bicl3 (r2)+,(r1)+,(r3)+\n\
157: sobgtr r4,1b\n" },
158:
159: { "MULT\n",
160: " movl (sp)+,r0\n\
161: movl (sp)+,r1\n\
162: movl (sp)+,r2\n\
163: movl r0,r3\n\
164: movl (sp)+,r4\n\
165: 1:\n\
166: mcoml (r1)+,r5\n\
167: bicl3 r5,(r2)+,(r3)+\n\
168: sobgtr r4,1b\n" },
169:
170: { "IN\n",
171: " clrl r0\n\
172: movl (sp)+,r1\n\
173: subl2 (sp)+,r1\n\
174: cmpl r1,(sp)+\n\
175: bgtru 1f\n\
176: bbc r1,*(sp)+,1f\n\
177: movl $1,r0\n\
178: 1:\n" }
179: };
180:
181: struct pats *htbl[HSHSIZ];
182:
183:
184: #define CHK(c) if (*cp++ != c) goto copy;
185:
186: #define HASH(cp, hp) {\
187: hash = 0; rehash = 1; ccp = cp; \
188: do { \
189: hash *= (int)*ccp++; \
190: } while (*ccp && *ccp != '\n'); \
191: hash >>= 7; hash %= HSHSIZ; hp = &htbl[hash]; size = ccp - cp + 1; \
192: }
193:
194: #define REHASH(hp) {\
195: hp += rehash; rehash += 2; \
196: if (hp >= &htbl[HSHSIZ]) \
197: hp -= HSHSIZ; \
198: }
199:
200:
201: main(argc, argv)
202:
203: int argc;
204: char **argv;
205: {
206: register struct pats *pp;
207: register struct pats **hp;
208: register char *cp, *ccp;
209: register int hash, rehash, size;
210: char line[BUFSIZ];
211:
212: if (argc > 1)
213: freopen(argv[1], "r", stdin);
214: if (argc > 2)
215: freopen(argv[2], "w", stdout);
216: /*
217: * set up the hash table
218: */
219: for(pp = ptab; pp < &ptab[sizeof ptab/sizeof ptab[0]]; pp++) {
220: HASH(pp->name, hp);
221: while (*hp)
222: REHASH(hp);
223: *hp = pp;
224: }
225: /*
226: * check each line and replace as appropriate
227: */
228: while (fgets(line, BUFSIZ, stdin)) {
229: for (cp = line; *cp && *cp == '\t'; )
230: cp++;
231: CHK('c'); CHK('a'); CHK('l'); CHK('l'); CHK('s'); CHK('\t');
232: CHK('$'); if (!isdigit(*cp++)) goto copy; CHK(','); CHK('_');
233: HASH(cp, hp);
234: while (*hp) {
235: if (RELEQ(size, (*hp)->name, cp)) {
236: fputs((*hp)->replace, stdout);
237: goto nextline;
238: }
239: REHASH(hp);
240: }
241: copy:
242: fputs(line, stdout);
243: nextline:;
244: }
245: exit(0);
246: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.