#include #include #include #include "hash.h" static ulong *crctab; void inithash(void) { crctab = mkcrctab(0xEDB88320); } Hash* newhash(void) { Hash *h; h = mallocz(sizeof(*h), 1); h->sz = 128; h->items = mallocz(h->sz * sizeof(HashItem*), 1); return h; } void freehash(Hash *h) { if(h == nil) return; free(h->items); h->sz = 0; free(h); } int lenhash(Hash *h) { return h->nitems; } void puthash(Hash *h, char *str, HashItem *item) { ulong crc; crc = blockcrc(crctab, 0, str, strlen(str)); item->crc = crc; strncpy(item->key, str, sizeof(item->key)-1); crc %= h->sz; item->next = h->items[crc]; h->items[crc] = item; h->nitems++; } void* gethash(Hash *h, char *str) { ulong crc, idx; HashItem *i; crc = blockcrc(crctab, 0, str, strlen(str)); idx = crc % h->sz; for(i = h->items[idx]; i != nil; i = i->next){ if(i->crc == crc){ return i; } } return nil; } void* delhash(Hash *h, char *str) { ulong crc, idx; HashItem *i, *prev; prev = nil; crc = blockcrc(crctab, 0, str, strlen(str)); idx = crc % h->sz; for(i = h->items[idx]; i != nil; i = i->next){ if(i->crc == crc){ if(i == h->items[idx]){ h->items[idx] = i->next; } else { prev->next = i->next; } h->nitems--; return i; } else { prev = i->next; } } return nil; } void forhash(Hash *h, void (*f)(void*)) { int i; HashItem *c; for(i = 0; i < h->sz; i++){ for(c = h->items[i]; c != nil; c = c->next){ f(c); } } }