X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=hash.c;h=f04258956fe71ebe8fd18b0a8c6b8c49dd81aa4d;hp=a2dc11e2b137f387e0c6dd91c3b16c33a2c49e4b;hb=e3fcff4c503373a3f98676405783926e387f7139;hpb=df70e07e24add1869bcc9b7af2277d9d0c09a281 diff --git a/hash.c b/hash.c index a2dc11e..f042589 100644 --- a/hash.c +++ b/hash.c @@ -1,19 +1,10 @@ /* + * 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 @@ -26,6 +17,8 @@ #include "mutt.h" +#include "lib/mem.h" + #define SOMEPRIME 149711 int hash_string (const unsigned char *s, int n) @@ -133,24 +126,23 @@ void *hash_find_hash (const HASH * table, int hash, const char *key) 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) { - /* 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) && mutt_strcmp (ptr->key, key) == 0) { *last = ptr->next; if (destroy) destroy (ptr->data); FREE (&ptr); - table->curnelem--; - return; + + ptr = *last; + } else { + last = &ptr->next; + ptr = ptr->next; } } }