diff options
-rw-r--r-- | base.h | 2 | ||||
-rw-r--r-- | main.c | 4 | ||||
-rw-r--r-- | symtable.c | 19 |
3 files changed, 15 insertions, 10 deletions
@@ -77,7 +77,7 @@ typedef struct u64 djb2(sv_t string); void sym_table_init(sym_table_t *table); -sv_t sym_table_find(sym_table_t *table, sv_t sv); +char *sym_table_find(sym_table_t *table, sv_t sv); void sym_table_cleanup(sym_table_t *table); #endif @@ -50,8 +50,8 @@ int main(void) for (u64 i = 0; i < ARRSIZE(words); ++i) { - sv_t sv = sym_table_find(&table, SV(words[i], strlen(words[i]))); - printf("%s => %p\n", words[i], sv.data); + char *ptr = sym_table_find(&table, SV(words[i], strlen(words[i]))); + printf("%s => %p\n", words[i], ptr); } sym_table_cleanup(&table); @@ -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)); } |