summaryrefslogtreecommitdiff
path: root/st.c
diff options
context:
space:
mode:
Diffstat (limited to 'st.c')
-rw-r--r--st.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/st.c b/st.c
index ffff261470..2418547ebb 100644
--- a/st.c
+++ b/st.c
@@ -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)
{