41 static uint32_t
djb2a(
const char *str) {
42 uint32_t
hash = UINT32_C(5381);
44 while ((c = *str++) !=
'\0')
45 hash = (UINT32_C(33) *
hash) ^ c;
56 if (node->
key == NULL) {
62 if (node->
value == NULL) {
90 return (
size_t)hash & (m->
nbuckets - 1);
106 while (node != NULL) {
115 if (buckets != NULL) {
123 while (node != NULL) {
138 while (*next != NULL) {
139 if ((*next)->hash == hash && !strcmp((*next)->key, key)) {
142 next = &(*next)->
next;
158 if ((nreserved > 0) && !(nreserved & (nreserved - 1)))
173 while (node != NULL) {
185 if (m == NULL || key == NULL)
191 return next ? (*next)->
value : NULL;
196 if (m == NULL || key == NULL || value == NULL)
204 c_memcpy((*next)->value, value, vsize);
227 if (m == NULL || key == NULL)
235 *next = (*next)->
next;
257 if (m == NULL || iter == NULL)
262 if (iter->
node != NULL) {
264 if (iter->
node == NULL)
272 }
while (iter->
node == NULL);
int32_t _map_set(c_map_base_t *m, const char *key, const void *value, size_t vsize)
static void * c_memcpy(void *__restrict dest, const void *__restrict src, size_t size)
Wrapper to memcpy(dest, src, size), with check for NULL arguments.
static size_t map_bucketidx(const c_map_base_t *m, uint32_t hash)
c_map_iter_t _map_iter(void)
const char * _map_next(const c_map_base_t *m, c_map_iter_t *iter)
void _map_deinit(c_map_base_t *m)
Hash table. Implementation from rxi's "map" project.
int32_t _map_init(c_map_base_t *m, size_t nreserved)
static void map_addnode(c_map_base_t *m, c_map_node_t *node)
void * c_malloc(size_t size)
Generic wrappers to platform-dependent functions.
static c_map_node_t * map_newnode(const char *key, const void *value, size_t vsize)
static uint32_t djb2a(const char *str)
static void map_deletenode(c_map_node_t *node)
#define c_use_decl_annotations
size_t _map_size(const c_map_base_t *m)
void _map_remove(c_map_base_t *m, const char *key)
void * c_realloc(void *ptr, size_t size)
char * c_strdup(const char *str)
Wrapper to strdup(str), with check for NULL arguments. To be freed with c_free(). ...
static c_map_node_t ** map_getref(const c_map_base_t *m, const char *key)
static void * c_zeromem(void *dest, size_t size)
Wrapper to memset(dest, 0, size), with check for NULL arguments.
static int32_t map_resize(c_map_base_t *m, size_t nbuckets)
void * _map_get(const c_map_base_t *m, const char *key)