#include #include #include #define cell_t int64_t extern cell_t sp; extern cell_t stack; void emit() { putchar(*(&stack + --sp)); } void _print() { printf("%ld\n", *(&stack + --sp)); } void sub() { cell_t *st = &stack; st[sp - 2] -= st[sp - 1]; --sp; } void cswap() { cell_t *st = &stack; --sp; if (st[sp]) { cell_t tmp = st[sp - 1]; st[sp - 1] = st[sp - 2]; st[sp - 2] = tmp; } } void eq() { cell_t *st = &stack; --sp; st[sp - 1] = st[sp - 1] == st[sp]; } void alloc() { cell_t *st = &stack; st[sp - 1] = (cell_t)malloc(st[sp - 1] * sizeof(cell_t)); } void dealloc() { cell_t *st = &stack; --sp; free((cell_t *)st[sp]); } void peek() { cell_t *st = &stack; st[sp - 1] = *(cell_t *)st[sp - 1]; } void poke() { cell_t *st = &stack; sp -= 2; cell_t *ptr = (cell_t *)st[sp + 1]; *ptr = st[sp]; } void dumpstack() { cell_t *st = &stack; printf(" "); for (int i = 0; i < sp; ++i) printf("%ld ", st[i]); putchar('\n'); }