xref: /csrg-svn/old/refer/NOTUSED/thash.c (revision 37895)
112303Stut #ifndef lint
2*37895Sbostic static char *sccsid = "@(#)thash.c	4.2 (Berkeley) 05/11/89";
312303Stut #endif
412303Stut 
512303Stut #include <stdio.h>
6*37895Sbostic #include "pathnames.h"
7*37895Sbostic 
812303Stut #define MAXLINE 750
912303Stut 
1012303Stut int nh 500;
1112303Stut int saw[6000];
12*37895Sbostic char *comname = _PATH_EIGN;
1312303Stut 
1412303Stut main (argc,argv)
1512303Stut char *argv[];
1612303Stut {
1712303Stut 
1812303Stut 	int i, z;
1912303Stut 	char *name;
2012303Stut 
2112303Stut 	FILE *f;
2212303Stut 
2312303Stut 	while (argc>1 && argv[1][0] == '-')
2412303Stut 	{
2512303Stut 		switch(argv[1][1])
2612303Stut 		{
2712303Stut 		case 'h':
2812303Stut 			nh = atoi(argv[1]+2);
2912303Stut 			break;
3012303Stut 		}
3112303Stut 		argc--;
3212303Stut 		argv++;
3312303Stut 	}
3412303Stut 	if (argc<=1)
3512303Stut 		dofile(stdin, "");
3612303Stut 	else
3712303Stut 		for(i=1; i<argc; i++)
3812303Stut 		{
3912303Stut 			f = fopen(name=argv[i], "r");
4012303Stut 			if (f==NULL)
4112303Stut 				err("No file %s",name);
4212303Stut 			else
4312303Stut 				dofile(f, name);
4412303Stut 		}
4512303Stut 	for(z=i=0; i<nh; i++)
4612303Stut 	{
4712303Stut 		if (saw[i]) z++;
4812303Stut 	}
4912303Stut 	printf("hashes %d used %d\n",nh,z);
5012303Stut }
5112303Stut 
5212303Stut dofile(f, name)
5312303Stut FILE *f;
5412303Stut char *name;
5512303Stut {
5612303Stut 	/* read file f & spit out keys & ptrs */
5712303Stut 	char line[MAXLINE], *s;
5812303Stut 	char key[20], *p;
5912303Stut 	int k 0;
6012303Stut 	int c, lim;
6112303Stut 	int alph 0;
6212303Stut 	int used 0;
6312303Stut 	long lp 0;
6412303Stut 
6512303Stut 	while (fgets(line, MAXLINE, f))
6612303Stut 	{
6712303Stut 		k++;
6812303Stut 		used=alph=0;
6912303Stut 		lim = strlen(line);
7012303Stut 		p = key;
7112303Stut 		for(s=line; c= *s; s++)
7212303Stut 		{
7312303Stut 			if (isalpha(c) || isdigit(c))
7412303Stut 			{
7512303Stut 				if (alph++ < 6)
7612303Stut 					*p++ = c;
7712303Stut 			}
7812303Stut 			else
7912303Stut 			{
8012303Stut 				*p = 0;
8112303Stut 				if (outkey(p=key))
8212303Stut 				{
8312303Stut 					tkey(key,k);
8412303Stut 					used=1;
8512303Stut 				}
8612303Stut 				alph=0;
8712303Stut 			}
8812303Stut 		}
8912303Stut 		lp += lim;
9012303Stut 	}
9112303Stut }
9212303Stut 
9312303Stut outkey( ky)
9412303Stut char *ky;
9512303Stut {
9612303Stut 	int n;
9712303Stut 	n = strlen(ky);
9812303Stut 	if (n<3) return(0);
9912303Stut 	if (isdigit(ky[0]))
10012303Stut 		if (ky[0] != '1' || ky[1] != '9' || n!= 4) return(0);
10112303Stut 	return(1);
10212303Stut }
10312303Stut 
10412303Stut hash (s)
10512303Stut char *s;
10612303Stut {
10712303Stut 	int c, n, q;
10812303Stut 	for(q=n=0; c= *s; s++)
10912303Stut 		n += (c*n + c << (n%4));
11012303Stut 	return(n);
11112303Stut }
11212303Stut 
11312303Stut err (s, a)
11412303Stut char *s;
11512303Stut {
11612303Stut 	fprintf(stderr, "Error: ");
11712303Stut 	fprintf(stderr, s, a);
11812303Stut 	putc('\n', stderr);
11912303Stut }
12012303Stut 
12112303Stut prefix(t, s)
12212303Stut char *t, *s;
12312303Stut {
12412303Stut 	int c, d;
12512303Stut 	while ( (c= *t++) == *s++)
12612303Stut 		if (c==0) return(1);
12712303Stut 	return(c==0 ? 1: 0);
12812303Stut }
12912303Stut 
13012303Stut mindex(s, c)
13112303Stut char *s;
13212303Stut {
13312303Stut 	register char *p;
13412303Stut 	for( p=s; *p; p++)
13512303Stut 		if (*p ==c)
13612303Stut 			return(p);
13712303Stut 	return(0);
13812303Stut }
13912303Stut 
14012303Stut tkey(s,nw)
14112303Stut char *s;
14212303Stut {
14312303Stut 	int x;
14412303Stut 	x = abs(hash(s)) % nh;
14512303Stut 	/* if (saw[x]) printf("%d %d\n", x, nw); */
14612303Stut 	saw[x]= nw;
14712303Stut }
14812303Stut 
14912303Stut abs(n)
15012303Stut {
15112303Stut 	return(n>0 ? n : -n);
15212303Stut }
153