diff options
Diffstat (limited to 'st.c')
-rw-r--r-- | st.c | 37 |
1 files changed, 37 insertions, 0 deletions
@@ -52,6 +52,12 @@ static const struct st_hash_type type_strhash = { strhash, }; +static int strcasehash(const char *); +static const struct st_hash_type type_strcasehash = { + strcasecmp, + strcasehash, +}; + static void rehash(st_table *); #ifdef RUBY @@ -202,6 +208,18 @@ st_init_strtable_with_size(int size) return st_init_table_with_size(&type_strhash, size); } +st_table* +st_init_strcasetable(void) +{ + return st_init_table(&type_strcasehash); +} + +st_table* +st_init_strcasetable_with_size(int size) +{ + return st_init_table_with_size(&type_strcasehash, size); +} + void st_clear(st_table *table) { @@ -814,6 +832,25 @@ strhash(register const char *string) return hval; } +static int +strcasehash(register const char *string) +{ + register unsigned int hval = FNV1_32A_INIT; + + /* + * FNV-1a hash each octet in the buffer + */ + while (*string) { + unsigned int c = (unsigned char)*string++; + if ((unsigned int)(c - 'A') > ('Z' - 'A')) c += 'a' - 'A'; + hval ^= c; + + /* multiply by the 32 bit FNV magic prime mod 2^32 */ + hval *= FNV_32_PRIME; + } + return hval; +} + int st_numcmp(st_data_t x, st_data_t y) { |