104 lines
2.3 KiB
C
104 lines
2.3 KiB
C
|
#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;
|
||
|
}
|