12086Smckusick /* Copyright (c) 1979 Regents of the University of California */ 22086Smckusick 3*2189Smckusic static char sccsid[] = "@(#)langpats.c 1.3 01/16/81"; 42086Smckusick 52086Smckusick #include <stdio.h> 62086Smckusick #include <ctype.h> 72086Smckusick /* 82086Smckusick * The hash table must be at least twice as big as the number 92086Smckusick * of patterns, preferably bigger. It must also be a prime number 102086Smckusick */ 112086Smckusick #define HSHSIZ 101 122086Smckusick 132086Smckusick struct pats { 142086Smckusick char *name; 152086Smckusick char *replace; 162086Smckusick } ptab[] = { 172086Smckusick 18*2189Smckusic { "1,_ACTFILE\n", 192086Smckusick " movl (sp)+,r1\n\ 202086Smckusick movl 12(r1),r0\n" }, 212086Smckusick 22*2189Smckusic { "1,_fgetc\n", 23*2189Smckusic " sobgeq *(sp),1f\n\ 242086Smckusick calls $1,__filbuf\n\ 252086Smckusick jbr 2f\n\ 262086Smckusick 1:\n\ 272086Smckusick addl3 $4,(sp)+,r1\n\ 282086Smckusick movzbl *(r1),r0\n\ 292086Smckusick incl (r1)\n\ 302086Smckusick 2:\n" }, 312086Smckusick 32*2189Smckusic { "2,_fputc\n", 33*2189Smckusic " sobgeq *4(sp),1f\n\ 342086Smckusick calls $2,__flsbuf\n\ 352086Smckusick jbr 2f\n\ 362086Smckusick 1:\n\ 372086Smckusick movl (sp)+,r0\n\ 382086Smckusick addl3 $4,(sp)+,r1\n\ 392086Smckusick movb r0,*(r1)\n\ 402086Smckusick incl (r1)\n\ 412086Smckusick 2:\n" }, 422086Smckusick 43*2189Smckusic { "3,_blkcpy\n", 442086Smckusick " movl 4(sp),r1\n\ 452086Smckusick movl 8(sp),r3\n\ 462086Smckusick 1:\n\ 472086Smckusick movzwl $65535,r0\n\ 482086Smckusick cmpl (sp),r0\n\ 492102Smckusic jleq 1f\n\ 502086Smckusick subl2 r0,(sp)\n\ 512086Smckusick movc3 r0,(r1),(r3)\n\ 522102Smckusic jbr 1b\n\ 532086Smckusick 1:\n\ 542086Smckusick movl (sp)+,r0\n\ 552086Smckusick addl2 $8,sp\n\ 562086Smckusick movc3 r0,(r1),(r3)\n" }, 572086Smckusick 58*2189Smckusic { "2,_blkclr\n", 592086Smckusick " movl 4(sp),r3\n\ 60*2189Smckusic subl3 r3,r3,-4(sp)\n\ 61*2189Smckusic jbr 2f\n\ 622086Smckusick 1:\n\ 63*2189Smckusic subl2 r0,(sp)\n\ 64*2189Smckusic movc5 $0,(r3),$0,r0,(r3)\n\ 65*2189Smckusic 2:\n\ 662086Smckusick movzwl $65535,r0\n\ 672086Smckusick cmpl (sp),r0\n\ 68*2189Smckusic jgtr 1b\n\ 69*2189Smckusic movq (sp)+,r0\n\ 70*2189Smckusic movc5 $0,(r3),$0,r0,(r3)\n" }, 712086Smckusick 72*2189Smckusic { "3,_LOCC\n", 732086Smckusick " movl (sp)+,r5\n\ 742086Smckusick movl (sp)+,r4\n\ 752086Smckusick movl (sp)+,r1\n\ 762086Smckusick 1:\n\ 772086Smckusick movzwl $65535,r0\n\ 782086Smckusick cmpl r4,r0\n\ 792102Smckusic jleq 1f\n\ 802086Smckusick subl2 r0,r4\n\ 812086Smckusick locc r5,r0,(r1)\n\ 822102Smckusic jeql 1b\n\ 832086Smckusick addl2 r4,r0\n\ 842102Smckusic jbr 2f\n\ 852086Smckusick 1:\n\ 862086Smckusick locc r5,r4,(r1)\n\ 872086Smckusick 2:\n" }, 882086Smckusick 89*2189Smckusic { "1,_ROUND\n", 902086Smckusick " cvtrdl (sp)+,r0\n" }, 912086Smckusick 92*2189Smckusic { "1,_TRUNC\n", 932086Smckusick " cvtdl (sp)+,r0\n" }, 942086Smckusick 95*2189Smckusic { "1,_FCALL\n", 962086Smckusick " movl (sp),r0\n\ 972086Smckusick ashl $3,4(r0),r1\n\ 982086Smckusick movc3 r1,__disply+8,8(r0)[r1]\n\ 992086Smckusick movl (sp),r0\n\ 1002086Smckusick ashl $3,4(r0),r1\n\ 1012086Smckusick movc3 r1,8(r0),__disply+8\n\ 1022086Smckusick movl *(sp)+,r0\n" }, 1032086Smckusick 104*2189Smckusic { "2,_FRTN\n", 1052086Smckusick " movl (sp)+,r0\n\ 1062086Smckusick ashl $3,4(r0),r1\n\ 1072086Smckusick movc3 r1,8(r0)[r1],__disply+8\n\ 1082086Smckusick movl (sp)+,r0\n" }, 1092086Smckusick 110*2189Smckusic { "3,_FSAV\n", 1112086Smckusick " movl 8(sp),r0\n\ 1122086Smckusick movl (sp)+,(r0)\n\ 1132086Smckusick movl (sp)+,4(r0)\n\ 1142086Smckusick ashl $3,4(r0),r1\n\ 1152086Smckusick movc3 r1,__disply+8,8(r0)\n\ 1162086Smckusick movl (sp)+,r0\n" }, 1172086Smckusick 118*2189Smckusic { "3,_RELEQ\n", 1192102Smckusic " movl (sp)+,r4\n\ 1202102Smckusic movl (sp)+,r1\n\ 1212102Smckusic movl (sp)+,r3\n\ 1222102Smckusic 1:\n\ 1232102Smckusic movzwl $65535,r0\n\ 1242102Smckusic cmpl r4,r0\n\ 1252102Smckusic jleq 2f\n\ 1262102Smckusic subl2 r0,r4\n\ 1272102Smckusic cmpc3 r0,(r1),(r3)\n\ 1282102Smckusic jeql 1b\n\ 1292102Smckusic jbr 3f\n\ 1302102Smckusic 2:\n\ 1312102Smckusic cmpc3 r4,(r1),(r3)\n\ 1322102Smckusic jneq 3f\n\ 1332102Smckusic incl r0\n\ 1342102Smckusic jbr 4f\n\ 1352102Smckusic 3:\n\ 1362086Smckusick clrl r0\n\ 1372102Smckusic 4:\n" }, 1382086Smckusick 139*2189Smckusic { "3,_RELNE\n", 1402102Smckusic " movl (sp)+,r4\n\ 1412102Smckusic movl (sp)+,r1\n\ 1422102Smckusic movl (sp)+,r3\n\ 1432086Smckusick 1:\n\ 1442102Smckusic movzwl $65535,r0\n\ 1452102Smckusic cmpl r4,r0\n\ 1462102Smckusic jleq 2f\n\ 1472102Smckusic subl2 r0,r4\n\ 1482102Smckusic cmpc3 r0,(r1),(r3)\n\ 1492102Smckusic jeql 1b\n\ 1502102Smckusic jbr 3f\n\ 1512102Smckusic 2:\n\ 1522102Smckusic cmpc3 r4,(r1),(r3)\n\ 1532102Smckusic jeql 4f\n\ 1542102Smckusic 3:\n\ 1552086Smckusick movl $1,r0\n\ 1562102Smckusic 4:\n" }, 1572086Smckusick 158*2189Smckusic { "3,_RELSLT\n", 1592102Smckusic " movl (sp)+,r4\n\ 1602102Smckusic movl (sp)+,r1\n\ 1612102Smckusic movl (sp)+,r3\n\ 1622102Smckusic 1:\n\ 1632102Smckusic movzwl $65535,r0\n\ 1642102Smckusic cmpl r4,r0\n\ 1652102Smckusic jleq 2f\n\ 1662102Smckusic subl2 r0,r4\n\ 1672102Smckusic cmpc3 r0,(r1),(r3)\n\ 1682102Smckusic jeql 1b\n\ 1692102Smckusic jbr 3f\n\ 1702102Smckusic 2:\n\ 1712102Smckusic cmpc3 r4,(r1),(r3)\n\ 1722102Smckusic 3:\n\ 1732102Smckusic jlss 4f\n\ 1742086Smckusick clrl r0\n\ 1752102Smckusic jbr 5f\n\ 1762102Smckusic 4:\n\ 1772086Smckusick movl $1,r0\n\ 1782102Smckusic 5:\n" }, 1792086Smckusick 180*2189Smckusic { "3,_RELSLE\n", 1812102Smckusic " movl (sp)+,r4\n\ 1822102Smckusic movl (sp)+,r1\n\ 1832102Smckusic movl (sp)+,r3\n\ 1842102Smckusic 1:\n\ 1852102Smckusic movzwl $65535,r0\n\ 1862102Smckusic cmpl r4,r0\n\ 1872102Smckusic jleq 2f\n\ 1882102Smckusic subl2 r0,r4\n\ 1892102Smckusic cmpc3 r0,(r1),(r3)\n\ 1902102Smckusic jeql 1b\n\ 1912102Smckusic jbr 3f\n\ 1922102Smckusic 2:\n\ 1932102Smckusic cmpc3 r4,(r1),(r3)\n\ 1942102Smckusic 3:\n\ 1952102Smckusic jleq 4f\n\ 1962086Smckusick clrl r0\n\ 1972102Smckusic jbr 5f\n\ 1982102Smckusic 4:\n\ 1992086Smckusick movl $1,r0\n\ 2002102Smckusic 5:\n" }, 2012086Smckusick 202*2189Smckusic { "3,_RELSGT\n", 2032102Smckusic " movl (sp)+,r4\n\ 2042102Smckusic movl (sp)+,r1\n\ 2052102Smckusic movl (sp)+,r3\n\ 2062102Smckusic 1:\n\ 2072102Smckusic movzwl $65535,r0\n\ 2082102Smckusic cmpl r4,r0\n\ 2092102Smckusic jleq 2f\n\ 2102102Smckusic subl2 r0,r4\n\ 2112102Smckusic cmpc3 r0,(r1),(r3)\n\ 2122102Smckusic jeql 1b\n\ 2132102Smckusic jbr 3f\n\ 2142102Smckusic 2:\n\ 2152102Smckusic cmpc3 r4,(r1),(r3)\n\ 2162102Smckusic 3:\n\ 2172102Smckusic jgtr 4f\n\ 2182086Smckusick clrl r0\n\ 2192102Smckusic jbr 5f\n\ 2202102Smckusic 4:\n\ 2212086Smckusick movl $1,r0\n\ 2222102Smckusic 5:\n" }, 2232086Smckusick 224*2189Smckusic { "3,_RELSGE\n", 2252102Smckusic " movl (sp)+,r4\n\ 2262102Smckusic movl (sp)+,r1\n\ 2272102Smckusic movl (sp)+,r3\n\ 2282102Smckusic 1:\n\ 2292102Smckusic movzwl $65535,r0\n\ 2302102Smckusic cmpl r4,r0\n\ 2312102Smckusic jleq 2f\n\ 2322102Smckusic subl2 r0,r4\n\ 2332102Smckusic cmpc3 r0,(r1),(r3)\n\ 2342102Smckusic jeql 1b\n\ 2352102Smckusic jbr 3f\n\ 2362102Smckusic 2:\n\ 2372102Smckusic cmpc3 r4,(r1),(r3)\n\ 2382102Smckusic 3:\n\ 2392102Smckusic jgeq 4f\n\ 2402086Smckusick clrl r0\n\ 2412102Smckusic jbr 5f\n\ 2422102Smckusic 4:\n\ 2432086Smckusick movl $1,r0\n\ 2442102Smckusic 5:\n" }, 2452086Smckusick 246*2189Smckusic { "4,_ADDT\n", 2472086Smckusick " movl (sp)+,r0\n\ 2482086Smckusick movl (sp)+,r1\n\ 2492086Smckusick movl (sp)+,r2\n\ 2502086Smckusick movl r0,r3\n\ 2512086Smckusick movl (sp)+,r4\n\ 2522086Smckusick 1:\n\ 2532086Smckusick bisl3 (r1)+,(r2)+,(r3)+\n\ 2542086Smckusick sobgtr r4,1b\n" }, 2552086Smckusick 256*2189Smckusic { "4,_SUBT\n", 2572086Smckusick " movl (sp)+,r0\n\ 2582086Smckusick movl (sp)+,r1\n\ 2592086Smckusick movl (sp)+,r2\n\ 2602086Smckusick movl r0,r3\n\ 2612086Smckusick movl (sp)+,r4\n\ 2622086Smckusick 1:\n\ 2632086Smckusick bicl3 (r2)+,(r1)+,(r3)+\n\ 2642086Smckusick sobgtr r4,1b\n" }, 2652086Smckusick 266*2189Smckusic { "4,_MULT\n", 2672086Smckusick " movl (sp)+,r0\n\ 2682086Smckusick movl (sp)+,r1\n\ 2692086Smckusick movl (sp)+,r2\n\ 2702086Smckusick movl r0,r3\n\ 2712086Smckusick movl (sp)+,r4\n\ 2722086Smckusick 1:\n\ 2732086Smckusick mcoml (r1)+,r5\n\ 2742086Smckusick bicl3 r5,(r2)+,(r3)+\n\ 2752086Smckusick sobgtr r4,1b\n" }, 2762086Smckusick 277*2189Smckusic { "4,_IN\n", 2782086Smckusick " clrl r0\n\ 2792086Smckusick movl (sp)+,r1\n\ 2802086Smckusick subl2 (sp)+,r1\n\ 2812086Smckusick cmpl r1,(sp)+\n\ 2822102Smckusic jgtru 1f\n\ 283*2189Smckusic jbc r1,*(sp),1f\n\ 2842086Smckusick movl $1,r0\n\ 285*2189Smckusic 1:\n\ 286*2189Smckusic addl2 $4,sp\n" } 2872086Smckusick }; 2882086Smckusick 2892086Smckusick struct pats *htbl[HSHSIZ]; 2902086Smckusick 2912086Smckusick 2922086Smckusick #define CHK(c) if (*cp++ != c) goto copy; 2932086Smckusick 2942086Smckusick #define HASH(cp, hp) {\ 2952086Smckusick hash = 0; rehash = 1; ccp = cp; \ 2962086Smckusick do { \ 2972086Smckusick hash *= (int)*ccp++; \ 2982086Smckusick } while (*ccp && *ccp != '\n'); \ 2992086Smckusick hash >>= 7; hash %= HSHSIZ; hp = &htbl[hash]; size = ccp - cp + 1; \ 3002086Smckusick } 3012086Smckusick 3022086Smckusick #define REHASH(hp) {\ 3032086Smckusick hp += rehash; rehash += 2; \ 3042086Smckusick if (hp >= &htbl[HSHSIZ]) \ 3052086Smckusick hp -= HSHSIZ; \ 3062086Smckusick } 3072086Smckusick 3082086Smckusick 3092086Smckusick main(argc, argv) 3102086Smckusick 3112086Smckusick int argc; 3122086Smckusick char **argv; 3132086Smckusick { 3142086Smckusick register struct pats *pp; 3152086Smckusick register struct pats **hp; 3162086Smckusick register char *cp, *ccp; 3172086Smckusick register int hash, rehash, size; 3182086Smckusick char line[BUFSIZ]; 3192086Smckusick 3202086Smckusick if (argc > 1) 3212086Smckusick freopen(argv[1], "r", stdin); 3222086Smckusick if (argc > 2) 3232086Smckusick freopen(argv[2], "w", stdout); 3242086Smckusick /* 3252086Smckusick * set up the hash table 3262086Smckusick */ 3272086Smckusick for(pp = ptab; pp < &ptab[sizeof ptab/sizeof ptab[0]]; pp++) { 3282086Smckusick HASH(pp->name, hp); 3292086Smckusick while (*hp) 3302086Smckusick REHASH(hp); 3312086Smckusick *hp = pp; 3322086Smckusick } 3332086Smckusick /* 3342086Smckusick * check each line and replace as appropriate 3352086Smckusick */ 3362086Smckusick while (fgets(line, BUFSIZ, stdin)) { 3372086Smckusick for (cp = line; *cp && *cp == '\t'; ) 3382086Smckusick cp++; 339*2189Smckusic CHK('c'); CHK('a'); CHK('l'); CHK('l'); CHK('s'); 340*2189Smckusic CHK('\t'); CHK('$'); 3412086Smckusick HASH(cp, hp); 3422086Smckusick while (*hp) { 3432086Smckusick if (RELEQ(size, (*hp)->name, cp)) { 3442086Smckusick fputs((*hp)->replace, stdout); 3452086Smckusick goto nextline; 3462086Smckusick } 3472086Smckusick REHASH(hp); 3482086Smckusick } 3492086Smckusick copy: 3502086Smckusick fputs(line, stdout); 3512086Smckusick nextline:; 3522086Smckusick } 3532086Smckusick exit(0); 3542086Smckusick } 355