diff options
| author | Johnny Richard <johnny@johnnyrichard.com> | 2025-12-14 09:48:13 +0100 |
|---|---|---|
| committer | Johnny Richard <johnny@johnnyrichard.com> | 2025-12-14 09:48:13 +0100 |
| commit | fe3ab5580d5231e1940f25baefd8a97a036d67a2 (patch) | |
| tree | 41dfcbaad342789a4e6163bf1782c151afc275f8 | |
Signed-off-by: Johnny Richard <johnny@johnnyrichard.com>
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | Makefile | 6 | ||||
| -rw-r--r-- | bf.c | 94 | ||||
| -rw-r--r-- | program.bf | 1 |
4 files changed, 102 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..292a768 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bf diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..acc1e04 --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +.POSIX: +.SHELL: /bin/sh + +CFLAGS=-g -Wall -Werror -pedantic + +all: bf @@ -0,0 +1,94 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> + +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; +} diff --git a/program.bf b/program.bf new file mode 100644 index 0000000..8def844 --- /dev/null +++ b/program.bf @@ -0,0 +1 @@ +++++++++++[->++++++++<]>.>+++++++[->+++++++<]>+++.>++++++++[->++++<]>.>+++++++[->++++++++<]>.>++++++++[->++++<]>.><<<-.>>>>++++++++++.>++++++++[->++++++++<]>.>++++++++++++++++[->++++++++++<]>.>++++++++++++++++[->++++++++++<]>-.>++++++++[->++++++++<]>+.<<.<<.<<.<<. |
