summaryrefslogtreecommitdiff
path: root/masm/sectbl.c
blob: f568a6ff5e72eefc17ca1eb398251ec697f724bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <string.h>
#include <stdlib.h>
#include <mips.h>
#include <merror.h>
#include <mlimits.h>

#include "parse.h"

#define SECTBL_INIT_LEN 8
static const char inital_section[MAX_LEX_LENGTH] = "data";

int sectbl_init(struct section_table *sec_tbl)
{
	sec_tbl->len = SECTBL_INIT_LEN;
	sec_tbl->count = 0;
	sec_tbl->total_ins = 0;
        sec_tbl->sections = malloc(sizeof(struct section) * SECTBL_INIT_LEN);

        if (sec_tbl->sections == NULL) {
                ERROR("cannot alloc");
                return M_ERROR;
        }

	if (sectbl_alloc(sec_tbl, &sec_tbl->current, inital_section))
		return M_ERROR;

	return M_SUCCESS;
}

void sectbl_free(struct section_table *sec_tbl)
{
	for (uint32_t i = 0; i < sec_tbl->count; i++) {
		free(sec_tbl->sections[i].ins);
	}
	free(sec_tbl->sections);
}

int sectbl_alloc(struct section_table *sec_tbl, struct section **sec,
		 const char name[MAX_LEX_LENGTH])
{
	if (sec_tbl->count >= sec_tbl->len) {
		sec_tbl->len *= 2;
		sec_tbl->sections = realloc(sec_tbl->sections,
			      sizeof(struct section) * sec_tbl->len);

		if (sec_tbl->sections == NULL) {
			ERROR("cannot realloc");
			return M_ERROR;
		}
	}

	struct section *temp;
	temp = &sec_tbl->sections[sec_tbl->count++];
	strcpy(temp->name,name);
	temp->count = 0;
	temp->len = SECTBL_INIT_LEN;
	temp->start = sec_tbl->total_ins;
	temp->alignment = 1;
	temp->ins = malloc(sizeof(union mips_instruction) * SECTBL_INIT_LEN);

	if (temp->ins == NULL) {
		ERROR("cannot alloc");
		return M_ERROR;
	}

	*sec = temp;
	return M_SUCCESS;
}

int sectbl_push(struct section_table *sec_tbl, struct section *section,
		union mips_instruction ins)
{
	if (section->count >= section->len) {
		section->len *= 2;
		section->ins = realloc(section->ins,
			 sizeof(union mips_instruction) * section->len);

		if (section->ins == NULL) {
			ERROR("cannot realloc");
			return M_ERROR;
		}
	}

	section->ins[section->count++] = ins;
	sec_tbl->total_ins++;

	return M_SUCCESS;
}

int sectbl_get(struct section_table *sec_tbl, struct section **sec,
	       const char name[MAX_LEX_LENGTH])
{
	for (uint32_t i = 0; i < sec_tbl->count; i++) {
		struct section *temp = &sec_tbl->sections[i];
		if (strcmp(name, temp->name) == 0) {
                        if (sec != NULL)
				*sec = temp;
			return M_SUCCESS;
		}
	}

	return M_ERROR;
}