fix regressions
[apps/madmutt.git] / hash.c
diff --git a/hash.c b/hash.c
index 96a97ac..ac9dc1c 100644 (file)
--- a/hash.c
+++ b/hash.c
@@ -15,6 +15,8 @@
 #include <stdio.h>
 #include <string.h>
 
+#include <lib-lib/mem.h>
+
 #include "mutt.h"
 
 #include "lib/mem.h"
@@ -40,17 +42,17 @@ int hash_string (const unsigned char *s, int n)
 
 HASH *hash_create (int nelem)
 {
-  HASH *table = safe_malloc (sizeof (HASH));
+  HASH *table = p_new(HASH, 1);
 
   if (nelem == 0)
     nelem = 2;
   table->nelem = nelem;
   table->curnelem = 0;
-  table->table = safe_calloc (nelem, sizeof (struct hash_elem *));
+  table->table = p_new(struct hash_elem *, nelem);
   return table;
 }
 
-HASH *hash_resize (HASH * ptr, int nelem)
+HASH *hash_resize(HASH *ptr, int nelem)
 {
   HASH *table;
   struct hash_elem *elem, *tmp;
@@ -63,11 +65,11 @@ HASH *hash_resize (HASH * ptr, int nelem)
       tmp = elem;
       elem = elem->next;
       hash_insert (table, tmp->key, tmp->data, 1);
-      FREE (&tmp);
+      p_delete(&tmp);
     }
   }
-  FREE (&ptr->table);
-  FREE (&ptr);
+  p_delete(&ptr->table);
+  p_delete(&ptr);
 
   return table;
 }
@@ -82,7 +84,7 @@ int hash_insert (HASH * table, const char *key, void *data, int allow_dup)
   struct hash_elem *ptr;
   int h;
 
-  ptr = (struct hash_elem *) safe_malloc (sizeof (struct hash_elem));
+  ptr = p_new(struct hash_elem, 1);
   h = hash_string ((unsigned char *) key, table->nelem);
   ptr->key = key;
   ptr->data = data;
@@ -99,7 +101,7 @@ int hash_insert (HASH * table, const char *key, void *data, int allow_dup)
     for (tmp = table->table[h], last = NULL; tmp; last = tmp, tmp = tmp->next) {
       r = str_cmp (tmp->key, key);
       if (r == 0) {
-        FREE (&ptr);
+        p_delete(&ptr);
         return (-1);
       }
       if (r > 0)
@@ -137,7 +139,7 @@ void hash_delete_hash (HASH * table, int hash, const char *key, const void *data
       *last = ptr->next;
       if (destroy)
         destroy (ptr->data);
-      FREE (&ptr);
+      p_delete(&ptr);
 
       ptr = *last;
     } else {
@@ -162,9 +164,23 @@ void hash_destroy (HASH ** ptr, void (*destroy) (void *))
       elem = elem->next;
       if (destroy)
         destroy (tmp->data);
-      FREE (&tmp);
+      p_delete(&tmp);
     }
   }
-  FREE (&pptr->table);
-  FREE (ptr);
+  p_delete(&pptr->table);
+  p_delete(ptr);
+}
+
+void hash_map (HASH* table, void (*mapfunc) (const char* key, void* data,
+                                             unsigned long more),
+               unsigned long more) {
+  int i = 0;
+  struct hash_elem* elem = NULL;
+
+  if (!table || !mapfunc)
+    return;
+
+  for (i = 0; i < table->nelem; i++)
+    for (elem = table->table[i]; elem; elem = elem->next)
+      mapfunc (elem->key, elem->data, more);
 }