commit 1da2ac74d4af988667ad6e0fd214e53041427947 Author: mehbark Date: Mon Jun 24 13:23:11 2024 -0400 brainf working! diff --git a/bf.zig b/bf.zig new file mode 100644 index 0000000..99aad46 --- /dev/null +++ b/bf.zig @@ -0,0 +1,82 @@ +//brainf +const std = @import("std"); +const io = std.io; +const fs = std.fs; +const process = std.process; + +pub fn main() !void { + var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + var allocator = arena.allocator(); + defer arena.deinit(); + + var out = io.getStdOut().writer(); + var in = io.getStdIn().reader(); + + var args = process.args(); + defer args.deinit(); + _ = args.skip(); + + const prog_path = args.next() orelse { + try io.getStdErr().writer().writeAll("i need a program path :(\n"); + process.exit(1); + }; + + var prog_file = try fs.cwd().openFile(prog_path, .{}); + const prog_unfiltered = try prog_file.readToEndAlloc(allocator, 1 << 24); + var prog = try allocator.alloc(u8, prog_unfiltered.len); + var prog_len: u32 = 0; + for (prog_unfiltered) |c| { + if (c == '+' or c == '-' or c == '>' or c == '<' or c == '[' or c == ']' or c == '.' or c == ',') { + prog[prog_len] = c; + prog_len += 1; + } + } + + var mem = try allocator.alloc(u8, 1 << 16); + for (mem) |*m| { + m.* = 0; + } + var mp: u16 = 0; + var ip: u32 = 0; + + while (ip < prog_len) { + switch (prog[ip]) { + '+' => mem[mp] +%= 1, + '-' => mem[mp] -%= 1, + '>' => mp +%= 1, + '<' => mp -%= 1, + '[' => { + if (mem[mp] == 0) { + var depth: i16 = 1; + ip += 1; + while (depth > 0) : (ip += 1) { + depth += switch (prog[ip]) { + ']' => -1, + '[' => 1, + else => 0, + }; + } + ip -= 1; + } + }, + ']' => { + if (mem[mp] != 0) { + var depth: i16 = 1; + ip -= 1; + while (depth > 0) : (ip -= 1) { + depth += switch (prog[ip]) { + '[' => -1, + ']' => 1, + else => 0, + }; + } + ip += 1; + } + }, + '.' => try out.writeByte(mem[mp]), + ',' => mem[mp] = in.readByte() catch 0, + else => unreachable, + } + ip += 1; + } +}