xref: /csrg-svn/old/refer/NOTUSED/thash.c (revision 12303)
1*12303Stut #ifndef lint
2*12303Stut static char *sccsid = "@(#)thash.c	4.1 (Berkeley) 05/06/83";
3*12303Stut #endif
4*12303Stut 
5*12303Stut #include <stdio.h>
6*12303Stut #define MAXLINE 750
7*12303Stut 
8*12303Stut int nh 500;
9*12303Stut int saw[6000];
10*12303Stut char *comname "/usr/lib/eign";
11*12303Stut 
12*12303Stut main (argc,argv)
13*12303Stut char *argv[];
14*12303Stut {
15*12303Stut 
16*12303Stut 	int i, z;
17*12303Stut 	char *name;
18*12303Stut 
19*12303Stut 	FILE *f;
20*12303Stut 
21*12303Stut 	while (argc>1 && argv[1][0] == '-')
22*12303Stut 	{
23*12303Stut 		switch(argv[1][1])
24*12303Stut 		{
25*12303Stut 		case 'h':
26*12303Stut 			nh = atoi(argv[1]+2);
27*12303Stut 			break;
28*12303Stut 		}
29*12303Stut 		argc--;
30*12303Stut 		argv++;
31*12303Stut 	}
32*12303Stut 	if (argc<=1)
33*12303Stut 		dofile(stdin, "");
34*12303Stut 	else
35*12303Stut 		for(i=1; i<argc; i++)
36*12303Stut 		{
37*12303Stut 			f = fopen(name=argv[i], "r");
38*12303Stut 			if (f==NULL)
39*12303Stut 				err("No file %s",name);
40*12303Stut 			else
41*12303Stut 				dofile(f, name);
42*12303Stut 		}
43*12303Stut 	for(z=i=0; i<nh; i++)
44*12303Stut 	{
45*12303Stut 		if (saw[i]) z++;
46*12303Stut 	}
47*12303Stut 	printf("hashes %d used %d\n",nh,z);
48*12303Stut }
49*12303Stut 
50*12303Stut dofile(f, name)
51*12303Stut FILE *f;
52*12303Stut char *name;
53*12303Stut {
54*12303Stut 	/* read file f & spit out keys & ptrs */
55*12303Stut 	char line[MAXLINE], *s;
56*12303Stut 	char key[20], *p;
57*12303Stut 	int k 0;
58*12303Stut 	int c, lim;
59*12303Stut 	int alph 0;
60*12303Stut 	int used 0;
61*12303Stut 	long lp 0;
62*12303Stut 
63*12303Stut 	while (fgets(line, MAXLINE, f))
64*12303Stut 	{
65*12303Stut 		k++;
66*12303Stut 		used=alph=0;
67*12303Stut 		lim = strlen(line);
68*12303Stut 		p = key;
69*12303Stut 		for(s=line; c= *s; s++)
70*12303Stut 		{
71*12303Stut 			if (isalpha(c) || isdigit(c))
72*12303Stut 			{
73*12303Stut 				if (alph++ < 6)
74*12303Stut 					*p++ = c;
75*12303Stut 			}
76*12303Stut 			else
77*12303Stut 			{
78*12303Stut 				*p = 0;
79*12303Stut 				if (outkey(p=key))
80*12303Stut 				{
81*12303Stut 					tkey(key,k);
82*12303Stut 					used=1;
83*12303Stut 				}
84*12303Stut 				alph=0;
85*12303Stut 			}
86*12303Stut 		}
87*12303Stut 		lp += lim;
88*12303Stut 	}
89*12303Stut }
90*12303Stut 
91*12303Stut outkey( ky)
92*12303Stut char *ky;
93*12303Stut {
94*12303Stut 	int n;
95*12303Stut 	n = strlen(ky);
96*12303Stut 	if (n<3) return(0);
97*12303Stut 	if (isdigit(ky[0]))
98*12303Stut 		if (ky[0] != '1' || ky[1] != '9' || n!= 4) return(0);
99*12303Stut 	return(1);
100*12303Stut }
101*12303Stut 
102*12303Stut hash (s)
103*12303Stut char *s;
104*12303Stut {
105*12303Stut 	int c, n, q;
106*12303Stut 	for(q=n=0; c= *s; s++)
107*12303Stut 		n += (c*n + c << (n%4));
108*12303Stut 	return(n);
109*12303Stut }
110*12303Stut 
111*12303Stut err (s, a)
112*12303Stut char *s;
113*12303Stut {
114*12303Stut 	fprintf(stderr, "Error: ");
115*12303Stut 	fprintf(stderr, s, a);
116*12303Stut 	putc('\n', stderr);
117*12303Stut }
118*12303Stut 
119*12303Stut prefix(t, s)
120*12303Stut char *t, *s;
121*12303Stut {
122*12303Stut 	int c, d;
123*12303Stut 	while ( (c= *t++) == *s++)
124*12303Stut 		if (c==0) return(1);
125*12303Stut 	return(c==0 ? 1: 0);
126*12303Stut }
127*12303Stut 
128*12303Stut mindex(s, c)
129*12303Stut char *s;
130*12303Stut {
131*12303Stut 	register char *p;
132*12303Stut 	for( p=s; *p; p++)
133*12303Stut 		if (*p ==c)
134*12303Stut 			return(p);
135*12303Stut 	return(0);
136*12303Stut }
137*12303Stut 
138*12303Stut tkey(s,nw)
139*12303Stut char *s;
140*12303Stut {
141*12303Stut 	int x;
142*12303Stut 	x = abs(hash(s)) % nh;
143*12303Stut 	/* if (saw[x]) printf("%d %d\n", x, nw); */
144*12303Stut 	saw[x]= nw;
145*12303Stut }
146*12303Stut 
147*12303Stut abs(n)
148*12303Stut {
149*12303Stut 	return(n>0 ? n : -n);
150*12303Stut }
151