⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opcodes.c

📁 Calc Software Package for Number Calc
💻 C
📖 第 1 页 / 共 5 页
字号:
}static voido_frac(void){	VALUE *vp;	VALUE tmp;	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	fracvalue(vp, &tmp);	freevalue(stack);	*stack = tmp;}static voido_abs(void){	VALUE *v1, *v2;	NUMBER *q;	VALUE tmp;	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_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 = qqabs(v1->v_num);	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack->v_num = q;	stack->v_type = V_NUM;	stack->v_subtype = V_NOSUBTYPE;}static voido_norm(void){	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;		stack->v_subtype = V_NOSUBTYPE;		return;	}	normvalue(vp, &tmp);	freevalue(stack);	*stack = tmp;}static voido_square(void){	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;		stack->v_subtype = V_NOSUBTYPE;		return;	}	squarevalue(vp, &tmp);	freevalue(stack);	*stack = tmp;}static voido_test(void){	VALUE *vp;	int i;	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	i = testvalue(vp);	freevalue(stack);	stack->v_type = V_NUM;	stack->v_subtype = V_NOSUBTYPE;	stack->v_num = i ? qlink(&_qone_) : qlink(&_qzero_);}static voido_links(void){	VALUE *vp;	long links;	BOOL haveaddress;	vp = stack;	haveaddress = (vp->v_type == V_ADDR);	if (haveaddress)		vp = vp->v_addr;	switch (vp->v_type) {	case V_NUM: links = vp->v_num->links; break;	case V_COM: links = vp->v_com->links; break;	case V_STR: links = vp->v_str->s_links; break;	default:		freevalue(stack);		return;	}	if (links <= 0) {		math_error("Non-positive links!!!");		/*NOTREACHED*/	}	freevalue(stack);	if (!haveaddress)		links--;	stack->v_type = V_NUM;	stack->v_subtype = V_NOSUBTYPE;	stack->v_num = itoq(links);}static voido_bit (void){	VALUE *v1, *v2;	long index;	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 (v2->v_type != V_NUM || qisfrac(v2->v_num)) {		freevalue(stack--);		freevalue(stack);		*stack = error_value(E_BIT1);		return;	}	if (zge31b(v2->v_num->num)) {		freevalue(stack--);		freevalue(stack);		*stack = error_value(E_BIT2);		return;	}	index = qtoi(v2->v_num);	switch (v1->v_type) {	case V_NUM:		r = qisset(v1->v_num, index);		break;	case V_STR:		r = stringbit(v1->v_str, index);		break;	default:		r = 2;	}	freevalue(stack--);	freevalue(stack);	if (r > 1) {		*stack = error_value(E_BIT1);	} else if (r < 0) {		stack->v_type = V_NULL;	} else {		stack->v_type = V_NUM;		stack->v_num = itoq(r);	}	stack->v_subtype = V_NOSUBTYPE;}static voido_highbit (void){	VALUE *vp;	long index;	unsigned int u;	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	switch (vp->v_type) {	case V_NUM:		if (qiszero(vp->v_num)) {			index = -1;			break;		}		if (qisfrac(vp->v_num)) {			index = -2;			break;		}		index = zhighbit(vp->v_num->num);		break;	case V_STR:		index = stringhighbit(vp->v_str);		break;	case V_OCTET:		u = *vp->v_octet;		for (index = -1; u; u >>= 1, ++index);		break;	default:		index = -3;	}	freevalue(stack);	switch (index) {	case -3:		*stack = error_value(E_HIGHBIT1);		return;	case -2:		*stack = error_value(E_HIGHBIT2);		return;	default:		stack->v_type = V_NUM;		stack->v_subtype = V_NOSUBTYPE;		stack->v_num = itoq(index);	}}static voido_lowbit (void){	VALUE *vp;	long index;	unsigned int u;	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	switch (vp->v_type) {	case V_NUM:		if (qiszero(vp->v_num)) {			index = -1;			break;		}		if (qisfrac(vp->v_num)) {			index = -2;			break;		}		index = zlowbit(vp->v_num->num);		break;	case V_STR:		index = stringlowbit(vp->v_str);		break;	case V_OCTET:		u = *vp->v_octet;		index = -1;		if (u) do {			++index;			u >>= 1;		} while (!(u & 1));		break;	default:		index = -3;	}	freevalue(stack);	switch (index) {	case -3:		*stack = error_value(E_LOWBIT1);		return;	case -2:		*stack = error_value(E_LOWBIT2);		return;	default:		stack->v_type = V_NUM;		stack->v_subtype = V_NOSUBTYPE;		stack->v_num = itoq(index);	}}static voido_content (void){	VALUE *vp;	VALUE tmp;	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	contentvalue(vp, &tmp);	freevalue(stack);	*stack = tmp;}static voido_hashop (void){	VALUE *v1, *v2;	VALUE tmp;	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;	hashopvalue(v1, v2, &tmp);	freevalue(stack--);	freevalue(stack);	*stack = tmp;}static voido_backslash (void){	VALUE *vp;	VALUE tmp;	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	backslashvalue(vp, &tmp);	freevalue(stack);	*stack = tmp;}static voido_setminus (void){	VALUE *v1, *v2;	VALUE tmp;	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;	setminusvalue(v1, v2, &tmp);	freevalue(stack--);	freevalue(stack);	*stack = tmp;}static voido_istype(void){	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;	stack->v_subtype = V_NOSUBTYPE;}static voido_isint(void){	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;		stack->v_subtype = V_NOSUBTYPE;		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;	stack->v_subtype = V_NOSUBTYPE;}static voido_isnum(void){	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;		stack->v_subtype = V_NOSUBTYPE;		return;	}	stack->v_num = qlink(&_qone_);	stack->v_type = V_NUM;	stack->v_subtype = V_NOSUBTYPE;}static voido_ismat(void){	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;		stack->v_subtype = V_NOSUBTYPE;		return;	}	freevalue(stack);	stack->v_type = V_NUM;	stack->v_subtype = V_NOSUBTYPE;	stack->v_num = qlink(&_qone_);}static voido_islist(void){	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;	stack->v_subtype = V_NOSUBTYPE;}static voido_isobj(void){	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;	stack->v_subtype = V_NOSUBTYPE;}static voido_isstr(void){	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;	stack->v_subtype = V_NOSUBTYPE;}static voido_isfile(void){	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;	stack->v_subtype = V_NOSUBTYPE;}static voido_isrand(void){	VALUE *vp;	int r;	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	r = (vp->v_type == V_RAND);	freevalue(stack);	stack->v_num = (r ? qlink(&_qone_) : qlink(&_qzero_));	stack->v_type = V_NUM;	stack->v_subtype = V_NOSUBTYPE;}static voido_israndom(void){	VALUE *vp;	int r;	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	r = (vp->v_type == V_RANDOM);	freevalue(stack);	stack->v_num = (r ? qlink(&_qone_) : qlink(&_qzero_));	stack->v_type = V_NUM;	stack->v_subtype = V_NOSUBTYPE;}static voido_isconfig(void){	VALUE *vp;	int r;	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	r = (vp->v_type == V_CONFIG);	freevalue(stack);	stack->v_num = (r ? qlink(&_qone_) : qlink(&_qzero_));	stack->v_type = V_NUM;	stack->v_subtype = V_NOSUBTYPE;}static voido_ishash(void){	VALUE *vp;	int r;	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	r = (vp->v_type == V_HASH);	if (r != 0)		r = vp->v_hash->hashtype;	freevalue(stack);	stack->v_num = itoq((long) r);	stack->v_type = V_NUM;	stack->v_subtype = V_NOSUBTYPE;}static voido_isassoc(void){	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;	stack->v_subtype = V_NOSUBTYPE;}static voido_isblock(void){	VALUE *vp;	long r;	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	r = 0;	if (vp->v_type == V_NBLOCK)		r = 2;	else if (vp->v_type == V_BLOCK)		r = 1;	freevalue(stack);	stack->v_num = itoq(r);	stack->v_type = V_NUM;	stack->v_subtype = V_NOSUBTYPE;}static voido_isoctet(void){	VALUE *vp;	long r;	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	r = (vp->v_type == V_OCTET);	freevalue(stack);	stack->v_num = itoq(r);	stack->v_type = V_NUM;	stack->v_subtype = V_NOSUBTYPE;}static voido_isptr(void){	VALUE *vp;	long r;	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	r = 0;	switch(vp->v_type) {	case V_OPTR: r = 1; break;	case V_VPTR: r = 2; break;	case V_SPTR: r = 3; break;	case V_NPTR: r = 4; break;	}	freevalue(stack);	stack->v_num = itoq(r);	stack->v_type = V_NUM;	stack->v_subtype = V_NOSUBTYPE;}static voido_isdefined(void){	VALUE *vp;	long r;	long index;	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	if (vp->v_type != V_STR) {		math_error("Non-string argument for isdefined");		/*NOTREACHED*/	}	r = 0;	index = getbuiltinfunc(vp->v_str->s_str);	if (index >= 0) {		r = 1;	} else {		index = getuserfunc(vp->v_str->s_str);		if (index >= 0)			r = 2;	}	freevalue(stack);	stack->v_num = itoq(r);	stack->v_type = V_NUM;	stack->v_subtype = V_NOSUBTYPE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -