void put_value(unsigned char** prg, double value) { int i; unsigned char* ptr = (unsigned char*)&value; for (i=0; i<sizeof(double); i++) put_commd(prg, ptr[i]); }
static int test_init_simple_run() { yla_cop_type prg[HEADER_SIZE + 2]; yla_cop_type *ptr = prg; put_header(&ptr, 0, 0, 2); put_commd(&ptr, CNOP); put_commd(&ptr, CHALT); yla_vm vm; YLATEST_ASSERT_TRUE(yla_vm_init(&vm, prg, HEADER_SIZE + 2), "normal"); YLATEST_ASSERT_TRUE(yla_vm_run(&vm), "normal") YLATEST_ASSERT_TRUE(yla_vm_done(&vm), "normal"); return 0; }
static int test_gencode() { yla_cop_type buf[100]; yla_cop_type *ptr = buf; put_commd(&ptr, 0x12); put_value(&ptr, 0x3456); put_commd(&ptr, 0x78); put_commd(&ptr, 0x9a); YLATEST_ASSERT_TRUE(buf[0] == 0x12, "put_commd"); YLATEST_ASSERT_TRUE(buf[1] == 0x34, "put_value"); YLATEST_ASSERT_TRUE(buf[2] == 0x56, "put_value"); YLATEST_ASSERT_TRUE(buf[3] == 0x78, "put_value"); YLATEST_ASSERT_TRUE(buf[4] == 0x9a, "put_value"); return 0; }
static int test_push() { yla_cop_type prg[HEADER_SIZE + 4]; yla_cop_type *ptr = prg; put_header(&ptr, 1, 0, 4); put_commd(&ptr, CPUSH); put_value(&ptr, 0x1234); put_commd(&ptr, CHALT); yla_vm vm; YLATEST_ASSERT_TRUE(yla_vm_init(&vm, prg, HEADER_SIZE + 4), "normal"); YLATEST_ASSERT_TRUE(yla_vm_run(&vm), "normal") YLATEST_ASSERT_TRUE(yla_vm_done(&vm), "normal"); return 0; }
static int test_get_stack_full() { yla_cop_type prg[HEADER_SIZE + 4]; yla_cop_type *ptr = prg; put_header(&ptr, 0, 0, 4); put_commd(&ptr, CPUSH); put_value(&ptr, 0x1234); put_commd(&ptr, CHALT); yla_vm vm; YLATEST_ASSERT_TRUE(yla_vm_init(&vm, prg, HEADER_SIZE + 4), "normal"); YLATEST_ASSERT_FALSE(yla_vm_run(&vm), "normal") YLATEST_ASSERT_TRUE(yla_vm_last_error(&vm) == YLA_VM_ERROR_STACK_FULL, "incorrect error code"); YLATEST_ASSERT_TRUE(yla_vm_done(&vm), "normal"); return 0; }
static int test_init_simple() { yla_cop_type prg[HEADER_SIZE + 1]; yla_cop_type *ptr = prg; put_header(&ptr, 0, 0, 1); put_commd(&ptr, CHALT); yla_vm vm; YLATEST_ASSERT_TRUE(yla_vm_init(&vm, prg, HEADER_SIZE + 1), "normal"); YLATEST_ASSERT_TRUE(yla_vm_do_command(&vm) == -1, "halt expected") YLATEST_ASSERT_TRUE(yla_vm_done(&vm), "normal"); return 0; }
static int test_code_limit() { yla_cop_type prg[HEADER_SIZE + 1]; yla_cop_type *ptr = prg; put_header(&ptr, 0, 0, 1); put_commd(&ptr, CNOP); yla_vm vm; YLATEST_ASSERT_TRUE(yla_vm_init(&vm, prg, HEADER_SIZE + 1), "normal"); YLATEST_ASSERT_FALSE(yla_vm_run(&vm), "normal") YLATEST_ASSERT_TRUE(yla_vm_last_error(&vm) == YLA_VM_ERROR_CODE_SEG_EXCEED, "incorrect error code"); YLATEST_ASSERT_TRUE(yla_vm_done(&vm), "normal"); return 0; }
int main() { unsigned char* ptr = Program; /* так можно размещать перемнные до запуска ВМ */ add_var("pi"); set_var("pi", 3.14159265); /* так создаются пермеменные в программе ВМ */ put_commd(&ptr, CNVAR); put_strng(&ptr, "x1"); put_commd(&ptr, CPUSH); put_value(&ptr, 2.0); put_commd(&ptr, CSVAR); put_strng(&ptr, "x1"); /* вычисление выражения (2.3+4.7)*2.1 */ put_commd(&ptr, CPUSH); put_value(&ptr, 2.3); put_commd(&ptr, CPUSH); put_value(&ptr, 4.7); put_commd(&ptr, CADD); put_commd(&ptr, CPUSH); put_value(&ptr, 2.1); put_commd(&ptr, CMULT); /* делим результат на Pi */ put_commd(&ptr, CGVAR); put_strng(&ptr, "pi"); put_commd(&ptr, CDIV); /* умножаем на x1 */ put_commd(&ptr, CGVAR); put_strng(&ptr, "x1"); put_commd(&ptr, CMULT); /* выводим результат, останавливаем машину */ put_commd(&ptr, COUT); put_commd(&ptr, CHALT); vmin = stdin; vmout = stdout; run(); return 1; }