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