diff --git a/src/datastructures.c b/src/datastructures.c index 0feeb2176b0422471f65a053a7ef9a716af1821c..ba619074f396894ec65feaf7d34987ddda3bb01c 100644 --- a/src/datastructures.c +++ b/src/datastructures.c @@ -386,6 +386,23 @@ HHashValue h_hash_ptr(const void *p) { return (uintptr_t)p >> 4; } +HHashValue h_hash_str(const void *p) { + const char *s; + + s = (const char *)p; + + return h_djbhash_str(s); +} + +bool h_eq_str(const void *p, const void *q) { + if (p && q) { + if (strcmp((const char *)p, (const char *)q) == 0) return true; + else return false; + } else { + return h_eq_ptr(p, q); + } +} + uint32_t h_djbhash(const uint8_t *buf, size_t len) { uint32_t hash = 5381; while (len--) { @@ -394,6 +411,14 @@ uint32_t h_djbhash(const uint8_t *buf, size_t len) { return hash; } +uint32_t h_djbhash_str(const char *s) { + uint32_t hash = 5381; + while (*s != '\0') { + hash = hash * 33 + (uint8_t)(*s++); + } + return hash; +} + void h_symbol_put(HParseState *state, const char* key, void *value) { if (!state->symbol_table) { state->symbol_table = h_slist_new(state->arena); diff --git a/src/internal.h b/src/internal.h index 2b2d6004266680b5a4a8ae7d20da80506d7082da..b4af5c5544d7584448472351fa958df56d287fe6 100644 --- a/src/internal.h +++ b/src/internal.h @@ -460,8 +460,11 @@ typedef HHashTable HHashSet; bool h_hashset_equal(const HHashSet *a, const HHashSet *b); bool h_eq_ptr(const void *p, const void *q); +bool h_eq_str(const void *p, const void *q); HHashValue h_hash_ptr(const void *p); +HHashValue h_hash_str(const void *p); uint32_t h_djbhash(const uint8_t *buf, size_t len); +uint32_t h_djbhash_str(const char *s); void h_symbol_put(HParseState *state, const char* key, void *value); void* h_symbol_get(HParseState *state, const char* key);