From 3b73967c62da68d865f32ca91c8407e65b8ddc03 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Thu, 31 Dec 2015 13:57:22 +0200 Subject: Case-insensitive hash function * src/grecs.hin (grecs_hash_string_ci): New proto. * src/symtab.c (grecs_hash_string_ci): New function. --- src/grecs.hin | 1 + src/symtab.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/grecs.hin b/src/grecs.hin index c01c175..b82f45a 100644 --- a/src/grecs.hin +++ b/src/grecs.hin @@ -458,6 +458,7 @@ int grecs_symtab_enumerate(struct grecs_symtab *st, size_t grecs_symtab_count_entries(struct grecs_symtab *st); unsigned grecs_hash_string(const char *name, unsigned long hashsize); +unsigned grecs_hash_string_ci(const char *name, unsigned long hashsize); void grecs_value_free(struct grecs_value *val); diff --git a/src/symtab.c b/src/symtab.c index 1e1c99a..652f859 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -21,6 +21,7 @@ #include #include #include +#include /* |hash_size| defines a sequence of symbol table sizes. These are prime numbers, each of which is approximately twice its predecessor. */ @@ -85,6 +86,18 @@ grecs_hash_string(const char *name, unsigned long hashsize) return i % hashsize; } +unsigned +grecs_hash_string_ci(const char *name, unsigned long hashsize) +{ + unsigned i; + + for (i = 0; *name; name++) { + i <<= 1; + i ^= tolower (*(unsigned char*) name); + } + return i % hashsize; +} + static unsigned def_hash(void *data, unsigned long hashsize) { -- cgit v1.2.1