/* Program Name: BF Version: 1.0 Date: 2007-01-21 Description: Interpreter for the Brainfuck Programming Language License: GPL Author: pi8027 Source Lang: C */ #include #include #define DATA_SIZE 512 char * memory_pointer; char * memory_beginning_pointer; void Execute_Brainfuck(char * instruction_pointer){ int loop_nest = 0; char * instruction_beginning_loop_pointer; while(*instruction_pointer != 0){ if(*instruction_pointer == 1){ memory_pointer++; } else if(*instruction_pointer == 2){ memory_pointer--; } else if(*instruction_pointer == 3){ (*memory_pointer)++; } else if(*instruction_pointer == 4){ (*memory_pointer)--; } else if(*instruction_pointer == 5){ putchar(*memory_pointer); } else if(*instruction_pointer == 6){ *memory_pointer = getchar(); } else if(*instruction_pointer == 7){ instruction_beginning_loop_pointer = instruction_pointer + 1; while(*instruction_pointer != 0){ instruction_pointer++; if(*instruction_pointer == 7){ loop_nest++; } else if(*instruction_pointer == 8){ if(loop_nest == 0){ break; } else{ loop_nest--; } } } *instruction_pointer = 0; while(*memory_pointer != 0){ Execute_Brainfuck(instruction_beginning_loop_pointer); } *instruction_pointer = 8; } if(0 > memory_pointer - memory_beginning_pointer || DATA_SIZE <= memory_pointer - memory_beginning_pointer){ fputs("Error.\n" , stderr); exit(1); } instruction_pointer++; } return; } int main( int argc , char *argv[] ){ int getf; FILE *fp; char * instruction_pointer; char * instruction_beginning_pointer; int instruction_size = 1024; memory_beginning_pointer = (char *) calloc(DATA_SIZE,sizeof(char)); instruction_beginning_pointer = (char *) calloc(1024,sizeof(char)); instruction_pointer = instruction_beginning_pointer; memory_pointer = (char *) memory_beginning_pointer + DATA_SIZE/2; fp = fopen(argv[1] , "r"); if (fp == NULL || memory_beginning_pointer == NULL || instruction_beginning_pointer == NULL){ fputs("Error.\n" , stderr); exit(1); } while(1) { if (ferror(fp)){ fputs("Error.\n" , stderr); exit(1); } getf = fgetc(fp); if(!feof(fp)){ if(getf == 0x3e){ *instruction_pointer = 1; } else if(getf == 0x3c){ *instruction_pointer = 2; } else if(getf == 0x2b){ *instruction_pointer = 3; } else if(getf == 0x2d){ *instruction_pointer = 4; } else if(getf == 0x2e){ *instruction_pointer = 5; } else if(getf == 0x2c){ *instruction_pointer = 6; } else if(getf == 0x5b){ *instruction_pointer = 7; } else if(getf == 0x5d){ *instruction_pointer = 8; } else if(getf == 0x23){ while(getf != 0x0a && getf != 0x0d && getf != 0x00){ getf = fgetc(fp); } continue; } else{ continue; } instruction_pointer++; if(instruction_size - 1 == instruction_pointer - instruction_beginning_pointer){ instruction_beginning_pointer = (char *)realloc(instruction_beginning_pointer,instruction_size + 1024); instruction_size = instruction_size + 1024; if(instruction_beginning_pointer == NULL){ fputs("Error.\n" , stderr); exit(1); } } } else{ break; } } Execute_Brainfuck(instruction_beginning_pointer); fclose(fp); free(instruction_beginning_pointer); free(memory_beginning_pointer); return 0; }