typedef int c_int; union c_insn { void (*op) (); c_int *mem; c_int imm; }; static union c_insn c_stack[((0x100 + 4) * 4)]; static struct c_ident *c_funcs; static void (*c_op_bz) (); static void c_direct (union c_insn *addr); c_compile (int (*ext_getchar) (), void (*ext_rewind) (), struct c_ident *externs) { c_direct (((void *) 0)); } static void c_direct (union c_insn *addr) { union c_insn *pc = addr; union c_insn *sp = c_stack; c_int imm = 0; static void *ops[] = { &&op_index, &&op_assign, &&op_add_a, &&op_sub_a, &&op_mul_a, &&op_div_a, &&op_mod_a, &&op_or_a, &&op_xor_a, &&op_and_a, &&op_shl_a, &&op_shr_a, }; { c_op_bz = &&op_bz; } goto *(pc++)->op; op_bz:if (imm) { } op_push_imm_imm:(sp - 2)->imm = imm; goto *(pc - 1)->op; op_index:imm = *((sp - 3)->mem += imm); op_assign:*(sp - 3)->mem = imm; op_add_a:imm = *(sp - 3)->mem += imm; op_sub_a:imm = *(sp - 3)->mem -= imm; op_mul_a:imm = *(sp - 3)->mem *= imm; op_div_a:imm = *(sp - 3)->mem /= imm; op_mod_a:imm = *(sp - 3)->mem %= imm; op_or_a:imm = *(sp - 3)->mem |= imm; op_xor_a:imm = *(sp - 3)->mem ^= imm; op_and_a:imm = *(sp - 3)->mem &= imm; op_shl_a:imm = *(sp - 3)->mem <<= imm; op_shr_a:imm = *(sp - 3)->mem >>= imm; }