summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kdx@42l.fr>2023-01-19 00:10:57 +0100
committerkdx <kdx@42l.fr>2023-01-19 00:10:57 +0100
commit5ca2770f461269f965811af2e32949cecb65745f (patch)
tree9e71a4ef186faf8e4324c06a7d6ba416b494f3e9
parentdbbc4d707595913797ab89d399833bc0cd95072b (diff)
downloadhare-brainfuck-5ca2770f461269f965811af2e32949cecb65745f.tar.gz
close
-rw-r--r--Brainfuck.ha3
-rw-r--r--exec.ha24
-rw-r--r--main.ha2
-rw-r--r--optimize.ha10
-rw-r--r--token.ha13
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
};
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;
+ };
+};