X-Git-Url: https://git.llucax.com/software/mutt-debian.git/blobdiff_plain/14c29200cb58d3c4a0830265f2433849781858d0..9275549093fd4bae96f4119e7b66dd3cc6478e78:/hash.c?ds=sidebyside diff --git a/hash.c b/hash.c index 2c7e6dd..08f7171 100644 --- a/hash.c +++ b/hash.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1996-2000 Michael R. Elkins + * Copyright (C) 1996-2009 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 @@ -23,35 +23,51 @@ #include #include #include +#include #include "mutt.h" #define SOMEPRIME 149711 -int hash_string (const unsigned char *s, int n) +static unsigned int hash_string (const unsigned char *s, unsigned int n) { - int h = 0; + unsigned int h = 0; -#if 0 - while (*s) - h += *s++; -#else while (*s) h += (h << 7) + *s++; h = (h * SOMEPRIME) % n; - h = (h >= 0) ? h : h + n; -#endif - return (h % n); + return h; +} + +static unsigned int hash_case_string (const unsigned char *s, unsigned int n) +{ + unsigned int h = 0; + + while (*s) + h += (h << 7) + tolower (*s++); + h = (h * SOMEPRIME) % n; + + return h; } -HASH *hash_create (int nelem) +HASH *hash_create (int nelem, int lower) { HASH *table = safe_malloc (sizeof (HASH)); if (nelem == 0) nelem = 2; table->nelem = nelem; table->table = safe_calloc (nelem, sizeof (struct hash_elem *)); + if (lower) + { + table->hash_string = hash_case_string; + table->cmp_string = mutt_strcasecmp; + } + else + { + table->hash_string = hash_string; + table->cmp_string = mutt_strcmp; + } return table; } @@ -63,10 +79,10 @@ HASH *hash_create (int nelem) int hash_insert (HASH * table, const char *key, void *data, int allow_dup) { struct hash_elem *ptr; - int h; + unsigned int h; ptr = (struct hash_elem *) safe_malloc (sizeof (struct hash_elem)); - h = hash_string ((unsigned char *) key, table->nelem); + h = table->hash_string ((unsigned char *) key, table->nelem); ptr->key = key; ptr->data = data; @@ -82,7 +98,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 = mutt_strcmp (tmp->key, key); + r = table->cmp_string (tmp->key, key); if (r == 0) { FREE (&ptr); @@ -105,7 +121,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 (table->cmp_string (key, ptr->key) == 0) return (ptr->data); } return NULL; @@ -120,7 +136,7 @@ void hash_delete_hash (HASH * table, int hash, const char *key, const void *data while (ptr) { if ((data == ptr->data || !data) - && mutt_strcmp (ptr->key, key) == 0) + && table->cmp_string (ptr->key, key) == 0) { *last = ptr->next; if (destroy)