diff --git a/c/meltdown.c b/c/meltdown.c new file mode 100644 index 0000000..95cf619 --- /dev/null +++ b/c/meltdown.c @@ -0,0 +1,74 @@ +#include +#include +#include + +uint16_t compile(const char *prog, uint8_t *tape, uint16_t tape_len, uint8_t **idx, uint8_t eval) { + uint16_t elapsed = 1; + + while(*prog) { + uint16_t traveled = 1; + + if(eval && *prog == '>') { + if(*idx == tape + tape_len) { + *idx = tape; + } else { + *idx += 1; + } + } else if(eval && *prog == '<') { + if(*idx == tape) { + *idx = tape + tape_len; + } else { + *idx -= 1; + } + } else if(eval && *prog == '+') { + if(**idx == (2 << 7) - 1) { + **idx = 0; + } else { + **idx += 1; + } + } else if(eval && *prog == '-') { + if(**idx == 0) { + **idx = (2 << 7) - 1; + } else { + **idx -= 1; + } + } else if(eval && *prog == '.') { + putchar(**idx); + } else if(eval && *prog == ',') { + **idx = getchar(); + } else if(*prog == '[') { + uint8_t should_eval = **idx > 0; + + if(!eval) { + should_eval = 0; + } + + traveled = compile(prog + 1, tape, tape_len, idx, should_eval); + } else if(*prog == ']') { + if(**idx > 0) { + return 0; + } else { + return elapsed + 1; + } + } + + elapsed += traveled; + prog += traveled; + } + + return 0; +} + +int main(int argc, char **argv) { + if(argc != 2) { + return 1; + } + + const char *prog = argv[1]; + uint8_t tape[30000] = { 0 }; + uint16_t tape_len = sizeof(tape); + uint8_t *idx = tape; + uint8_t eval = 1; + + compile(prog, tape, tape_len, &idx, eval); +}