📄 opcodes.c
字号:
v2 = &stack[0]; if (v1->v_type == V_ADDR) v1 = v1->v_addr; if (v2->v_type == V_ADDR) v2 = v2->v_addr; if ((v1->v_type != V_NUM) || (v2->v_type != V_NUM) || !qispos(v2->v_num)) { absvalue(v1, v2, &tmp); freevalue(stack--); freevalue(stack); *stack = tmp; return; } if (stack->v_type == V_NUM) qfree(stack->v_num); stack--; if ((stack->v_type == V_NUM) && !qisneg(v1->v_num)) return; q = qabs(v1->v_num); if (stack->v_type == V_NUM) qfree(stack->v_num); stack->v_num = q; stack->v_type = V_NUM;}static voido_norm(){ VALUE *vp; NUMBER *q; VALUE tmp; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; if (vp->v_type == V_NUM) { q = qsquare(vp->v_num); if (stack->v_type == V_NUM) qfree(stack->v_num); stack->v_num = q; stack->v_type = V_NUM; return; } normvalue(vp, &tmp); freevalue(stack); *stack = tmp;}static voido_square(){ VALUE *vp; NUMBER *q; VALUE tmp; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; if (vp->v_type == V_NUM) { q = qsquare(vp->v_num); if (stack->v_type == V_NUM) qfree(stack->v_num); stack->v_num = q; stack->v_type = V_NUM; return; } squarevalue(vp, &tmp); freevalue(stack); *stack = tmp;}static voido_istype(){ VALUE *v1, *v2; int r; v1 = &stack[-1]; v2 = &stack[0]; if (v1->v_type == V_ADDR) v1 = v1->v_addr; if (v2->v_type == V_ADDR) v2 = v2->v_addr; if ((v1->v_type != V_OBJ) || (v2->v_type != V_OBJ)) r = (v1->v_type == v2->v_type); else r = (v1->v_obj->o_actions == v2->v_obj->o_actions); freevalue(stack--); freevalue(stack); stack->v_num = itoq((long) r); stack->v_type = V_NUM;}static voido_isint(){ VALUE *vp; NUMBER *q; vp = stack; if (vp->v_type == V_ADDR) vp = stack->v_addr; if (vp->v_type != V_NUM) { freevalue(stack); stack->v_num = qlink(&_qzero_); stack->v_type = V_NUM; return; } if (qisint(vp->v_num)) q = qlink(&_qone_); else q = qlink(&_qzero_); if (stack->v_type == V_NUM) qfree(stack->v_num); stack->v_num = q; stack->v_type = V_NUM;}static voido_isnum(){ VALUE *vp; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; switch (vp->v_type) { case V_NUM: if (stack->v_type == V_NUM) qfree(stack->v_num); break; case V_COM: if (stack->v_type == V_COM) comfree(stack->v_com); break; default: freevalue(stack); stack->v_num = qlink(&_qzero_); stack->v_type = V_NUM; return; } stack->v_num = qlink(&_qone_); stack->v_type = V_NUM;}static voido_ismat(){ VALUE *vp; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; if (vp->v_type != V_MAT) { freevalue(stack); stack->v_num = qlink(&_qzero_); stack->v_type = V_NUM; return; } freevalue(stack); stack->v_type = V_NUM; stack->v_num = qlink(&_qone_);}static voido_islist(){ VALUE *vp; int r; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; r = (vp->v_type == V_LIST); freevalue(stack); stack->v_num = (r ? qlink(&_qone_) : qlink(&_qzero_)); stack->v_type = V_NUM;}static voido_isobj(){ VALUE *vp; int r; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; r = (vp->v_type == V_OBJ); freevalue(stack); stack->v_num = (r ? qlink(&_qone_) : qlink(&_qzero_)); stack->v_type = V_NUM;}static voido_isstr(){ VALUE *vp; int r; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; r = (vp->v_type == V_STR); freevalue(stack); stack->v_num = (r ? qlink(&_qone_) : qlink(&_qzero_)); stack->v_type = V_NUM;}static voido_isfile(){ VALUE *vp; int r; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; r = (vp->v_type == V_FILE); freevalue(stack); stack->v_num = (r ? qlink(&_qone_) : qlink(&_qzero_)); stack->v_type = V_NUM;}static voido_isassoc(){ VALUE *vp; int r; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; r = (vp->v_type == V_ASSOC); freevalue(stack); stack->v_num = (r ? qlink(&_qone_) : qlink(&_qzero_)); stack->v_type = V_NUM;}static voido_issimple(){ VALUE *vp; int r; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; r = 0; switch (vp->v_type) { case V_NULL: case V_NUM: case V_COM: case V_STR: r = 1; } freevalue(stack); stack->v_num = (r ? qlink(&_qone_) : qlink(&_qzero_)); stack->v_type = V_NUM;}static voido_isodd(){ VALUE *vp; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; if ((vp->v_type == V_NUM) && qisodd(vp->v_num)) { if (stack->v_type == V_NUM) qfree(stack->v_num); stack->v_num = qlink(&_qone_); stack->v_type = V_NUM; return; } freevalue(stack); stack->v_num = qlink(&_qzero_); stack->v_type = V_NUM;}static voido_iseven(){ VALUE *vp; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; if ((vp->v_type == V_NUM) && qiseven(vp->v_num)) { if (stack->v_type == V_NUM) qfree(stack->v_num); stack->v_num = qlink(&_qone_); stack->v_type = V_NUM; return; } freevalue(stack); stack->v_num = qlink(&_qzero_); stack->v_type = V_NUM;}static voido_isreal(){ VALUE *vp; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; if (vp->v_type == V_NUM) { if (stack->v_type == V_NUM) qfree(stack->v_num); stack->v_num = qlink(&_qone_); stack->v_type = V_NUM; return; } freevalue(stack); stack->v_num = qlink(&_qzero_); stack->v_type = V_NUM;}static voido_isnull(){ VALUE *vp; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; if (vp->v_type != V_NULL) { freevalue(stack); stack->v_num = qlink(&_qzero_); stack->v_type = V_NUM; return; } freevalue(stack); stack->v_num = qlink(&_qone_); stack->v_type = V_NUM;}static voido_re(){ VALUE *vp; NUMBER *q; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; if (vp->v_type == V_NUM) { if (stack->v_type == V_ADDR) { stack->v_num = qlink(vp->v_num); stack->v_type = V_NUM; } return; } if (vp->v_type != V_COM) math_error("Taking real part of non-number"); q = qlink(vp->v_com->real); if (stack->v_type == V_COM) comfree(stack->v_com); stack->v_num = q; stack->v_type = V_NUM;}static voido_im(){ VALUE *vp; NUMBER *q; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; if (vp->v_type == V_NUM) { if (stack->v_type == V_NUM) qfree(stack->v_num); stack->v_num = qlink(&_qzero_); stack->v_type = V_NUM; return; } if (vp->v_type != V_COM) math_error("Taking imaginary part of non-number"); q = qlink(vp->v_com->imag); if (stack->v_type == V_COM) comfree(stack->v_com); stack->v_num = q; stack->v_type = V_NUM;}static voido_conjugate(){ VALUE *vp; VALUE tmp; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; if (vp->v_type == V_NUM) { if (stack->v_type == V_ADDR) { stack->v_num = qlink(vp->v_num); stack->v_type = V_NUM; } return; } conjvalue(vp, &tmp); freevalue(stack); *stack = tmp;}static voido_fiaddr(){ register MATRIX *m; /* current matrix element */ NUMBER *q; /* index value */ LIST *lp; /* list header */ ASSOC *ap; /* association header */ VALUE *vp; /* stack value */ long index; /* index value as an integer */ vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; if (vp->v_type != V_NUM) math_error("Fast indexing by non-number"); q = vp->v_num; if (qisfrac(q)) math_error("Fast indexing by non-integer"); index = qtoi(q); if (zisbig(q->num) || (index < 0)) math_error("Index out of range for fast indexing"); if (stack->v_type == V_NUM) qfree(q); stack--; vp = stack; if (vp->v_type != V_ADDR) math_error("Bad value for fast indexing"); switch (vp->v_addr->v_type) { case V_OBJ: if (index >= vp->v_addr->v_obj->o_actions->count) math_error("Index out of bounds for object"); vp->v_addr = vp->v_addr->v_obj->o_table + index; break; case V_MAT: m = vp->v_addr->v_mat; if (index >= m->m_size) math_error("Index out of bounds for matrix"); vp->v_addr = m->m_table + index; break; case V_LIST: lp = vp->v_addr->v_list; vp->v_addr = listfindex(lp, index); if (vp->v_addr == NULL) math_error("Index out of bounds for list"); break; case V_ASSOC: ap = vp->v_addr->v_assoc; vp->v_addr = assocfindex(ap, index); if (vp->v_addr == NULL) math_error("Index out of bounds for association"); break; default: math_error("Bad variable type for fast indexing"); }}static voido_fivalue(){ (void) o_fiaddr(); (void) o_getvalue();}static voido_sgn(){ VALUE *vp; NUMBER *q; VALUE val; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; switch (vp->v_type) { case V_NUM: q = qsign(vp->v_num); if (stack->v_type == V_NUM) qfree(vp->v_num); stack->v_num = q; stack->v_type = V_NUM; break; case V_OBJ: val = objcall(OBJ_SGN, vp, NULL_VALUE, NULL_VALUE); q = itoq(val.v_int); freevalue(stack); stack->v_num = q; stack->v_type = V_NUM; break; default: math_error("Bad value for sgn"); }}static voido_numerator(){ VALUE *vp; NUMBER *q; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; if (vp->v_type != V_NUM) math_error("Numerator of non-number"); if ((stack->v_type == V_NUM) && qisint(vp->v_num)) return; q = qnum(vp->v_num); if (stack->v_type == V_NUM) qfree(stack->v_num); stack->v_num = q; stack->v_type = V_NUM;}static voido_denominator(){ VALUE *vp; NUMBER *q; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; if (vp->v_type != V_NUM) math_error("Denominator of non-number"); q = qden(vp->v_num); if (stack->v_type == V_NUM) qfree(stack->v_num); stack->v_num = q; stack->v_type = V_NUM;}static voido_duplicate(){ copyvalue(stack, stack + 1); stack++;}static voido_dupvalue(){ if (stack->v_type == V_ADDR) copyvalue(stack->v_addr, stack + 1); else copyvalue(stack, stack + 1); stack++;}static voido_pop(){ freevalue(stack--);}static voido_return(){}/*ARGSUSED*/static voido_jumpeq(fp, dojump) FUNC *fp; BOOL *dojump;{ VALUE *vp; int i; /* result of comparison */ vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; if (vp->v_type == V_NUM) { i = !qiszero(vp->v_num); if (stack->v_type == V_NUM) qfree(stack->v_num); } else { i = testvalue(vp); freevalue(stack); } stack--; if (!i) *dojump = TRUE;}/*ARGSUSED*/static voido_jumpne(fp, dojump) FUNC *fp; BOOL *dojump;{ VALUE *vp; int i; /* result of comparison */ vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr; if (vp->v_type == V_NUM) { i = !qiszero(vp->v_num); if (stack->v_type == V_NUM) qfree(stack->v_num); } else { i = testvalue(vp); freevalue(stack); } stack--; if (i) *dojump = TRUE;}/*ARGSUSED*/static voido_condorjump(fp, dojump) FUNC *fp; BOOL *dojump;{ VALUE *vp; vp = stack; if (vp->v_type == V_ADDR) vp = vp->v_addr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -