Skip to content

Instantly share code, notes, and snippets.

@SeungheonOh
Created May 18, 2020 05:38
Show Gist options
  • Save SeungheonOh/24adb9e6a628faa108be5803f089769f to your computer and use it in GitHub Desktop.
Save SeungheonOh/24adb9e6a628faa108be5803f089769f to your computer and use it in GitHub Desktop.
brainfuck interpreter
// by SeungheonOh 2020
#include <stdio.h>
#include <stdlib.h>
int main() {
unsigned char heap[30000] = { 0 }, cloop = 0, *ptr = heap;
char doloop = 0, *loops[30000], *loopretp[30000] = { 0 }, *lptr, *innerptr, c;
while(1) {
if(!doloop) scanf("%c", &c);
else { c = *(lptr++); }
switch(c) {
case '>': ++ptr; break;
case '<': --ptr; break;
case '+': ++*ptr; break;
case '-': --*ptr; break;
case '.': printf("%c", *ptr); break;
case ',': scanf("%c", ptr); break;
case '[':
innerptr = lptr;
lptr = loops[++cloop] = malloc(30000);
int loopstart = 1;
while(loopstart != 0) {
if(cloop == 1)scanf("%c", lptr++);
else *(lptr++) = *(innerptr++);
if(*(lptr-1) == '[') loopstart++;
else if(*(lptr-1) == ']') loopstart--;
}
loopretp[cloop] = innerptr;
if(!*ptr) {
lptr = loopretp[cloop];
free(loops[cloop--]);
break;
}
lptr = loops[cloop];
doloop = 1;
break;
case ']':
if(*ptr) lptr = loops[cloop];
else {
if(cloop <= 1)doloop = 0;
else lptr = loopretp[cloop];
free(loops[cloop--]);
}
break;
default: break;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment