simplify hashes.
[apps/madmutt.git] / lib-lib / hash.c
index eea6cd6..2bfc65a 100644 (file)
@@ -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++;