Name: The Amazing Anus !Anus3nMVO2 2009-08-31 1:43
I was bored as fuck so I decided to implement a Brainfuck interpreter in C.
/* brainfuck.c ... version 0.9
*
* usage: brainfuck <file>
*
*/
#include <stdio.h>
/* 64kb -1b each
*
* The Brainfuck spec says that memory should be 30000 bytes, but I prefer to
* use a whole 64kb for both code and memory.
*
*/
#define BRAINF_CODESIZE 65535
#define BRAINF_MEMSIZE 65535
FILE* fp;
unsigned char* code, *memory;
short unsigned int codeptr, memptr;
int main(int argc, char* argv[])
{
if (argc != 2)
exit(1);
if ((fp = fopen(argv[1], "r")) == NULL)
exit(1);
code = malloc(BRAINF_CODESIZE);
memory = malloc(BRAINF_MEMSIZE);
memset(code, 0, BRAINF_CODESIZE);
memset(memory, 0, BRAINF_MEMSIZE);
codeptr = 0;
memptr = 0;
while (!feof(fp))
{
fread(code, BRAINF_CODESIZE -1, 1, fp);
}
/*** Interpreting begins ***/
while (code[codeptr])
{
switch (code[codeptr])
{
case '>':
++memptr;
++codeptr;
break;
case '<':
--memptr;
++codeptr;
break;
case '+':
++memory[memptr];
++codeptr;
break;
case '-':
--memory[memptr];
++codeptr;
break;
case '.':
putchar(memory[memptr]);
++codeptr;
break;
case ',':
memory[memptr] = getchar();
++codeptr;
break;
/* :NOTE: Some kind of error handling should take
* place if no ']' is found.
*/
case '[':
if (!memory[memptr])
{
while ((code[codeptr] != ']') && (code[codeptr]))
{
++codeptr;
}
}
else
++codeptr;
break;
/* :NOTE: Some kind of error handling should take
* place if no '[' is found.
*/
case ']':
if (memory[memptr])
{
while ((code[codeptr] != '[') && (codeptr))
--codeptr;
}
else
++codeptr;
break;
/* invalid instruction
* For now we will just continue executing when this happens.
* It should ignore characters 10, 13, & 32 anyways.
*/
default:
++codeptr;
break;
}
}
free(code);
}