X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=hash.c;h=ac9dc1c881b057d9d02f8b1be88a91ee684d0563;hp=f04258956fe71ebe8fd18b0a8c6b8c49dd81aa4d;hb=49f1156410e9a037404101696d37b2c0d5c67564;hpb=e83ad1be25aefea3ed21ec08edbaf2d5a72c4a9d diff --git a/hash.c b/hash.c index f042589..ac9dc1c 100644 --- a/hash.c +++ b/hash.c @@ -15,6 +15,8 @@ #include #include +#include + #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; @@ -97,9 +99,9 @@ int hash_insert (HASH * table, const char *key, void *data, int allow_dup) int r; for (tmp = table->table[h], last = NULL; tmp; last = tmp, tmp = tmp->next) { - r = mutt_strcmp (tmp->key, key); + r = str_cmp (tmp->key, key); if (r == 0) { - FREE (&ptr); + p_delete(&ptr); return (-1); } if (r > 0) @@ -120,7 +122,7 @@ void *hash_find_hash (const HASH * table, int hash, const char *key) struct hash_elem *ptr = table->table[hash]; for (; ptr; ptr = ptr->next) { - if (mutt_strcmp (key, ptr->key) == 0) + if (str_cmp (key, ptr->key) == 0) return (ptr->data); } return NULL; @@ -133,11 +135,11 @@ void hash_delete_hash (HASH * table, int hash, const char *key, const void *data struct hash_elem **last = &table->table[hash]; while (ptr) { - if ((data == ptr->data || !data) && mutt_strcmp (ptr->key, key) == 0) { + if ((data == ptr->data || !data) && str_cmp (ptr->key, key) == 0) { *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); }