/* Brainfuck Utility Debugger by Uranium-239 C */ #include #include #include /* +++++++++[>+++++++++<-]++++[>++++<-]>[->+>+>+>+<<<<]>>>>[- | | | Uranium 239 | | | <<<<+>>>>]<[<]>>+++++++++++++>+++>>++++[-<++++++>]<[<]>[.>] */ int RewindPosition(FILE* read){ char a; while(ftell(read)>0){ fseek(read,-2,SEEK_CUR); a = fgetc(read); if(a==']'){ if(!RewindPosition(read)){ return 0; } }else if(a=='[') return 1; } return 0; } int ForwardPosition(FILE* read){ char a; while(!feof(read)){ if((a=fgetc(read))==']'){ return 1; }else if(a=='['){ if(!ForwardPosition(read)){ return 0; } } } return 0; } int main(int argc,char *argv[]){ char file_buf[500]; if(!argv[1]){ printf("File: "); fgets(file_buf,sizeof(file_buf),stdin); if(strlen(file_buf)>0) file_buf[strlen(file_buf)-1]=0; }else strncpy(file_buf,argv[1],sizeof(file_buf)-1); FILE* read = fopen(file_buf,"rb"); unsigned short loops = 0; if(read==NULL){ puts("Could not open handle to file"); getchar(); return 0; } char *ptr,byte,*mem,*min,*max; if(!(mem=(char*)malloc(30000))){ puts("Error allocating memory"); getchar(); return 0; } memset(mem,0,30000); ptr = mem; min = ptr; max = ptr + 30000 - 1; while((byte=fgetc(read))!=EOF){ switch(byte){ case '<': if(min': if(max>ptr)++ptr; else{ puts("\n-- Pointer Error : Invalid righ shift\n"); fclose(read); free(mem); getchar(); return 0; } break; case '+': ++*ptr; break; case '[': loops++; if(!*ptr){ if(!ForwardPosition(read)){ puts("--Loop Error-- \"Expected ]\""); fclose(read); free(mem); getchar(); return 0; } } break; case '-': --*ptr; break; case '.': putchar(*ptr); break; case ',': *ptr = getchar(); break; case ']': if(!loops){ puts("--Loop Error-- \"Expected [ before ]\""); fclose(read); free(mem); getchar(); return 0; } if(*ptr){ if(!RewindPosition(read)){ puts("--Loop Error-- \"Expected [ \""); fclose(read); free(mem); getchar(); return 0; } } break; } } free(mem); fclose(read); puts("\n\n-Executing Note- Program execution complete\n"); getchar(); return 0; }