Files
MyLittleCPU/src/assembler/program.c

96 lines
2.5 KiB
C
Raw Normal View History

2026-07-16 14:01:36 +10:00
#include "program.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
Program newProgram(void) {
Program program = {
.at = malloc(sizeof(Instruction) * 16),
.len = 0,
.capacity = 16,
.labels = {
.at = malloc(sizeof(Instruction) * 16),
.len = 0,
.capacity = 16,
}
};
if (program.at == NULL || program.labels.at == NULL) {
fprintf(stderr, "malloc failed while creating new program\n");
exit(1);
}
return program;
}
void addInstructionToProgram(Program* program, Instruction inst) {
if (program->at == NULL) {
fprintf(stderr, "unexpected NULL value when adding instruction to program\n");
exit(1);
}
if (program->len + 1 >= program->capacity) {
Instruction* tmp = malloc(sizeof(Instruction) * program->capacity * 2);
if (tmp == NULL) {
fprintf(stderr, "malloc failed while expanding program\n");
exit(1);
}
program->at = tmp;
program->capacity *= 2;
}
program->at[program->len] = inst;
program->len++;
}
void addLabelToProgram(Program* program, const char* name, uint8_t position) {
if (program->labels.at == NULL) {
fprintf(stderr, "unexpected NULL value when adding label to program\n");
exit(1);
}
if (program->labels.len + 1 >= program->labels.capacity) {
Label* tmp = malloc(sizeof(Label) * program->labels.capacity * 2);
if (tmp == NULL) {
fprintf(stderr, "malloc failed while expanding program labels\n");
exit(1);
}
program->labels.at = tmp;
program->labels.capacity *= 2;
}
char* nameCopy = malloc(strlen(name) + 1);
if (nameCopy == NULL) {
fprintf(stderr, "malloc failed while expanding program labels\n");
exit(1);
}
strcpy(nameCopy, name);
program->labels.at[program->labels.len] = (Label) {
.name = nameCopy,
.position = position
};
program->labels.len++;
}
void freeProgram(Program* program) {
if (program->at != NULL) {
free(program->at);
}
program->at = NULL;
program->capacity = 0;
program->len = 0;
if (program->labels.at != NULL) {
for (size_t i = 0; i < program->labels.len; i++) {
free(program->labels.at[i].name);
}
free(program->labels.at);
}
program->labels.at = NULL;
program->labels.capacity = 0;
program->labels.len = 0;
}