diff options
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; +} |