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