#ifndef CREOLE_H #define CREOLE_H #include #include #ifndef CREOLE_WORD # define CREOLE_WORD unsigned int # define CREOLE_WORD_MAX UINT_MAX #endif #define CREOLE_MAX_ARG 3 typedef CREOLE_WORD creole_word; enum creole_opcode { CREOLE_NOOP = 0, CREOLE_PUSH = 1, CREOLE_POP = 2, CREOLE_ADD = 3, CREOLE_MUL = 4, CREOLE_DIV = 5, CREOLE_JL = 6, CREOLE_CLB = 7, CREOLE_SYS = 8, CREOLE_OPCODE_LEN }; enum creole_word_flag { CREOLE_IMMEDIATE, CREOLE_REGISTER, CREOLE_WORD_FLAGS_LEN }; enum creole_compiler_ret { CREOLE_COMPILE_OK, CREOLE_OPCODE_READ_ERROR, CREOLE_OPCODE_MALFORMED, CREOLE_ARG_READ_ERROR, CREOLE_ARG_MALFORMED, CREOLE_LAST_READ_ERROR, CREOLE_LAST_MALFORMED, CREOLE_LABEL_OVERFLOW, CREOLE_TYPE_ERROR, CREOLE_COMPILE_CLEARED_INSTRUCTION, CREOLE_PROGRAM_OVERFLOW, CREOLE_COMPILE_RET_LEN }; enum creole_run_ret { CREOLE_STEP_CONTINUE, CREOLE_STEP_SYSCALL, CREOLE_STEP_STOP, CREOLE_STACK_OVERFLOW, CREOLE_STACK_UNDERFLOW, CREOLE_RUN_LABEL_OVERFLOW, CREOLE_REGISTER_OVERFLOW, CREOLE_STEP_UNKNOWN_OPCODE, CREOLE_RUN_RET_LEN }; struct creole_ins { enum creole_opcode opcode; unsigned char w_flags[3]; creole_word w[3]; }; struct creole_env { creole_word *reg; size_t reglen; size_t *lab; size_t lablen; creole_word *stk; size_t stkptr, stklen; struct creole_ins *prg; size_t prgptr, prgend, prglen; }; struct creole_reader { unsigned char *p; size_t left; }; int creole_encode(creole_word i, unsigned encode_to, unsigned high_bits, unsigned char buf[7]); enum creole_compiler_ret creole_parse_line(struct creole_ins *ins, struct creole_reader *r); enum creole_compiler_ret creole_compile(struct creole_env *env, struct creole_reader *r); enum creole_run_ret creole_reg_write(struct creole_env *env, unsigned reg, creole_word w); enum creole_run_ret creole_reg_read(struct creole_env *env, unsigned reg, creole_word *w); enum creole_run_ret creole_push(struct creole_env *env, creole_word w); enum creole_run_ret creole_pop(struct creole_env *env, creole_word *w); enum creole_run_ret creole_step(struct creole_env *env, creole_word *sc); #endif /* CREOLE_H */