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