diff options
author | Freya Murphy <freya@freyacat.org> | 2024-10-04 19:41:10 -0400 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2024-10-04 19:41:10 -0400 |
commit | 1c11a13ff33873bcc79d4597d31cd252d5c6c1ae (patch) | |
tree | a4321b97f5ad69d1a9b9d06dd629a4dc532758b0 /masm/reftab.c | |
parent | update msim usage (diff) | |
download | mips-1c11a13ff33873bcc79d4597d31cd252d5c6c1ae.tar.gz mips-1c11a13ff33873bcc79d4597d31cd252d5c6c1ae.tar.bz2 mips-1c11a13ff33873bcc79d4597d31cd252d5c6c1ae.zip |
refactor masm to add codegen step
Diffstat (limited to '')
-rw-r--r-- | masm/reftab.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/masm/reftab.c b/masm/reftab.c new file mode 100644 index 0000000..f8793e1 --- /dev/null +++ b/masm/reftab.c @@ -0,0 +1,43 @@ +#include <stdlib.h> +#include <merror.h> + +#include "tab.h" + +#define REFTAB_INIT_LEN 8 + +int reftab_init(struct reference_table *reftab) +{ + reftab->size = REFTAB_INIT_LEN; + reftab->len = 0; + reftab->references = malloc(sizeof(struct reference) + * REFTAB_INIT_LEN); + + if (reftab->references == NULL) { + PERROR("cannot alloc"); + return M_ERROR; + } + + return M_SUCCESS; +} + +void reftab_free(struct reference_table *reftab) +{ + free(reftab->references); +} + +int reftab_push(struct reference_table *reftab, struct reference *ref) +{ + if (reftab->len >= reftab->size) { + reftab->size *= 2; + reftab->references = realloc(reftab->references, + sizeof(struct reference) * reftab->size); + + if (reftab->references == NULL) { + PERROR("cannot realloc"); + return M_ERROR; + } + } + + reftab->references[reftab->len++] = *ref; + return M_SUCCESS; +} |