diff options
author | Tyler Murphy <tylerm@tylerm.dev> | 2023-04-14 22:55:43 -0400 |
---|---|---|
committer | Tyler Murphy <tylerm@tylerm.dev> | 2023-04-14 22:55:43 -0400 |
commit | cb76bcf7d2358ad04281d123141acfa175e31841 (patch) | |
tree | 98d770bbc21b9767ae2b7b5186cfe9c445f40236 /src/program.c | |
parent | thing (diff) | |
download | brainfucked-cb76bcf7d2358ad04281d123141acfa175e31841.tar.gz brainfucked-cb76bcf7d2358ad04281d123141acfa175e31841.tar.bz2 brainfucked-cb76bcf7d2358ad04281d123141acfa175e31841.zip |
i made things faster
Diffstat (limited to '')
-rw-r--r-- | src/program.c | 89 |
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); } |