Mercurial > repo
comparison 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 |
comparison
equal
deleted
inserted
replaced
4222:b0f3e267bb1e | 4223:ac0403686959 |
---|---|
1 #include "hash.h" | |
2 #include "strhash.h" | |
3 #include "strutil.h" | |
4 #include "xmalloc.h" | |
5 | |
6 #include <string.h> | |
7 | |
8 struct strx { | |
9 char *ptr; | |
10 size_t length; | |
11 }; | |
12 | |
13 struct strx_const { | |
14 const char *ptr; | |
15 size_t length; | |
16 }; | |
17 | |
18 struct strhash { | |
19 Hash hash; | |
20 }; | |
21 | |
22 static size_t hash(const void *p, size_t h) { | |
23 const struct strx *const s = p; | |
24 return u_hash(s->ptr, s->length, h); | |
25 } | |
26 | |
27 static int compar(const void *ap, const void *bp) { | |
28 const struct strx *const a = ap, *const b = bp; | |
29 return u_cmp(a->ptr, a->length, b->ptr, b->length); | |
30 } | |
31 | |
32 static void delk(void *p) { | |
33 struct strx *const s = p; | |
34 xfree(s->ptr); | |
35 xfree(s); | |
36 } | |
37 | |
38 t_strhash *sh_new(void (*delv)(void *)) { | |
39 t_strhash *sh = xmalloc(1, sizeof *sh); | |
40 h_init(&sh->hash, hash, compar, delk, delv); | |
41 return sh; | |
42 } | |
43 | |
44 void sh_delete(t_strhash *sh) { | |
45 h_end(&sh->hash); | |
46 xfree(sh); | |
47 } | |
48 | |
49 void sh_put(t_strhash *sh, const char *key, size_t keylen, void *val) { | |
50 struct strx *dup = xmalloc(1, sizeof *dup); | |
51 dup->ptr = xmalloc(dup->length = keylen, sizeof *dup->ptr); | |
52 memcpy(dup->ptr, key, keylen); | |
53 h_put(&sh->hash, dup, val, 1); | |
54 } | |
55 | |
56 void *sh_get(t_strhash *sh, const char *key, size_t keylen) { | |
57 void *p; | |
58 struct strx_const tmp; | |
59 tmp.ptr = key; | |
60 tmp.length = keylen; | |
61 if (h_get(&sh->hash, &tmp, &p) == H_OK) { | |
62 return p; | |
63 } | |
64 return NULL; | |
65 } |