[BACK]Return to quote.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / parse

File: [local] / OpenXM_contrib2 / asir2000 / parse / quote.c (download)

Revision 1.3, Tue Sep 4 02:46:15 2001 UTC (22 years, 8 months ago) by noro
Branch: MAIN
Changes since 1.2: +2 -0 lines

Added $OpenXM$ in quote.c.

/* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.3 2001/09/04 02:46:15 noro Exp $ */

#include "ca.h"
#include "parse.h"

void addquote(vl,a,b,c)
VL vl;
QUOTE a,b;
QUOTE *c;
{
	FNODE fn;

	fn = mkfnode(3,I_BOP,addfs,BDY(a),BDY(b));
	MKQUOTE(*c,fn);
}

void subquote(vl,a,b,c)
VL vl;
QUOTE a,b;
QUOTE *c;
{
	FNODE fn;

	fn = mkfnode(3,I_BOP,subfs,BDY(a),BDY(b));
	MKQUOTE(*c,fn);
}

void mulquote(vl,a,b,c)
VL vl;
QUOTE a,b;
QUOTE *c;
{
	FNODE fn;

	fn = mkfnode(3,I_BOP,mulfs,BDY(a),BDY(b));
	MKQUOTE(*c,fn);
}

void divquote(vl,a,b,c)
VL vl;
QUOTE a,b;
QUOTE *c;
{
	FNODE fn;

	fn = mkfnode(3,I_BOP,divfs,BDY(a),BDY(b));
	MKQUOTE(*c,fn);
}

void pwrquote(vl,a,b,c)
VL vl;
QUOTE a,b;
QUOTE *c;
{
	FNODE fn;

	if ( !b || OID(b) != O_QUOTE )
		error("pwrquote : invalid argument");
	fn = mkfnode(3,I_BOP,pwrfs,BDY(a),BDY(b));
	MKQUOTE(*c,fn);
}

void chsgnquote(a,c)
QUOTE a;
QUOTE *c;
{
	FNODE fn;

	fn = mkfnode(3,I_BOP,subfs,0,BDY(a));
	MKQUOTE(*c,fn);
}

void polytoquote(), dctoquote(), vartoquote();

void objtoquote(a,c)
Obj a;
QUOTE *c;
{
	QUOTE nm,dn;

	if ( !a ) {
		MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
		return;
	}
	switch ( OID(a) ) {
		case O_N:
			MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
			break;
		case O_P:
			polytoquote((P)a,c);
			break;
		case O_R:
			polytoquote(NM((R)a),&nm);
			polytoquote(DN((R)a),&dn);
			divquote(CO,nm,dn,c);
			break;
		case O_QUOTE:
			*c = (QUOTE)a;
			break;
		default:
			error("objtoquote : not implemented");
	}
}

void polytoquote(a,c)
P a;
QUOTE *c;
{
	DCP dc,t;
	DCP *dca;
	int n,i;
	QUOTE v,r,s,u;

	if ( !a || (OID(a) == O_N) ) {
		MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
		return;
	}
	dc = DC((P)a);
	vartoquote(VR((P)a),&v);
	for ( t = dc, n = 0; t; t = NEXT(t), n++ );
	dca = (DCP *)ALLOCA(n*sizeof(DCP));
	for ( t = dc, i = 0; t; t = NEXT(t), i++ )
		dca[i] = t;
	dctoquote(dca[n-1],v,&r);
	for ( i = n-2; i >= 0; i-- ) {
		dctoquote(dca[i],v,&s);
		addquote(CO,s,r,&u);
		r = u;
	}
	*c = r;
}

void dctoquote(dc,v,c)
DCP dc;
QUOTE v;
QUOTE *c;
{
	QUOTE r,d,s,u;

	objtoquote(COEF(dc),&r);
	if ( DEG(dc) ) {
		objtoquote(DEG(dc),&d);
		pwrquote(CO,v,d,&s);
		mulquote(CO,r,s,&u);
		r = u;
	}
	*c = r;
}

void vartoquote(v,c)
V v;
QUOTE *c;
{
	P x;
	PF pf;
	PFAD ad;
	QUOTE a,b;
	int i;
	FUNC f;
	NODE t,t1;

	if ( NAME(v) ) {
		MKV(v,x);
		MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)x));
	} else if ( (vid)v->attr == V_PF ) {
		/* pure function */
		pf = ((PFINS)v->priv)->pf;
		ad = ((PFINS)v->priv)->ad;
		if ( !strcmp(NAME(pf),"pow") ) {
			/* pow(a,b) = a^b */
			objtoquote(ad[0].arg,&a); objtoquote(ad[1].arg,&b);
			pwrquote(CO,a,b,c);
		} else {
			for ( i = 0; i < pf->argc; i++ )
				if ( ad[i].d )
					break;
			if ( i < pf->argc )
				error("vartoquote : not implemented");
			gen_searchf(NAME(pf),&f);
			t = 0;
			for ( i = pf->argc-1; i >= 0; i-- ) {
				objtoquote(ad[i].arg,&a);
				MKNODE(t1,BDY(a),t);
				t = t1;
			}
			MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
		}
	}
}