summaryrefslogtreecommitdiff
path: root/src/program.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/program.c89
1 files changed, 34 insertions, 55 deletions
diff --git a/src/program.c b/src/program.c
index 1d94da3..0fac9d5 100644
--- a/src/program.c
+++ b/src/program.c
@@ -1,10 +1,9 @@
-#include "program.h"
+#include "types.h"
-#include <stdio.h>
#include <stdlib.h>
-#include <stdint.h>
#include <string.h>
#include <errno.h>
+#include <stdbool.h>
static char next_char(FILE* file) {
char c;
@@ -65,89 +64,69 @@ retest:
}
}
-void program_init(FILE* file, Program* program) {
+void program_init(Program* program, FILE* file) {
uint32_t capacity = 8;
- program->data = malloc(capacity * sizeof(Symbol));
+ program->data = malloc(capacity * sizeof(struct instruction));
program->len = 0;
program->index = 0;
+ Stack stack;
+ stack_init(&stack, 8);
+
Symbol s;
while(true) {
s = next_symbol(file);
if (program->len == capacity) {
capacity *= 2;
- program->data = realloc(program->data, capacity * sizeof(Symbol));
+ program->data = realloc(program->data, capacity * sizeof(struct instruction));
+ }
+
+ program->data[program->len].s = s;
+ program->data[program->len].j = 0;
+
+ if (s == StartLoop) {
+ stack_pushi(&stack, program->len);
+ } else if (s == EndLoop) {
+ uint32_t i = stack_popi(&stack);
+ program->data[program->len].j = i;
+ if (i != 0 || program->data[i].j == 0) {
+ program->data[i].j = program->len;
+ }
}
- program->data[program->len] = s;
program->len++;
if (s == Eof) break;
}
-
+ stack_free(&stack);
fclose(file);
}
-void program_peek(Program* program, Symbol* symbol) {
- *symbol = program->data[program->index];
-}
-
-void program_next(Program* program, Symbol* symbol) {
+void program_get(Program* program, Symbol* symbol) {
if (program->index >= program->len) {
*symbol = Eof;
return;
}
- program_peek(program, symbol);
- program->index++;
-}
-
-void program_last(Program* program, Symbol* symbol) {
- if (program->index < 1) {
- *symbol = Eof;
- return;
- }
- program->index--;
- program_peek(program, symbol);
-}
-
-void program_free(Program* program) {
- free(program->data);
+ *symbol = program->data[program->index].s;
}
-void tape_init(uint32_t len, Tape* tape) {
- tape->len = len;
- tape->data = malloc(len);
- tape->index = 0;
- memset(tape->data, 0, len);
-}
-
-void tape_left(Tape* tape) {
- if (tape->index == 0) {
- tape->index = tape->len - 1;
- } else {
- tape->index--;
+uint32_t program_get_jump(Program* program) {
+ if (program->index >= program->len) {
+ return 0;
}
+ return program->data[program->index].j;
}
-void tape_right(Tape* tape) {
- tape->index++;
- tape->index %= tape->len;
-}
-
-uint8_t tape_get(Tape* tape) {
- return tape->data[tape->index];
-}
-
-void tape_set(Tape* tape, uint8_t value) {
- tape->data[tape->index] = value;
+void program_next(Program* program) {
+ program->index++;
}
-uint8_t* tape_ptr(Tape* tape) {
- return tape->data + tape->index;
+void program_seek(Program* program, uint32_t index) {
+ program->index = index;
}
-void tape_free(Tape* tape) {
- free(tape->data);
+void program_free(Program* program) {
+ free(program->data);
}