void inithash(void) { char buf[512]; int mesgpt = 0; rewind(mesgread); while (fgetNUL(buf, sizeof buf, mesgread) != 0) { hashit(buf, 0, mesgpt); mesgpt += strlen(buf) + 2; } }
static void inithash(void) { char buf[BUFSIZ]; FILE *mesgread = fopen(strings, "r"); if (mesgread == NULL) return; for (;;) { mesgpt = tellpt; if (fgetNUL(buf, sizeof buf, mesgread) == 0) break; ignore(hashit(buf, 0)); } ignore(fclose(mesgread)); }
unsigned hashit(char *str, int really, unsigned fakept) { int i; struct hash *hp; char buf[512]; long hashval = 0; char *cp; if (really) fflush(mesgwrite); for (cp = str; *cp;) hashval = (hashval << 1) + *cp++; i = hashval % NBUCKETS; if (i < 0) i += NBUCKETS; if (really != 0) for (hp = bucket[i]; hp != 0; hp = hp->hnext) if (hp->hval == hashval) { fseek(mesgread, (long) hp->hpt, 0); fgetNUL(buf, sizeof buf, mesgread); /* fprintf(stderr, "Got (from %d) %s\n", hp->hpt, buf); */ if (strcmp(buf, str) == 0) break; } if (!really || hp == 0) { hp = (struct hash *) calloc(1, sizeof *hp); if (hp == NULL) err(1, NULL); hp->hnext = bucket[i]; hp->hval = hashval; hp->hpt = really ? ftell(mesgwrite) : fakept; if (really) { fwrite(str, sizeof (char), strlen(str) + 1, mesgwrite); fwrite("\n", sizeof (char), 1, mesgwrite); } bucket[i] = hp; } /* fprintf(stderr, "%s hashed to %ld at %d\n", str, hp->hval, hp->hpt); */ return (hp->hpt); }
static int hashit(char *str, char really, unsigned int fakept) { int i; struct hash *hp; char buf[512]; long hashval = 0; char *cp; if (really) (void) fflush(mesgwrite); for (cp = str; *cp; ) hashval = (hashval << 1) + *cp++; i = hashval % NBUCKETS; if (i < 0) i += NBUCKETS; if (really != 0) for (hp = bucket[i]; hp != 0; hp = hp->hnext) if (hp->hval == hashval) { (void) fseek(mesgread, (long)hp->hpt, 0); (void) fgetNUL(buf, sizeof (buf), mesgread); if (strcmp(buf, str) == 0) break; } if (!really || hp == 0) { hp = (struct hash *)calloc(1, sizeof (*hp)); hp->hnext = bucket[i]; hp->hval = hashval; hp->hpt = really ? ftell(mesgwrite) : fakept; if (really) { (void) fwrite(str, sizeof (char), strlen(str) + 1, mesgwrite); (void) fwrite("\n", sizeof (char), 1, mesgwrite); } bucket[i] = hp; } return (hp->hpt); }