blob: 279fdb97fdc5db06137b1fb1ff884884e7a69051 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#include <stddef.h>
#include <stdint.h>
#include "alloc.h"
#include "symtab.h"
#include "strview.h"
struct symtab {
symtab_t *child[4];
strview_t key;
symval_t val;
};
symval_t *
symtab_insert(symtab_t **m, strview_t sv, arena_t *a)
{
for (uint64_t h = strview_hash(sv); *m; h <<= 2) {
if (strview_eq(sv, (*m)->key))
return &(*m)->val;
m = &(*m)->child[h >> 62];
}
if (a == NULL)
return NULL;
*m = arena_new(a, symtab_t, 1);
(*m)->key = sv;
return &(*m)->val;
}
|