#include "types.h" #include #include #include void interpret(Program* program) { Stack tape_stack; stack_init(&tape_stack, sizeof(void*)); Tape* tape = malloc(sizeof(Tape)); tape_init(tape, sizeof(void*)); stack_push(&tape_stack, tape); Symbol s; next: program_get(program, &s); switch (s) { case MoveLeft: tape_left(tape); break; case MoveRight: tape_right(tape); break; case Increment: tape_increment(tape); break; case Decrement: tape_decrement(tape); break; case StartLoop: if (tape_get(tape) == 0) { program_seek(program, program_get_jump(program)); } break; case EndLoop: if (tape_get(tape) != 0) { program_seek(program, program_get_jump(program)); } break; case PutChar: { printf("%c", tape_get(tape)); break; } case GetChar: { tape_set(tape, getchar()); break; } case Allocate: { Tape* new = malloc(sizeof(Tape)); tape_init(new, tape_get(tape)); memcpy(tape_ptr(tape), &new, sizeof(Tape*)); break; } case Free: { Tape* old; memcpy(&old, tape_ptr(tape), sizeof(Tape*)); tape_free(old); free(old); break; } case EnterTape: { stack_push(&tape_stack, tape); memcpy(&tape, tape_ptr(tape), sizeof(Tape*)); break; } case LeaveTape: { tape = stack_pop(&tape_stack); if (tape == NULL) goto end; break; } case GetString: { fgets((char*) tape_ptr(tape), tape_get(tape), stdin); break; } case PutString: { printf("%s", (char*) tape_ptr(tape)); break; } case Clear: printf("\033c"); break; case Zero: memset(tape_ptr(tape), 0, tape_get(tape)); break; case Eof: goto end; } program_next(program); goto next; end: tape_free(tape); free(tape); stack_free(&tape_stack); }