diff options
author | kdx <kdx@42l.fr> | 2023-01-19 00:10:57 +0100 |
---|---|---|
committer | kdx <kdx@42l.fr> | 2023-01-19 00:10:57 +0100 |
commit | 5ca2770f461269f965811af2e32949cecb65745f (patch) | |
tree | 9e71a4ef186faf8e4324c06a7d6ba416b494f3e9 | |
parent | dbbc4d707595913797ab89d399833bc0cd95072b (diff) | |
download | hare-brainfuck-5ca2770f461269f965811af2e32949cecb65745f.tar.gz |
close
-rw-r--r-- | Brainfuck.ha | 3 | ||||
-rw-r--r-- | exec.ha | 24 | ||||
-rw-r--r-- | main.ha | 2 | ||||
-rw-r--r-- | optimize.ha | 10 | ||||
-rw-r--r-- | token.ha | 13 |
5 files changed, 51 insertions, 1 deletions
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 }; @@ -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; + }; + }; +}; @@ -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; + }; +}; |