#include "symtab.h" #include #include #include #include "sv.h" void symtab_init(struct symbol_table *symtab) { assert(symtab != NULL); symtab->cap = 150; symtab->count = 0; symtab->entries = malloc(150); } void symtab_expand(struct symbol_table *symtab) { assert(symtab != NULL); size_t newcap = symtab->cap * 2; void* newbuf = malloc(newcap); memcpy(newbuf, symtab->entries, symtab->cap); free(symtab->entries); symtab->cap = newcap; symtab->entries = newbuf; } void symtab_free(struct symbol_table *symtab) { assert(symtab != NULL); symtab->count = 0; symtab->cap = 0; free(symtab->entries); } struct symlookup_result symtab_lookup(struct symbol_table *symtab, struct string_view ent) { for(size_t i = 0; i < symtab->count; i++) { struct symbol_entry *syment = &symtab->entries[i]; if(ent.len != syment->name.len) continue; if(strncmp(ent.buf, syment->name.buf, ent.len) == 0) { return (struct symlookup_result){.ent = syment, .i = i}; } } return (struct symlookup_result){.ent = NULL, .i = 0}; } size_t symtab_append(struct symbol_table *symtab, struct symbol_entry syment) { if(symtab->count + 1 >= symtab->cap) symtab_expand(symtab); symtab->entries[symtab->count++] = syment; return symtab->count - 1; }