Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package bf
- import "core:os"
- import "core:fmt"
- import "core:time"
- import "core:unicode/utf8"
- foreign import libc "system:libcmt.lib";
- foreign libc {
- getchar :: proc"stdcall"() -> i32 ---;
- }
- main :: proc() {
- if len(os.args) != 2 {
- fmt.printf("Usage: odin-bf <file>\n");
- return;
- }
- program, ok := os.read_entire_file(os.args[1]);
- if !ok {
- fmt.printf("Failed to read file '%s'\n", os.args[1]);
- return;
- }
- mem: [30000]u8;
- stack: [dynamic]int;
- pc := 0;
- ptr := 0;
- for pc < len(program) {
- r := program[pc];
- pc += 1;
- switch r {
- case '[':
- if mem[ptr] == 0 {
- level := 1;
- i := pc;
- search_loop:
- for i < len(program) {
- r := program[i];
- i += 1;
- switch r {
- case '[':
- level += 1;
- case ']':
- level -= 1;
- if level == 0 {
- break search_loop;
- }
- }
- }
- pc = i;
- } else {
- append(&stack, pc);
- }
- case ']':
- if mem[ptr] > 0 {
- pc = stack[len(stack) - 1];
- } else {
- pop(&stack);
- }
- case '>':
- ptr += 1;
- case '<':
- ptr -= 1;
- case '+':
- mem[ptr] += 1;
- case '-':
- mem[ptr] -= 1;
- case '.':
- fmt.printf("%r", mem[ptr]);
- case ',':
- i := getchar();
- mem[ptr] = u8(i);
- case: // do nothing
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement