Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Version 1 of Brainf___ by ralphmerridew begins here.
- Use fixed allocation translates as (- Constant FIXED_SIZE 0; -).
- Use bf memory size of at least 5 translates as (- Constant FIXED_MEMORY_SIZE {N}; -).
- Use bf program size of at least 400 translates as (- Constant FIXED_PROGRAM_SIZE {N}; -).
- Include (-
- #ifdef TARGET_ZCODE;
- Default FIXED_SIZE 0;
- #endif;
- Global memory_pointer = 0;
- Global program_pointer = 0;
- #Ifdef FIXED_SIZE;
- Constant MEMORY_SIZE = FIXED_MEMORY_SIZE;
- Constant PROGRAM_SIZE = FIXED_PROGRAM_SIZE;
- !Default MEMORY_SIZE = 30000;
- Array memory -> MEMORY_SIZE;
- !#Default PROGRAM_SIZE = 2000;
- Array program -> PROGRAM_SIZE;
- [ Realloc_mem ; print "Realloc_mem() called with FIXED_SIZE [BUG]^"; return 0; ];
- #endif;
- #Ifndef FIXED_SIZE;
- Global memory= 0;
- Global MEMORY_SIZE= 0;
- Global program = 0;
- Global PROGRAM_SIZE = 0;
- [ Realloc_mem new_size new_pointer i;
- !print "Realloc_mem (), current size = ", MEMORY_SIZE, "^";
- if (MEMORY_SIZE == 0) {
- new_size = 3;
- } else {
- new_size = 2 * MEMORY_SIZE;
- }
- !print "Reallocating to ", new_size, "^";
- @malloc new_size new_pointer;
- if (new_pointer == 0) {
- !print "Error allocating memory";
- if (memory) {
- @mfree memory;
- memory_size = 0;
- memory = 0;
- }
- return 0;
- }
- !print "Allocated to ", new_size, ".^";
- if (memory == 0) {
- !print "Memory was unallocated^";
- memory_pointer = 0;
- } else if (memory_pointer == 0) {
- !print "Pointer was at low end, copying^";
- for (i = 0: i < memory_size: ++ i)
- new_pointer->i = 0;
- for (i = 0: i < memory_size: ++ i)
- new_pointer->(i + memory_size) = memory->i;
- memory_pointer = memory_size;
- @mfree memory;
- } else {
- !print "Pointer was at high end, copying^";
- for (i = 0: i < memory_size: ++ i)
- new_pointer->i = memory->i;
- for (: i < new_size: ++ i)
- new_pointer->i = 0;
- @mfree memory;
- }
- !print "Okay, returning^";
- memory_size = new_size;
- memory = new_pointer;
- return 1;
- ];
- #endif;
- #Message "BF: End of fixed / dynamic allocators";
- Constant BF_SUCCESS 0;
- Constant BF_RUN_PAST_PROGRAM 1;
- Constant BF_MEMORY_ERROR 2;
- Constant BF_UNMATCHED_BRACES 3;
- #Message "BF: Declared constants";
- [ Dump i;
- print "Memory: ";
- for (i = 0: i < 10: ++ i) {
- if (i == memory_pointer) { print "["; }
- print memory->i;
- if (i == memory_pointer) { print "]"; }
- print " ";
- }
- print "^";
- ];
- #Message "Text to Dump()";
- #Ifdef TARGET_ZCODE;
- #Message "FS:PS";
- Constant PROGRAM_STARTS 2;
- #Message "FS:PS2";
- #Ifnot;
- #Message "nFS:PS";
- Constant PROGRAM_STARTS 0;
- #Message "nFS:PS2";
- #Endif;
- #Message "Program start places";
- [ Run_Interpreter op depth op_count;
- !print "Run_Interpreter ()^";
- #ifndef FIXED_SIZE;
- if (MEMORY_SIZE == 0) Realloc_mem();
- #endif;
- op_count = 0;
- for (::) {
- !print "Iteration ", op_count, "^"; dump();
- ++ op_count;
- if (program_pointer == PROGRAM_SIZE) {
- !print "Run past end of program memory^";
- return BF_RUN_PAST_PROGRAM;
- }
- op = program->program_pointer;
- !print "program pointer is ", program_pointer, ", opcode is ", op, ", memory pointer is ", memory_pointer, "^";
- if (op == 0) { ! EOF
- !print "Ran successfully.^";
- return BF_SUCCESS;
- } else if (op == 91) { ! [
- ++ program_pointer;
- if (memory->memory_pointer == 0) {
- depth = 1;
- while (depth > 0 && program_pointer < PROGRAM_SIZE) {
- op = program->program_pointer;
- ++ program_pointer;
- if (op == 0) {
- !print "Unmatched [ in program^";
- return BF_UNMATCHED_BRACES;
- } else if (op == 93) {
- -- depth;
- } else if (op == 91) {
- ++ depth;
- }
- }
- }
- } else if (op == 93) { ! ]
- if (memory->memory_pointer == 0) {
- ++ program_pointer;
- } else {
- depth = 1;
- -- program_pointer;
- while (depth > 0 && program_pointer >= PROGRAM_STARTS) {
- op = program->program_pointer;
- if (op == 93) {
- ++ depth;
- } else if (op == 91) {
- -- depth;
- }
- -- program_pointer;
- }
- ++ program_pointer;
- if (program_pointer < PROGRAM_STARTS)
- return BF_UNMATCHED_BRACES;
- }
- } else {
- ++ program_pointer;
- if (op == 62) { ! >
- ++ memory_pointer;
- if (memory_pointer == MEMORY_SIZE) {
- #ifdef FIXED_SIZE;
- memory_pointer = 0;
- #ifnot;
- if (Realloc_mem () == 0) return BF_MEMORY_ERROR;
- if (memory == 0) return BF_MEMORY_ERROR;
- #endif;
- }
- } else if (op == 60) { ! <
- if (memory_pointer == 0) {
- #ifdef FIXED_SIZE;
- memory_pointer = MEMORY_SIZE;
- #ifnot;
- if (Realloc_mem() == 0) return BF_MEMORY_ERROR;
- if (memory == 0) return BF_MEMORY_ERROR;
- #endif;
- }
- -- memory_pointer;
- } else if (op == 43) { ! +
- memory->memory_pointer = memory->memory_pointer + 1;
- } else if (op == 45) { ! -
- memory->memory_pointer = memory->memory_pointer - 1;
- } else if (op == 46) { ! . (output)
- !print (char) memory->memory_pointer;
- OutputByte (memory->memory_pointer);
- } else if (op == 44) { ! , (input)
- memory->memory_pointer = VM_KeyChar ();
- }
- }
- }
- ];
- [ OutputByte ch;
- if (ch >= 32 && ch < 127) {
- print (char) ch;
- } else if (ch == 10 || ch == 13) {
- print "^";
- } else {
- print "?";
- }
- ];
- #ifndef FIXED_SIZE;
- Array dummy -> 4;
- [ AllocateProgramSize len temp_alloc;
- if (PROGRAM_SIZE > len) { return 1; }
- @malloc len temp_alloc;
- if (temp_alloc == 0) return 0;
- if (program) { @mfree program; }
- program = temp_alloc;
- PROGRAM_SIZE = len;
- ];
- #endif;
- [ SetProgram str len;
- !print "SetProgram (", (string) str, ")^";
- #ifdef TARGET_GLULX;
- #ifndef FIXED_SIZE;
- len = 5 + Glulx_PrintAnyToArray (dummy, 0, str);
- if (AllocateProgramSize (len) == 0) return 0;
- #endif;
- len = Glulx_PrintAnyToArray (program, PROGRAM_SIZE - 1, str);
- !print "Read length was ", len, "^";
- program_pointer = 0;
- if (len < PROGRAM_SIZE - 1) {
- !program->len = 0;
- return 1;
- }
- #ifnot;
- !print "Setting program-->0 to ", PROGRAM_SIZE - 3, "^";
- program-->0 = PROGRAM_SIZE - 3;
- @output_stream 3 program;
- print (string) str;
- @output_stream -3;
- len = program-->0;
- !print "Read length was ", len, "^";
- program_pointer = 2;
- if (len < PROGRAM_SIZE - 3) {
- !program->(len+2) = 0;
- return 1;
- }
- #endif;
- return 0; ! Too long
- ];
- [ substitute_parens i ch;
- for (i = PROGRAM_STARTS; i < program_size; ++ i) {
- ch = program->i;
- if (ch == 40) { ! (
- program->i = 91; ! [
- } else if (ch == 41) { ! )
- program->i = 93; ! ]
- }
- }
- ];
- [ RunBFProgram str is_escaped rv;
- !print "RunBFProgram (...)^";
- if (SetProgram(str)) {
- !print "Okay, program set^";
- if (is_escaped) {
- substitute_parens();
- !print "Parens changed to brackets^";
- }
- rv = Run_Interpreter();
- style bold;
- switch (rv) {
- BF_SUCCESS: print "Run to completion";
- BF_RUN_PAST_PROGRAM: print "Run past end of program";
- BF_MEMORY_ERROR: print "Memory error";
- BF_UNMATCHED_BRACES: print "Unmatched braces";
- default: print "Unknown return code ", rv;
- }
- style roman;
- } else {
- style bold;
- print "Error setting program";
- style roman;
- }
- print "^";
- !print "RunBFP returning^";
- return;
- ];
- #Message "End of function";
- -).
- To run the program (str - text): (- RunBFProgram ( {str}, 0 ); -).
- To run the escaped program (str - text): (- RunBFProgram ( {str}, 1 ); -).
- Brainf___ ends here.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement