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