#pragma once #include #include typedef enum { MoveLeft, MoveRight, Increment, Decrement, StartLoop, EndLoop, PutChar, GetChar, Allocate, Free, EnterTape, LeaveTape, PutString, GetString, Clear, Eof } Symbol; typedef struct { uint32_t len; uint32_t index; struct instruction { Symbol s; uint32_t j; } * data; } Program; void program_init(Program* program, FILE* file); void program_get(Program* program, Symbol* symbol); uint32_t program_get_jump(Program* program); void program_next(Program* program); void program_seek(Program* program, uint32_t index); void program_free(Program* program); typedef struct { uint32_t len; uint32_t index; union stored { void* p; uint32_t i; } * data; } Stack; void stack_init(Stack* stack, uint32_t len); void stack_push(Stack* stack, void* value); void* stack_pop(Stack* stack); void stack_pushi(Stack* stack, uint32_t value); uint32_t stack_popi(Stack* stack); void stack_free(Stack* stack); typedef struct { uint8_t len; uint8_t index; uint8_t* data; } Tape; void tape_init(Tape* tape, uint8_t len); void tape_free(Tape* tape); void tape_left(Tape* tape); void tape_right(Tape* tape); void tape_increment(Tape* tape); void tape_decrement(Tape* tape); uint8_t tape_get(Tape* tape); void tape_set(Tape* tape, uint8_t value); void* tape_ptr(Tape* tape); void interpret(Program* program);