aboutsummaryrefslogtreecommitdiff
path: root/src/symtab.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/symtab.c')
-rw-r--r--src/symtab.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/symtab.c b/src/symtab.c
new file mode 100644
index 0000000..279fdb9
--- /dev/null
+++ b/src/symtab.c
@@ -0,0 +1,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;
+}