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

📄 opcodes.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -