X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=hash.c;h=0e2192bfe8a4b9485054490649a3142a31c55373;hp=c0edb306899ae4b2b64492d699274b6044033ee9;hb=ef7b80006ebb47372d69c64e8b2b2f0764333d55;hpb=6833ce8bdca2d64e14485118f2a4417b7e1cb1b1 diff --git a/hash.c b/hash.c index c0edb30..0e2192b 100644 --- a/hash.c +++ b/hash.c @@ -1,20 +1,15 @@ /* + * Copyright notice from original mutt: * Copyright (C) 1996-2000 Michael R. Elkins * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. - */ + * This file is part of mutt-ng, see http://www.muttng.org/. + * It's licensed under the GNU General Public License, + * please see the file GPL in the top level source directory. + */ + +#if HAVE_CONFIG_H +# include "config.h" +#endif #include #include @@ -22,6 +17,8 @@ #include "mutt.h" +#include "lib/mem.h" + #define SOMEPRIME 149711 int hash_string (const unsigned char *s, int n) @@ -43,16 +40,17 @@ int hash_string (const unsigned char *s, int n) HASH *hash_create (int nelem) { - HASH *table = safe_malloc (sizeof (HASH)); + HASH *table = mem_malloc (sizeof (HASH)); + if (nelem == 0) nelem = 2; table->nelem = nelem; table->curnelem = 0; - table->table = safe_calloc (nelem, sizeof (struct hash_elem *)); + table->table = mem_calloc (nelem, sizeof (struct hash_elem *)); return table; } -HASH *hash_resize (HASH *ptr, int nelem) +HASH *hash_resize (HASH * ptr, int nelem) { HASH *table; struct hash_elem *elem, *tmp; @@ -60,18 +58,16 @@ HASH *hash_resize (HASH *ptr, int nelem) table = hash_create (nelem); - for (i = 0; i < ptr->nelem; i++) - { - for (elem = ptr->table[i]; elem; ) - { + 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); - FREE (&tmp); + mem_free (&tmp); } } - FREE (&ptr->table); - FREE (&ptr); + mem_free (&ptr->table); + mem_free (&ptr); return table; } @@ -81,37 +77,33 @@ 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, const void *data, int allow_dup) { struct hash_elem *ptr; int h; - ptr = (struct hash_elem *) safe_malloc (sizeof (struct hash_elem)); + ptr = (struct hash_elem *) mem_malloc (sizeof (struct hash_elem)); h = hash_string ((unsigned char *) key, table->nelem); ptr->key = key; ptr->data = data; - if (allow_dup) - { + if (allow_dup) { ptr->next = table->table[h]; table->table[h] = ptr; table->curnelem++; } - else - { + else { struct hash_elem *tmp, *last; int r; - for (tmp = table->table[h], last = NULL; tmp; last = tmp, tmp = tmp->next) - { - r = mutt_strcmp (tmp->key, key); - if (r == 0) - { - FREE (&ptr); - return (-1); + for (tmp = table->table[h], last = NULL; tmp; last = tmp, tmp = tmp->next) { + r = str_cmp (tmp->key, key); + if (r == 0) { + mem_free (&ptr); + return (-1); } if (r > 0) - break; + break; } if (last) last->next = ptr; @@ -126,33 +118,31 @@ int hash_insert (HASH * table, const char *key, void *data, int allow_dup) 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) + + for (; ptr; ptr = ptr->next) { + if (str_cmp (key, ptr->key) == 0) return (ptr->data); } return NULL; } void hash_delete_hash (HASH * table, int hash, const char *key, const void *data, - void (*destroy) (void *)) + void (*destroy) (void *)) { struct hash_elem *ptr = table->table[hash]; struct hash_elem **last = &table->table[hash]; - for (; ptr; last = &ptr->next, ptr = ptr->next) - { - /* if `data' is given, look for a matching ->data member. this is - * required for the case where we have multiple entries with the same - * key - */ - if ((data == ptr->data) || (!data && mutt_strcmp (ptr->key, key) == 0)) - { + while (ptr) { + if ((data == ptr->data || !data) && str_cmp (ptr->key, key) == 0) { *last = ptr->next; - if (destroy) destroy (ptr->data); - FREE (&ptr); - table->curnelem--; - return; + if (destroy) + destroy (ptr->data); + mem_free (&ptr); + + ptr = *last; + } else { + last = &ptr->next; + ptr = ptr->next; } } } @@ -160,23 +150,35 @@ void hash_delete_hash (HASH * table, int hash, const char *key, const void *data /* ptr pointer to the hash table to be freed * destroy() function to call to free the ->data member (optional) */ -void hash_destroy (HASH **ptr, void (*destroy) (void *)) +void hash_destroy (HASH ** ptr, void (*destroy) (void *)) { int i; HASH *pptr = *ptr; struct hash_elem *elem, *tmp; - for (i = 0 ; i < pptr->nelem; i++) - { - for (elem = pptr->table[i]; elem; ) - { + for (i = 0; i < pptr->nelem; i++) { + for (elem = pptr->table[i]; elem;) { tmp = elem; elem = elem->next; if (destroy) - destroy (tmp->data); - FREE (&tmp); + destroy (tmp->data); + mem_free (&tmp); } } - FREE (&pptr->table); - FREE (ptr); + mem_free (&pptr->table); + mem_free (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); }