From 5ca2770f461269f965811af2e32949cecb65745f Mon Sep 17 00:00:00 2001 From: kdx Date: Thu, 19 Jan 2023 00:10:57 +0100 Subject: close --- Brainfuck.ha | 3 ++- exec.ha | 24 ++++++++++++++++++++++++ main.ha | 2 ++ optimize.ha | 10 ++++++++++ token.ha | 13 +++++++++++++ 5 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 exec.ha create mode 100644 optimize.ha create mode 100644 token.ha diff --git a/Brainfuck.ha b/Brainfuck.ha index 59ab17d..07cf27e 100644 --- a/Brainfuck.ha +++ b/Brainfuck.ha @@ -1,4 +1,5 @@ +const mem_size: size = 30000; type Brainfuck = struct { ptr: size, - mem: [256]u8 + mem: [30000]u8 }; diff --git a/exec.ha b/exec.ha new file mode 100644 index 0000000..8b73c8b --- /dev/null +++ b/exec.ha @@ -0,0 +1,24 @@ +use io; +use os; + +fn exec(bf: *Brainfuck, b: []const u8) void = { + for (let i = 0z; i < len(b); i += 1) { + switch (b[i]) { + case '+' => bf.mem[bf.ptr] += 1; + case '-' => bf.mem[bf.ptr] -= 1; + case '<' => + if (bf.ptr > 0) + bf.ptr -= 1 + else + bf.ptr = mem_size - 1; + case '>' => + if (bf.ptr < bf.ptr - 1) + bf.ptr += 1 + else + bf.ptr = 0; + case '.' => io::write(os::stdout, bf.mem[bf.ptr..bf.ptr])!; + case ',' => io::read(os::stdin, bf.mem[bf.ptr..bf.ptr])!; + case => continue; + }; + }; +}; diff --git a/main.ha b/main.ha index 3b2f690..e1c9e74 100644 --- a/main.ha +++ b/main.ha @@ -9,4 +9,6 @@ let bf: Brainfuck = Brainfuck { export fn main() void = { const buf = drain_stdin(); defer free(buf); + const buf = optimize(buf); + exec(&bf, buf); }; diff --git a/optimize.ha b/optimize.ha new file mode 100644 index 0000000..c7f0306 --- /dev/null +++ b/optimize.ha @@ -0,0 +1,10 @@ +use fmt; + +fn optimize(b: []u8) []u8 = { + for (let i = 0z; i < len(b); i += 1) + if (!token(b[i])) { + delete(b[i]); + i -= 1; + }; + return b; +}; diff --git a/token.ha b/token.ha new file mode 100644 index 0000000..984debd --- /dev/null +++ b/token.ha @@ -0,0 +1,13 @@ +fn token(c: u8) bool = { + return switch (c) { + case '+' => yield true; + case '-' => yield true; + case '<' => yield true; + case '>' => yield true; + case '.' => yield true; + case ',' => yield true; + case '[' => yield true; + case ']' => yield true; + case => yield false; + }; +}; -- cgit v1.2.3