mips/masm/sectbl.c

104 lines
2.3 KiB
C
Raw Normal View History

#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;
}