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