void prim_ldup(PRIM_PROTOTYPE) { int i; CHECKOP_READONLY(1); nargs = 0; if (arg[*top - 1].type != PROG_INTEGER) abort_interp("Operand is not an integer."); result = arg[*top - 1].data.number; if (result < 0) abort_interp("Operand is negative."); result++; CHECKOP_READONLY(result); nargs = 0; CHECKOFLOW(result); for (i = result; i > 0; i--) { copyinst(&arg[*top - result], &arg[*top]); (*top)++; } }
void prim_pick(PRIM_PROTOTYPE) { CHECKOP_READONLY(1); temp1 = *(oper1 = POP()); if (temp1.type != PROG_INTEGER || temp1.data.number <= 0) abort_interp("Operand not a positive integer"); CHECKOP_READONLY(temp1.data.number); copyinst(&arg[*top - temp1.data.number], &arg[*top]); (*top)++; }
void prim_dup(PRIM_PROTOTYPE) { CHECKOP_READONLY(1); CHECKOFLOW(1); copyinst(&arg[*top - 1], &arg[*top]); (*top)++; }
void prim_over(PRIM_PROTOTYPE) { CHECKOP_READONLY(2); CHECKOFLOW(1); copyinst(&arg[*top - 2], &arg[*top]); (*top)++; }