Skip to content

Instantly share code, notes, and snippets.

@mrnugget
Created August 4, 2016 09:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mrnugget/06b269cf6230cd3cc40d4de3f9d7eaae to your computer and use it in GitHub Desktop.
Save mrnugget/06b269cf6230cd3cc40d4de3f9d7eaae to your computer and use it in GitHub Desktop.
#include <string.h>
#include <stdio.h>
#define MEM_SIZE 30000
char mem[MEM_SIZE] = {0};
char *memp = mem;
void bf_eval(char *code, int len, FILE *in, FILE *out)
{
int ip = 0;
while (ip < len) {
switch (code[ip]) {
case '+':
++*memp;
break;
case '-':
--*memp;
break;
case '>':
if (memp == (mem+MEM_SIZE)) {
printf("err: mem pointer reached upper limit\n");
return;
}
memp++;
break;
case '<':
if (memp == mem) {
printf("err: mem pointer reached lower limit\n");
return;
}
memp--;
break;
case '.':
putc(*(int *)memp, out);
break;
case ',':
*memp = getc(in);
break;
case '[':
if (*memp == 0) {
int depth = 1;
while (depth != 0) {
ip++;
if (code[ip] == '[') {
depth++;
} else if (code[ip] == ']') {
depth--;
}
}
}
break;
case ']':
if (*memp != 0) {
int depth = 1;
while (depth != 0) {
ip--;
if (code[ip] == ']') {
depth++;
} else if (code[ip] == '[') {
depth--;
}
}
}
break;
}
ip++;
}
}
char *tests[] = {
// prints "Brainfuck in C!\n"
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++"
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
"++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++"
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++"
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
"+++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++"
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++"
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
"++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++"
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++"
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
"+++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++"
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++"
"++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++"
"++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++"
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
"++++++++++++++++++.>++++++++++++++++++++++++++++++++.>+++++++++++++++++++"
"++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++"
"++++++++++.>++++++++++.",
// prints "Hello World!\n"
"++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>."
"<-.<.+++.------.--------.>>+.>++.",
// prints Sierpinski triangle
" >"
" + +"
" + +"
" [ < + +"
" + +"
" + + + +"
" > - ] >"
" + + + + + + + +"
" [ >"
" + + + +"
" < - ] >"
" > + + > > > + >"
" > > + <"
" < < < < < < < <"
" < [ - [ - > + <"
" ] > [ - < + > > > . < < ] > > >"
" [ ["
" - > + +"
" + + + +"
" + + [ > + + + +"
" < - ] >"
" . < < [ - > + <"
" ] + > [ - > + +"
" + + + + + + + + < < + > ] > . ["
" - ] > ]"
" ] + < < < [ - ["
" - > + < ] + > ["
" - < + > > > - [ - > + < ] + + >"
" [ - < - > ] < <"
" < ] < < < < ] + + + + + + + + +"
" + . + + + . [ - ] < ] + + + + +"
" * * * * * M a d e * B y : * N Y Y R I K K I * 2 0 0 2 * * * * *",
};
int main(int argc, char *argv[])
{
int len = sizeof(tests)/sizeof(char *);
for (int i = 0; i < len; i++) {
// reset memory pointer and memory
memp = mem;
memset(mem, 0, MEM_SIZE);
// evaluate program
bf_eval(tests[i], strlen(tests[i]), stdin, stdout);
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment