From fe3ab5580d5231e1940f25baefd8a97a036d67a2 Mon Sep 17 00:00:00 2001 From: Johnny Richard Date: Sun, 14 Dec 2025 09:48:13 +0100 Subject: Initial commit Signed-off-by: Johnny Richard --- bf.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 bf.c (limited to 'bf.c') diff --git a/bf.c b/bf.c new file mode 100644 index 0000000..862f88e --- /dev/null +++ b/bf.c @@ -0,0 +1,94 @@ +#include +#include +#include + +int main(int argc, char **argv) +{ + if (argc != 2) { + fprintf(stderr, "Usage: %s file.bf\n", argv[0]); + exit(EXIT_FAILURE); + } + + FILE *fp = fopen(argv[1], "r"); + fseek(fp, 0, SEEK_END); + size_t program_size = ftell(fp); + fseek(fp, 0, SEEK_SET); + + char program[program_size + 1]; + program[program_size] = 0; + + fread(program, sizeof(uint8_t), program_size, fp); + + fclose(fp); + + size_t dp = 0; + size_t pc = 0; + uint8_t mem[3000] = { 0 }; + + while (pc < program_size) { + switch (program[pc]) { + case '>': { + dp++; + break; + } + case '<': { + dp--; + break; + } + case '+': { + mem[dp]++; + break; + } + case '-': { + mem[dp]--; + break; + } + case ',': { + mem[dp] = getchar(); + break; + } + case '.': { + putchar(mem[dp]); + break; + } + case '[': { + if (mem[dp] == 0) { + size_t l = 1; + while (l) { + switch (program[++pc]) { + case '[': { + l++; + break; + } + case ']': { + l--; + break; + } + } + } + } + break; + } + case ']': { + if (mem[dp] != 0) { + size_t l = 1; + while (l) { + switch (program[--pc]) { + case ']': { l++; + break; + } + case '[': { + l--; + break; + } + } + } + } + break; + } + } + pc++; + } + + return EXIT_SUCCESS; +} -- cgit v1.2.3