aboutsummaryrefslogtreecommitdiffhomepage
path: root/c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-12-15 21:46:24 +0100
committerlemon <lsof@mailbox.org>2025-12-15 21:46:24 +0100
commitc6c0f2ef35175075e91169113cfe856f29b3eb9a (patch)
tree65dc85d7b2845a4e1145ac9d6ffd26fbb2482e8e /c
parentbf0f2805b5aec7f4fa5fb4ff1a4da081a0112e4e (diff)
move intern() to mem.c
Being in lex.c was vestigial, since it was being used all over the frontend and backend.
Diffstat (limited to 'c')
-rw-r--r--c/builtin.c1
-rw-r--r--c/lex.c45
-rw-r--r--c/lex.h1
3 files changed, 0 insertions, 47 deletions
diff --git a/c/builtin.c b/c/builtin.c
index a923bf1..aabd750 100644
--- a/c/builtin.c
+++ b/c/builtin.c
@@ -113,7 +113,6 @@ void
putbuiltins(struct env *env)
{
for (int i = 0; i < countof(tab); ++i) {
- const char *intern(const char *);
envadddecl(env, &(struct decl) {
.name = intern(tab[i].name),
.isbuiltin = 1,
diff --git a/c/lex.c b/c/lex.c
index 2f33fc7..6c55e7f 100644
--- a/c/lex.c
+++ b/c/lex.c
@@ -1,51 +1,6 @@
#include "lex.h"
#include <string.h>
-const char *
-intern(const char *s)
-{
- static uint N, n;
- static struct ht {
- const char *s;
- size_t h;
- } *ht;
- static struct { char m[sizeof(struct arena) + (2<<10)]; struct arena *_a; } amem;
- static struct arena *arena;
-
- if (!N) {
- ht = xcalloc((sizeof *ht) * (N = 1<<10));
- arena = (void *)amem.m, arena->cap = sizeof amem.m - sizeof(struct arena);
- }
-
- for (size_t h = hashs(0, s), i = h;;) {
- i &= N - 1;
- if (!ht[i].s) { /* insert */
- if (n < N/4*3 /*load factor 75%*/) {
- ++n;
- ht[i].h = h;
- return ht[i].s = alloccopy(&arena, s, strlen(s)+1, 1);
- }
- /* resize */
- size_t nnew = N * 2;
- struct ht *new = xcalloc(sizeof *new * nnew);
- for (uint i = 0; i < N; ++i) { /* rehash */
- if (!ht[i].s) continue;
- uint j = ht[i].h;
- while (new[j &= nnew-1].s) ++j;
- new[j] = ht[i];
- }
- free(ht);
- ht = new;
- N = nnew;
- i = h;
- continue;
- } else if (h == ht[i].h && !strcmp(s, ht[i].s)) {
- return ht[i].s;
- }
- ++i;
- }
-}
-
static void
identkeyword(struct token *tk, const char *s, int len)
{
diff --git a/c/lex.h b/c/lex.h
index 89c9a7d..2782f67 100644
--- a/c/lex.h
+++ b/c/lex.h
@@ -111,7 +111,6 @@ enum initlexer {
LXERR,
};
-const char *intern(const char *);
int lex(struct lexer *, struct token *);
int lexpeek(struct lexer *, struct token *);
enum typetag parsenumlit(uvlong *, double *, const struct token *, bool ispp);