Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael Rochester committed Apr 2, 2018
0 parents commit c298146
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 0 deletions.
Binary file added 42.bf
Binary file not shown.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# A Branfuck interpreter in C

This repo contains some demo brainfuck programs, most of which came from:
(c) 2016 Daniel B. Cristofani
http://brainfuck.org/

125 changes: 125 additions & 0 deletions brainfuck.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
#include <stdio.h>
#include <stdint.h>

char instruction_buffer[30000] = {0};
uint32_t instruction_pointer;
uint32_t loop_stack[30000] = {0};
uint32_t loop_stack_pointer;
uint8_t cells[3000000] = {0};
uint32_t data_pointer;

void run_brainfuck()
{
instruction_pointer = loop_stack_pointer = data_pointer = 0;

while(instruction_buffer[instruction_pointer])
{
// printf( "ip %d: ", instruction_pointer );
// printf( "i %c | ", instruction_buffer[instruction_pointer] );
// printf( "lsp %d: ", loop_stack_pointer );
// printf( "ls %d | ", loop_stack[loop_stack_pointer] );
// printf( "dp %d: ", data_pointer );
// printf( "c %d: ", cells[data_pointer] );
// printf( "\n" );

switch(instruction_buffer[instruction_pointer])
{
case '+':
cells[data_pointer]++;
break;
case '-':
cells[data_pointer]--;
break;
case '>':
data_pointer++;
break;
case '<':
data_pointer--;
break;
case '.':
putchar(cells[data_pointer]);
break;
case ',':
cells[data_pointer] = getchar();
break;
case '[':
if(cells[data_pointer])
{
loop_stack[++loop_stack_pointer] = instruction_pointer;
}
else
{
int skip_loop_stack = 0;
while(instruction_buffer[++instruction_pointer] != ']' || skip_loop_stack)
{
if(instruction_buffer[instruction_pointer] == '[')
{
skip_loop_stack++;
}
else if(instruction_buffer[instruction_pointer] == ']')
{
skip_loop_stack--;
}
}
}
break;
case ']':
if(cells[data_pointer])
{
instruction_pointer = loop_stack[loop_stack_pointer];
}
else
{
loop_stack_pointer--;
}
break;
}
instruction_pointer++;
if (instruction_pointer == 30000)
{
break;
}
}
return;
}

int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("usage: %s <filename.bf>\n", argv[0]);
return 0;
}

FILE *file = fopen(argv[1], "r");

if(file == 0)
{
printf( "Could not open file\n" );
return 0;
}

instruction_pointer = 0;
char c;
while((c = fgetc(file)) != EOF && instruction_pointer < 30000)
{
if ( c == '+' || c == '-' || c == '>' || c == '<' ||
c == '[' || c == ']' || c == '.' || c == ',' )
{
instruction_buffer[instruction_pointer] = c;
instruction_pointer++;
}
}
fclose(file);

if (instruction_pointer == 30000)
{
printf( "Too many characters in your file\n" );
return 0;
}

run_brainfuck();

printf("\n"); // since most BF programs wont bother to end their outbut with a new line
return 0;
}
Binary file added serpinski.bf
Binary file not shown.
Binary file added test.bf
Binary file not shown.
Binary file added transpiler.bf
Binary file not shown.

0 comments on commit c298146

Please sign in to comment.