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

📄 opcodes.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 4 页
字号:
	}	vp = mp->m_table;	for (i = 0; i < size; i++) {		vp->v_type = V_NUM;		vp->v_num = qlink(&_qzero_);		vp++;	}	vp = stack[0].v_addr;	vp->v_type = V_MAT;	vp->v_mat = mp;}/*ARGSUSED*/static voido_eleminit(fp, index)	FUNC *fp;	long index;{	VALUE *vp;	static VALUE *oldvp;	MATRIX *mp;	OBJECT *op;	vp = &stack[-1];	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	switch (vp->v_type) {		case V_MAT:			mp = vp->v_mat;			if ((index < 0) || (index >= mp->m_size))				math_error("Too many initializer values");			oldvp = &mp->m_table[index];			break;		case V_OBJ:			op = vp->v_obj;			if ((index < 0) || (index >= op->o_actions->count))				math_error("Too many initializer values");			oldvp = &op->o_table[index];			break;		default:			math_error("Attempt to initialize non matrix or object");	}	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	freevalue(oldvp);	copyvalue(vp, oldvp);	stack--;}/*ARGSUSED*/static voido_indexaddr(fp, dim, writeflag)	FUNC *fp;	long dim;		/* dimension of matrix */	long writeflag;		/* nonzero if element will be written */{	int i;	BOOL flag;	VALUE *val;	VALUE *vp;	VALUE indices[MAXDIM];	/* index values */	flag = (writeflag != 0);	if ((dim <= 0) || (dim > MAXDIM))		math_error("Too many dimensions for indexing");	val = &stack[-dim];	if (val->v_type != V_ADDR)		math_error("Non-pointer for index operation");	val = val->v_addr;	vp = &stack[-dim + 1];	for (i = 0; i < dim; i++) {		if (vp->v_type == V_ADDR)			indices[i] = vp->v_addr[0];		else			indices[i] = vp[0];		vp++;	}	switch (val->v_type) {		case V_MAT:			vp = matindex(val->v_mat, flag, dim, indices);			break;		case V_ASSOC:			vp = associndex(val->v_assoc, flag, dim, indices);			break;		default:			math_error("Illegal value for indexing");	}	while (dim-- > 0)		freevalue(stack--);	stack->v_type = V_ADDR;	stack->v_addr = vp;}/*ARGSUSED*/static voido_elemaddr(fp, index)	FUNC *fp;	long index;{	if (stack->v_type != V_ADDR)		math_error("Non-pointer for element reference");	if (stack->v_addr->v_type != V_OBJ)		math_error("Referencing element of non-object");	index = objoffset(stack->v_addr->v_obj, index);	if (index < 0)		math_error("Element does not exist for object");	stack->v_addr = &stack->v_addr->v_obj->o_table[index];}static voido_elemvalue(fp, index)	FUNC *fp;	long index;{	if (stack->v_type != V_OBJ) {		(void) o_elemaddr(fp, index);		(void) o_getvalue();		return;	}	index = objoffset(stack->v_obj, index);	if (index < 0)		math_error("Element does not exist for object");	copyvalue(&stack->v_obj->o_table[index], stack);}/*ARGSUSED*/static voido_objcreate(fp, arg)	FUNC *fp;	long arg;{	OBJECT *op;		/* object being created */	VALUE *vp;		/* value being defined */	if (stack->v_type != V_ADDR)		math_error("Attempting to init object for non-address");	op = objalloc(arg);	vp = stack->v_addr;	vp->v_type = V_OBJ;	vp->v_obj = op;}static voido_assign(){	VALUE *var;		/* variable value */	VALUE *vp;	var = &stack[-1];	if (var->v_type != V_ADDR)		math_error("Assignment into non-variable");	var = var->v_addr;	stack[-1] = stack[0];	stack--;	vp = stack;	if (vp->v_type == V_ADDR) {		vp = vp->v_addr;		if (vp == var)			return;	}	freevalue(var);	copyvalue(vp, var);}static voido_assignpop(){	VALUE *var;		/* variable value */	VALUE *vp;	var = &stack[-1];	if (var->v_type != V_ADDR)		math_error("Assignment into non-variable");	var = var->v_addr;	vp = &stack[0];	if ((vp->v_type == V_ADDR) && (vp->v_addr == var)) {		stack -= 2;		return;	}	freevalue(var);	if (vp->v_type == V_ADDR)		copyvalue(vp->v_addr, var);	else		*var = *vp;	stack -= 2;}static voido_swap(){	VALUE *v1, *v2;		/* variables to be swapped */	VALUE tmp;	v1 = &stack[-1];	v2 = &stack[0];	if ((v1->v_type != V_ADDR) || (v2->v_type != V_ADDR))		math_error("Swapping non-variables");	tmp = v1->v_addr[0];	v1->v_addr[0] = v2->v_addr[0];	v2->v_addr[0] = tmp;	stack--;	stack->v_type = V_NULL;}static voido_add(){	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)) {		addvalue(v1, v2, &tmp);		freevalue(stack--);		freevalue(stack);		*stack = tmp;		return;	}	q = qadd(v1->v_num, v2->v_num);	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack--;	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack->v_num = q;	stack->v_type = V_NUM;}static voido_sub(){	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)) {		subvalue(v1, v2, &tmp);		freevalue(stack--);		freevalue(stack);		*stack = tmp;		return;	}	q = qsub(v1->v_num, v2->v_num);	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack--;	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack->v_num = q;	stack->v_type = V_NUM;}static voido_mul(){	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)) {		mulvalue(v1, v2, &tmp);		freevalue(stack--);		freevalue(stack);		*stack = tmp;		return;	}	q = qmul(v1->v_num, v2->v_num);	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack--;	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack->v_num = q;	stack->v_type = V_NUM;}static voido_power(){	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;	powivalue(v1, v2, &tmp);	freevalue(stack--);	freevalue(stack);	*stack = tmp;}static voido_div(){	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)) {		divvalue(v1, v2, &tmp);		freevalue(stack--);		freevalue(stack);		*stack = tmp;		return;	}	q = qdiv(v1->v_num, v2->v_num);	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack--;	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack->v_num = q;	stack->v_type = V_NUM;}static voido_quo(){	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)) {		quovalue(v1, v2, &tmp);		freevalue(stack--);		freevalue(stack);		*stack = tmp;		return;	}	q = qquo(v1->v_num, v2->v_num);	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack--;	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack->v_num = q;	stack->v_type = V_NUM;}static voido_mod(){	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)) {		modvalue(v1, v2, &tmp);		freevalue(stack--);		freevalue(stack);		*stack = tmp;		return;	}	q = qmod(v1->v_num, v2->v_num);	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack--;	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack->v_num = q;	stack->v_type = V_NUM;}static voido_quomod(){	VALUE *v1, *v2, *v3, *v4;	VALUE valquo, valmod;	BOOL res;	v1 = &stack[-3];	v2 = &stack[-2];	v3 = &stack[-1];	v4 = &stack[0];	if (v1->v_type == V_ADDR)		v1 = v1->v_addr;	if (v2->v_type == V_ADDR)		v2 = v2->v_addr;	if ((v3->v_type != V_ADDR) || (v4->v_type != V_ADDR))		math_error("Non-variable for quomod");	if ((v1->v_type != V_NUM) || (v2->v_type != V_NUM))		math_error("Non-reals for quomod");	v3 = v3->v_addr;	v4 = v4->v_addr;	valquo.v_type = V_NUM;	valmod.v_type = V_NUM;	res = qquomod(v1->v_num, v2->v_num, &valquo.v_num, &valmod.v_num);	freevalue(stack--);	freevalue(stack--);	stack--;	stack->v_num = (res ? qlink(&_qone_) : qlink(&_qzero_));	stack->v_type = V_NUM;	freevalue(v3);	freevalue(v4);	*v3 = valquo;	*v4 = valmod;}static voido_and(){	VALUE *v1, *v2;	NUMBER *q;	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))		math_error("Non-numerics for and");	q = qand(v1->v_num, v2->v_num);	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack--;	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack->v_num = q;	stack->v_type = V_NUM;}static voido_or(){	VALUE *v1, *v2;	NUMBER *q;	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))		math_error("Non-numerics for or");	q = qor(v1->v_num, v2->v_num);	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack--;	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack->v_num = q;	stack->v_type = V_NUM;}static voido_not(){	VALUE *vp;	int r;	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	r = testvalue(vp);	freevalue(stack);	stack->v_num = (r ? qlink(&_qzero_) : qlink(&_qone_));			stack->v_type = V_NUM;}static voido_negate(){	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 = qneg(vp->v_num);		if (stack->v_type == V_NUM)			qfree(stack->v_num);		stack->v_num = q;		stack->v_type = V_NUM;		return;	}	negvalue(vp, &tmp);	freevalue(stack);	*stack = tmp;}static voido_invert(){	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 = qinv(vp->v_num);		if (stack->v_type == V_NUM)			qfree(stack->v_num);		stack->v_num = q;		stack->v_type = V_NUM;		return;	}	invertvalue(vp, &tmp);	freevalue(stack);	*stack = tmp;}static voido_scale(){	VALUE *v1, *v2;	NUMBER *q;	VALUE tmp;	v1 = &stack[0];	v2 = &stack[-1];	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)) {		scalevalue(v2, v1, &tmp);		freevalue(stack--);		freevalue(stack);		*stack = tmp;		return;	}	q = v1->v_num;	if (qisfrac(q))		math_error("Non-integral scaling factor");	if (zisbig(q->num))		math_error("Very large scaling factor");	q = qscale(v2->v_num, qtoi(q));	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack--;	if (stack->v_type == V_NUM)		qfree(stack->v_num);	stack->v_num = q;	stack->v_type = V_NUM;}static voido_int(){	VALUE *vp;	NUMBER *q;	VALUE tmp;	vp = stack;	if (vp->v_type == V_ADDR)		vp = vp->v_addr;	if (vp->v_type == V_NUM) {		if (qisint(vp->v_num) && (stack->v_type == V_NUM))			return;		q = qint(vp->v_num);		if (stack->v_type == V_NUM)			qfree(stack->v_num);		stack->v_num = q;		stack->v_type = V_NUM;		return;	}	intvalue(vp, &tmp);	freevalue(stack);	*stack = tmp;}static voido_frac(){	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 = qfrac(vp->v_num);		if (stack->v_type == V_NUM)			qfree(stack->v_num);		stack->v_num = q;		stack->v_type = V_NUM;		return;	}	fracvalue(vp, &tmp);	freevalue(stack);	*stack = tmp;}static voido_abs(){	VALUE *v1, *v2;	NUMBER *q;	VALUE tmp;	v1 = &stack[-1];

⌨️ 快捷键说明

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