Advertisement
TheBirkIsReal

Untitled

Jan 16th, 2019
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.28 KB | None | 0 0
  1. package bf
  2.  
  3. import "core:os"
  4. import "core:fmt"
  5. import "core:time"
  6. import "core:unicode/utf8"
  7.  
  8. foreign import libc "system:libcmt.lib";
  9. foreign libc {
  10.     getchar :: proc"stdcall"() -> i32 ---;
  11. }
  12.  
  13. main :: proc() {
  14.     if len(os.args) != 2 {
  15.         fmt.printf("Usage: odin-bf <file>\n");
  16.         return;
  17.     }
  18.  
  19.     program, ok := os.read_entire_file(os.args[1]);
  20.     if !ok {
  21.         fmt.printf("Failed to read file '%s'\n", os.args[1]);
  22.         return;
  23.     }
  24.  
  25.     mem: [30000]u8;
  26.     stack: [dynamic]int;
  27.     pc := 0;
  28.     ptr := 0;
  29.  
  30.     for pc < len(program) {
  31.         r := program[pc];
  32.         pc += 1;
  33.  
  34.         switch r {
  35.         case '[':
  36.             if mem[ptr] == 0 {
  37.                 level := 1;
  38.                 i := pc;
  39.  
  40.                 search_loop:
  41.                 for i < len(program) {
  42.                     r := program[i];
  43.                     i += 1;
  44.                     switch r {
  45.                     case '[':
  46.                         level += 1;
  47.                     case ']':
  48.                         level -= 1;
  49.                         if level == 0 {
  50.                             break search_loop;
  51.                         }
  52.                     }
  53.                 }
  54.  
  55.                 pc = i;
  56.             } else {
  57.                 append(&stack, pc);
  58.             }
  59.         case ']':
  60.             if mem[ptr] > 0 {
  61.                 pc = stack[len(stack) - 1];
  62.             } else {
  63.                 pop(&stack);
  64.             }
  65.         case '>':
  66.             ptr += 1;
  67.         case '<':
  68.             ptr -= 1;
  69.         case '+':
  70.             mem[ptr] += 1;
  71.         case '-':
  72.             mem[ptr] -= 1;
  73.         case '.':
  74.             fmt.printf("%r", mem[ptr]);
  75.         case ',':
  76.             i := getchar();
  77.             mem[ptr] = u8(i);
  78.         case: // do nothing
  79.         }
  80.     }
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement