X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=hash.c;h=a2dc11e2b137f387e0c6dd91c3b16c33a2c49e4b;hp=4e12b152f735688c43bfac595f81dcfb472cd51d;hb=df70e07e24add1869bcc9b7af2277d9d0c09a281;hpb=31edbe030ac69952aa535730427246b5e9a1603c;ds=sidebyside diff --git a/hash.c b/hash.c index 4e12b15..a2dc11e 100644 --- a/hash.c +++ b/hash.c @@ -14,7 +14,7 @@ * 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. - */ + */ #if HAVE_CONFIG_H # include "config.h" @@ -48,6 +48,7 @@ int hash_string (const unsigned char *s, int n) HASH *hash_create (int nelem) { HASH *table = safe_malloc (sizeof (HASH)); + if (nelem == 0) nelem = 2; table->nelem = nelem; @@ -56,7 +57,7 @@ HASH *hash_create (int nelem) return table; } -HASH *hash_resize (HASH *ptr, int nelem) +HASH *hash_resize (HASH * ptr, int nelem) { HASH *table; struct hash_elem *elem, *tmp; @@ -64,10 +65,8 @@ 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); @@ -95,27 +94,23 @@ int hash_insert (HASH * table, const char *key, void *data, int allow_dup) 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) - { + 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); + if (r == 0) { + FREE (&ptr); + return (-1); } if (r > 0) - break; + break; } if (last) last->next = ptr; @@ -130,30 +125,29 @@ 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) - { + + for (; ptr; ptr = ptr->next) { if (mutt_strcmp (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 hash_delete_hash (HASH * table, int hash, const char *key, + const void *data, 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) - { + 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)) - { + if ((data == ptr->data) || (!data && mutt_strcmp (ptr->key, key) == 0)) { *last = ptr->next; - if (destroy) destroy (ptr->data); + if (destroy) + destroy (ptr->data); FREE (&ptr); table->curnelem--; return; @@ -164,20 +158,18 @@ 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); + destroy (tmp->data); FREE (&tmp); } }