diff options
Diffstat (limited to 'locale')
-rw-r--r-- | locale/hashval.h | 22 | ||||
-rw-r--r-- | locale/loadarchive.c | 1 | ||||
-rw-r--r-- | locale/programs/locarchive.c | 16 |
3 files changed, 21 insertions, 18 deletions
diff --git a/locale/hashval.h b/locale/hashval.h index f846cdfb27..52ef8b5da9 100644 --- a/locale/hashval.h +++ b/locale/hashval.h @@ -18,20 +18,16 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#ifndef LONGBITS -# include <limits.h> -# define LONGBITS (sizeof (long int) * CHAR_BIT) +#ifndef hashval_t +# define hashval_t unsigned long int #endif +#include <limits.h> /* For CHAR_BIT. */ -unsigned long int compute_hashval (const void *key, size_t keylen); - -unsigned long int -compute_hashval (key, keylen) - const void *key; - size_t keylen; +hashval_t +compute_hashval (const void *key, size_t keylen) { size_t cnt; - unsigned long int hval; + hashval_t hval; /* Compute the hash value for the given string. The algorithm is taken from [Aho,Sethi,Ullman], modified to reduce the number of @@ -41,8 +37,8 @@ compute_hashval (key, keylen) hval = keylen; while (cnt < keylen) { - hval = (hval << 9) | (hval >> (LONGBITS - 9)); - hval += (unsigned long int) *(((char *) key) + cnt++); + hval = (hval << 9) | (hval >> (sizeof hval * CHAR_BIT - 9)); + hval += (hashval_t) *(((char *) key) + cnt++); } - return hval != 0 ? hval : ~((unsigned long int) 0); + return hval != 0 ? hval : ~((hashval_t) 0); } diff --git a/locale/loadarchive.c b/locale/loadarchive.c index ef259b9bdb..ab824a7dba 100644 --- a/locale/loadarchive.c +++ b/locale/loadarchive.c @@ -35,6 +35,7 @@ /* Define the hash function. We define the function as static inline. */ #define compute_hashval static inline compute_hashval +#define hashval_t uint32_t #include "hashval.h" #undef compute_hashval diff --git a/locale/programs/locarchive.c b/locale/programs/locarchive.c index 967589f0a4..07ec3bbc37 100644 --- a/locale/programs/locarchive.c +++ b/locale/programs/locarchive.c @@ -43,9 +43,15 @@ #include "../../crypt/md5.h" #include "../localeinfo.h" #include "../locarchive.h" -#include "simple-hash.h" #include "localedef.h" +/* Define the hash function. We define the function as static inline. + We must change the name so as not to conflict with simple-hash.h. */ +#define compute_hashval static inline archive_hashval +#define hashval_t uint32_t +#include "hashval.h" +#undef compute_hashval + extern const char *output_prefix; #define ARCHIVE_NAME LOCALEDIR "/locale-archive" @@ -522,7 +528,7 @@ insert_name (struct locarhandle *ah, unsigned int insert_idx, idx, incr; /* Hash value of the locale name. */ - uint32_t hval = compute_hashval (name, name_len); + uint32_t hval = archive_hashval (name, name_len); insert_idx = -1; idx = hval % head->namehash_size; @@ -720,7 +726,7 @@ add_locale (struct locarhandle *ah, /* Compute the hash value of the checksum to determine a starting point for the search in the MD5 hash value table. */ - hval = compute_hashval (data[cnt].sum, 16); + hval = archive_hashval (data[cnt].sum, 16); idx = hval % head->sumhash_size; incr = 1 + hval % (head->sumhash_size - 2); @@ -812,7 +818,7 @@ add_locale (struct locarhandle *ah, error (EXIT_FAILURE, errno, _("cannot add to locale archive")); /* Add the hash value to the hash table. */ - md5hval = compute_hashval (data[cnt].sum, 16); + md5hval = archive_hashval (data[cnt].sum, 16); idx = md5hval % head->sumhash_size; incr = 1 + md5hval % (head->sumhash_size - 2); @@ -1303,7 +1309,7 @@ delete_locales_from_archive (nlist, list) unsigned int incr; /* Search for this locale in the archive. */ - hval = compute_hashval (locname, strlen (locname)); + hval = archive_hashval (locname, strlen (locname)); idx = hval % head->namehash_size; incr = 1 + hval % (head->namehash_size - 2); |