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