From 9efedf4471aa9bddd939a734b049133d6429a400 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 26 Oct 2018 14:48:48 +0200 Subject: [PATCH] WIP --- cc/compiler.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 cc/compiler.c diff --git a/cc/compiler.c b/cc/compiler.c new file mode 100644 index 0000000..ff64aa8 --- /dev/null +++ b/cc/compiler.c @@ -0,0 +1,78 @@ + +#include + +void forward(FILE *fd, char ch) { + + for(;;) { + char c = getc(fd); + if (c == EOF) + break; + if (c == ch) { + getc(fd); + break; + } + } +} + +void execute(FILE *fd) { + + unsigned char mem[2048] = { 0 }; /* Memory block */ + unsigned char *ptr = mem; + long int jmpaddr = -1; + + while(!feof(fd)) { + char ch = getc(fd); + + switch(ch) { + case '<': + ptr--; + break; + case '>': + ptr++; + break; + case '+': + (*ptr)++; + break; + case '-': + (*ptr)--; + break; + case '.': + putchar(*ptr); + break; + case '[': + if (*ptr == 0) { + forward(fd, ']'); + jmpaddr = -1; + } else { + jmpaddr = ftell(fd) - 1; + } + break; + case ']': + if (jmpaddr > 0) { + fseek(fd, jmpaddr, SEEK_SET); + } + break; + } + } +} + +int main(int argc, char **argv) { + + FILE *fd; + + if (argc < 2) { + fprintf(stderr, "usage: %s \n", argv[0]); + return 1; + } + + fd = fopen(argv[1], "r"); + if (!fd) { + return 1; + } + + execute(fd); + + fclose(fd); + + return 0; +}