X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-lib%2Fhash.c;h=2bfc65ad8136baf9f6a43cba4624a54c7d42edbc;hp=eea6cd6e1da5ef259ac13bd1605d5d28ace711d1;hb=51239e43fd4a3c2440b4574379e8525d75646b3e;hpb=9233c1f8fefc6ecfe015682f532a7f1ff5038143 diff --git a/lib-lib/hash.c b/lib-lib/hash.c index eea6cd6..2bfc65a 100644 --- a/lib-lib/hash.c +++ b/lib-lib/hash.c @@ -39,39 +39,40 @@ int hash_string(const unsigned char *s, int n) return (h % n); } -HASH *hash_create(int nelem) +HASH *hash_create(int nelem, int allow_dup) { HASH *table = p_new(HASH, 1); - if (nelem == 0) - nelem = 2; - - table->nelem = nelem; + table->dupes = allow_dup; + table->nelem = MIN(nelem, 2); table->curnelem = 0; - table->table = p_new(struct hash_elem *, nelem); + table->table = p_new(struct hash_elem *, table->nelem); + return table; } -HASH *hash_resize(HASH *ptr, int nelem) +void hash_resize(HASH *ptr, int nelem) { HASH *table; struct hash_elem *elem, *tmp; int i; - table = hash_create (nelem); + /* XXX hack: we know the has was correct, no dupe checks is fater */ + table = hash_create(nelem, 1); for (i = 0; i < ptr->nelem; i++) { for (elem = ptr->table[i]; elem;) { tmp = elem; elem = elem->next; - hash_insert(table, tmp->key, tmp->data, 1); + hash_insert(table, tmp->key, tmp->data); p_delete(&tmp); } } - p_delete(&ptr->table); - p_delete(&ptr); - return table; + p_delete(&ptr->table); + ptr->nelem = table->nelem; + ptr->table = table->table; + p_delete(&table); } /* table hash table to update @@ -79,7 +80,7 @@ HASH *hash_resize(HASH *ptr, int nelem) * data data to associate with `key' * allow_dup if nonzero, duplicate keys are allowed in the table */ -int hash_insert(HASH *table, const char *key, void *data, int allow_dup) +int hash_insert(HASH *table, const char *key, void *data) { struct hash_elem *ptr; int h; @@ -89,7 +90,7 @@ int hash_insert(HASH *table, const char *key, void *data, int allow_dup) ptr->key = key; ptr->data = data; - if (allow_dup) { + if (table->dupes) { ptr->next = table->table[h]; table->table[h] = ptr; table->curnelem++;