Mercurial > repo
diff src/ploki/strhash.c @ 4223:ac0403686959
<oerjan> rm -rf src/ploki; mv ploki src
author | HackBot |
---|---|
date | Fri, 20 Dec 2013 22:18:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ploki/strhash.c Fri Dec 20 22:18:50 2013 +0000 @@ -0,0 +1,65 @@ +#include "hash.h" +#include "strhash.h" +#include "strutil.h" +#include "xmalloc.h" + +#include <string.h> + +struct strx { + char *ptr; + size_t length; +}; + +struct strx_const { + const char *ptr; + size_t length; +}; + +struct strhash { + Hash hash; +}; + +static size_t hash(const void *p, size_t h) { + const struct strx *const s = p; + return u_hash(s->ptr, s->length, h); +} + +static int compar(const void *ap, const void *bp) { + const struct strx *const a = ap, *const b = bp; + return u_cmp(a->ptr, a->length, b->ptr, b->length); +} + +static void delk(void *p) { + struct strx *const s = p; + xfree(s->ptr); + xfree(s); +} + +t_strhash *sh_new(void (*delv)(void *)) { + t_strhash *sh = xmalloc(1, sizeof *sh); + h_init(&sh->hash, hash, compar, delk, delv); + return sh; +} + +void sh_delete(t_strhash *sh) { + h_end(&sh->hash); + xfree(sh); +} + +void sh_put(t_strhash *sh, const char *key, size_t keylen, void *val) { + struct strx *dup = xmalloc(1, sizeof *dup); + dup->ptr = xmalloc(dup->length = keylen, sizeof *dup->ptr); + memcpy(dup->ptr, key, keylen); + h_put(&sh->hash, dup, val, 1); +} + +void *sh_get(t_strhash *sh, const char *key, size_t keylen) { + void *p; + struct strx_const tmp; + tmp.ptr = key; + tmp.length = keylen; + if (h_get(&sh->hash, &tmp, &p) == H_OK) { + return p; + } + return NULL; +}