summaryrefslogtreecommitdiff
path: root/masm/reftbl.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--masm/reftbl.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/masm/reftbl.c b/masm/reftbl.c
new file mode 100644
index 0000000..bdd1f07
--- /dev/null
+++ b/masm/reftbl.c
@@ -0,0 +1,47 @@
+#include <string.h>
+#include <stdlib.h>
+#include <mips.h>
+#include <merror.h>
+#include <mlimits.h>
+
+#include "parse.h"
+
+#define RELTBL_INIT_LEN 8
+
+int reftbl_init(struct reference_table *ref_tbl)
+{
+ ref_tbl->len = RELTBL_INIT_LEN;
+ ref_tbl->count = 0;
+ ref_tbl->references = malloc(sizeof(struct reference) *
+ RELTBL_INIT_LEN);
+
+ if (ref_tbl->references == NULL) {
+ ERROR("cannot alloc");
+ return M_ERROR;
+ }
+
+ return M_SUCCESS;
+}
+
+void reftbl_free(struct reference_table *ref_tbl)
+{
+ free(ref_tbl->references);
+}
+
+int reftbl_push(struct reference_table *ref_tbl, struct reference reference)
+{
+ if (ref_tbl->count >= ref_tbl->len) {
+ ref_tbl->len *= 2;
+ ref_tbl->references = realloc(ref_tbl->references,
+ sizeof(struct reference) * ref_tbl->len);
+
+ if (ref_tbl->references == NULL) {
+ ERROR("cannot realloc");
+ return M_ERROR;
+ }
+ }
+
+ ref_tbl->references[ref_tbl->count++] = reference;
+
+ return M_SUCCESS;
+}