brainf working!
This commit is contained in:
commit
1da2ac74d4
1 changed files with 82 additions and 0 deletions
82
bf.zig
Normal file
82
bf.zig
Normal file
|
@ -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;
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue