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/tab/reftab.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/tab/reftab.c')
| -rw-r--r-- | masm/tab/reftab.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/masm/tab/reftab.c b/masm/tab/reftab.c new file mode 100644 index 0000000..3eddc50 --- /dev/null +++ b/masm/tab/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; +} |