int main () { carp_value val = 127; carp_value code[] = {CARP_I(LOADR), CARP_R0, val, CARP_I(MOV), CARP_R1, CARP_R0, CARP_I(MOV), CARP_R2, CARP_R0, CARP_I(INCR), CARP_R2, CARP_I(MOV), CARP_R3, CARP_R0, CARP_I(DECR), CARP_R3, CARP_I(HALT), EXIT_SUCCESS}; carp_vm_init(&m, 1, 0); carp_vm_load(&m, code, sizeof(code)/sizeof(*code)); carp_vm_run(&m); carp_vm_cleanup(&m); plan(NO_PLAN); ok(m.regs[CARP_R0] == val, "Set register successfully."); ok(m.regs[CARP_R1] == val, "Moved register successfully."); ok(m.regs[CARP_R2] == val + 1, "Incremented register successfully."); ok(m.regs[CARP_R3] == val - 1, "Decremented register successfully."); done_testing(); }
/* Read, tokenize, lex, and execute the contents of a Carp file. */ carp_value carp_run_program (const char *fn) { carp_machine_state m; carp_tok *tokens = carp_lex_tokenize(fn); if (tokens == NULL) { fprintf(stderr, "Something went wrong with tokenization.\n"); exit(EXIT_FAILURE); } carp_lex_lex(&m, tokens); return carp_vm_run(&m); }
int main (int argc, char **argv) { carp_value code[] = { CARP_INSTR_PUSH, 5, CARP_INSTR_PUSH, 6, CARP_INSTR_PREG, CARP_SP, CARP_INSTR_DECR, CARP_SP, CARP_INSTR_POP, CARP_GBG, CARP_INSTR_PREG, CARP_GBG, CARP_INSTR_HALT, 1 }; carp_machine_state m; carp_vm_init(&m, 10, 0); carp_vm_load(&m, code, sizeof(code)/sizeof(*code)); carp_value ecode = carp_vm_run(&m); carp_vm_cleanup(&m); return ecode; }
int main (int argc, char **argv) { long long code[] = { CARP_INSTR_GLOAD, -5, // 1st arg CARP_INSTR_GLOAD, -4, // 2nd arg CARP_INSTR_ADD, CARP_INSTR_RET, CARP_INSTR_PUSH, 7, // 1st arg CARP_INSTR_PUSH, 9, // 2nd arg CARP_INSTR_CALL, 0, 2, CARP_INSTR_PTOP, CARP_INSTR_HALT, 0 }; carp_machine_state m; carp_vm_init(&m, 1, 6); carp_vm_load(&m, code, sizeof(code)); carp_vm_run(&m); }