Skip to content

Instantly share code, notes, and snippets.

@mateoppalacios
Created June 20, 2021 04:42
Show Gist options
  • Save mateoppalacios/2335018845c4d83bdd4c07d01ab3d255 to your computer and use it in GitHub Desktop.
Save mateoppalacios/2335018845c4d83bdd4c07d01ab3d255 to your computer and use it in GitHub Desktop.
Basic brainfuck interpreter in C.
#include <stdio.h>
#define T_LEN 30000
int main (void)
{
unsigned char tape[T_LEN] = {0};
unsigned char *pointer = tape;
char inp_tape[T_LEN];
fgets (inp_tape, T_LEN, stdin);
int pos = 0;
int active_l, keep;
while (inp_tape[pos] != '\0') {
switch (inp_tape[pos]) {
case '+': (*pointer)++; if (*pointer > 255) return 1;
break;
case '-': (*pointer)--; if (*pointer < 0) return 1;
break;
case '>': pointer++; if (pointer - tape > T_LEN) return 1;
break;
case '<': pointer--; if (pointer - tape < 0) return 1;
break;
case '.': putchar (*pointer);
break;
case ',': *pointer = getchar ();
break;
case '[':
if (!*pointer) {
keep = 1;
while (keep > 0) {
pos++;
if (inp_tape[pos] == '[')
keep++;
else if (inp_tape[pos] == ']')
keep--;
}
}
else break;
case ']':
if (*pointer) {
active_l = 1;
while (active_l > 0) {
pos--;
if (inp_tape[pos] == '[')
active_l--;
else if (inp_tape[pos] == ']')
active_l++;
}
}
break;
}
pos++;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment