diff options
| author | Freya Murphy <freya@freyacat.org> | 2024-10-21 12:27:18 -0400 |
|---|---|---|
| committer | Freya Murphy <freya@freyacat.org> | 2024-10-21 12:27:18 -0400 |
| commit | 37a4e740133f8e4d669cafc8468dd13107a4810a (patch) | |
| tree | 116b001142b5c0aea03ae46ef299f5fc220c4e5e /masm/symtab.c | |
| parent | add mips1 and mips32r2 isa definitions (diff) | |
| download | mips-37a4e740133f8e4d669cafc8468dd13107a4810a.tar.gz mips-37a4e740133f8e4d669cafc8468dd13107a4810a.tar.bz2 mips-37a4e740133f8e4d669cafc8468dd13107a4810a.zip | |
save dev statedev
Diffstat (limited to 'masm/symtab.c')
| -rw-r--r-- | masm/symtab.c | 89 |
1 files changed, 0 insertions, 89 deletions
diff --git a/masm/symtab.c b/masm/symtab.c deleted file mode 100644 index 990be46..0000000 --- a/masm/symtab.c +++ /dev/null @@ -1,89 +0,0 @@ -#include <merror.h> -#include <netinet/in.h> -#include <stddef.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "lex.h" -#include "tab.h" - -#define SYMTBL_INIT_LEN 24 - -int symtab_init(struct symbol_table *symtab) -{ - symtab->size = SYMTBL_INIT_LEN; - symtab->len = 0; - symtab->symbols = malloc(sizeof(struct symbol) * SYMTBL_INIT_LEN); - - if (symtab->symbols == NULL) { - PERROR("cannot alloc"); - return M_ERROR; - } - - return M_SUCCESS; -} - -void symtab_free(struct symbol_table *symtab) -{ - for (uint32_t i = 0; i < symtab->len; i++) - string_free(&symtab->symbols[i].name); - free(symtab->symbols); -} - -int symtab_push(struct symbol_table *symtab, struct symbol *sym) -{ - if (symtab->len >= symtab->size) { - symtab->size *= 2; - symtab->symbols = realloc(symtab->symbols, - sizeof(struct symbol) * symtab->size); - if (symtab->symbols == NULL) { - PERROR("cannot realloc"); - return M_ERROR; - } - } - - sym->tabidx = symtab->len; - symtab->symbols[symtab->len++] = *sym; - return M_SUCCESS; -} - -int symtab_find(struct symbol_table *symtab, struct symbol **res, - const char *name) -{ - for (uint32_t i = 0; i < symtab->len; i++) { - struct symbol *sym = &symtab->symbols[i]; - if (strcmp(sym->name.str, name) == 0) { - if (res != NULL) - *res = sym; - return M_SUCCESS; - } - } - - return M_ERROR; -} - -int symtab_find_or_stub(struct symbol_table *symtab, struct symbol **res, - const struct string *const name) -{ - if (symtab_find(symtab, res, name->str) == M_SUCCESS) - return M_SUCCESS; - - struct symbol temp = { - .offset = 0, - .secidx = SYM_SEC_STUB, - .type = SYM_LOCAL, - }; - if (string_clone(&temp.name, name)) - return M_ERROR; - - if (symtab_push(symtab, &temp)) { - string_free(&temp.name); - return M_ERROR; - } - - if (res != NULL) - *res = &symtab->symbols[symtab->len - 1]; - - return M_SUCCESS; -} |