From 6dfe3e72a168655f1e70adae90eba953ef47696d Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Tue, 19 Aug 2025 23:02:07 +0100 Subject: Make sym_table_find return the c-string in question directly I think we fall into a few traps if we return an sv_t directly. Think intent is clearer by returning the c-string directly. --- symtable.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'symtable.c') diff --git a/symtable.c b/symtable.c index a159b69..681ffdf 100644 --- a/symtable.c +++ b/symtable.c @@ -32,7 +32,7 @@ void sym_table_init(sym_table_t *table) vec_make((void **)&table->entries, table->capacity * sizeof(*table->entries)); } -sv_t sym_table_find(sym_table_t *table, sv_t sv) +char *sym_table_find(sym_table_t *table, sv_t sv) { // TODO: Deal with resizing this when table->count > table->size / 2 u64 index = djb2(sv) & (table->capacity - 1); @@ -41,21 +41,26 @@ sv_t sym_table_find(sym_table_t *table, sv_t sv) index = index & (table->capacity - 1), comp = table->entries[index]) // Is it present in the table? if (sv.size == comp.size && strncmp(sv.data, comp.data, sv.size) == 0) - return comp; + break; - // Otherwise we need to duplicate and make it permanently interned - sv_t newsv = sv_copy(sv); - table->entries[index] = newsv; - ++table->count; + // we couldn't find it in our linear search (worst case scenario) + if (!table->entries[index].data) + { + sv_t newsv = sv_copy(sv); + table->entries[index] = newsv; + ++table->count; + } - return newsv; + return table->entries[index].data; } void sym_table_cleanup(sym_table_t *table) { + // kill the data for (u64 i = 0; i < table->capacity; ++i) if (table->entries[i].data) free(table->entries[i].data); + // kill the container vec_free((void **)&table->entries); memset(table, 0, sizeof(*table)); } -- cgit v1.2.3-13-gbd6f