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

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

Revision 1.1.1.1 (vendor branch), Fri Dec 3 07:39:11 1999 UTC (24 years, 5 months ago) by noro
Branch: NORO
CVS Tags: RELEASE_20000124, RELEASE_1_1_2, ASIR2000
Changes since 1.1: +0 -0 lines

Imported asir2000 as OpenXM_contrib2/asir2000.

/* $OpenXM: OpenXM_contrib2/asir2000/parse/comp.c,v 1.1.1.1 1999/12/03 07:39:11 noro Exp $ */
#include "ca.h"
#include "parse.h"
#include "comp.h"
#if defined(THINK_C) || defined(VISUAL)
#include <stdarg.h>
#else
#include <varargs.h>
#endif

extern f_return;

#if defined(THINK_C) || defined(VISUAL)
void call_usrf(FUNC f,...)
{
	va_list ap;
	int ac,i;
	pointer *c;
	NODE tn;

	va_start(ap,f);
	if ( !f )
		notdef(0,0,0,0);
	else {
		pushpvs(f);
		ac = va_arg(ap,int);
		for ( i = 0, tn = f->f.usrf->args; i < ac;
			i++, tn = NEXT(tn) )
			ASSPV((int)FA0((FNODE)BDY(tn)),va_arg(ap,pointer));
		c = va_arg(ap,pointer *); *c = evalstat(BDY(f->f.usrf));
		va_end(ap);
		f_return = 0; poppvs();
	}
}
#else
void call_usrf(va_alist)
va_dcl
{
	va_list ap;
	int ac,i;
	FUNC f;
	pointer a,b,*c;
	NODE tn;

	va_start(ap); f = va_arg(ap,FUNC);
	if ( !f )
		notdef(0,0,0,0);
	else {
		pushpvs(f);
		ac = va_arg(ap,int);
		for ( i = 0, tn = f->f.usrf->args; i < ac;
			i++, tn = NEXT(tn) )
			ASSPV((int)FA0((FNODE)BDY(tn)),va_arg(ap,pointer));
		c = va_arg(ap,pointer *); *c = evalstat(BDY(f->f.usrf));
		f_return = 0; poppvs();
	}
}
#endif

void addcomp(vl,a,b,c)
VL vl;
COMP a,b,*c;
{
	if ( a->type != b->type )
		error("addcomp : types different");
	else
		call_usrf(LSS->sa[a->type].arf.add,2,a,b,c);
}

void subcomp(vl,a,b,c)
VL vl;
COMP a,b,*c;
{
	if ( a->type != b->type )
		error("subcomp : types different");
	else
		call_usrf(LSS->sa[a->type].arf.sub,2,a,b,c);
}

void mulcomp(vl,a,b,c)
VL vl;
COMP a,b,*c;
{
	if ( a->type != b->type )
		error("mulcomp : types different");
	else
		call_usrf(LSS->sa[a->type].arf.mul,2,a,b,c);
}	

void divcomp(vl,a,b,c)
VL vl;
COMP a,b,*c;
{
	if ( a->type != b->type )
		error("divcomp : types different");
	else
		call_usrf(LSS->sa[a->type].arf.div,2,a,b,c);
}	

void chsgncomp(a,b)
COMP a,*b;
{
	call_usrf(LSS->sa[a->type].arf.chsgn,1,a,b);
}

void pwrcomp(vl,a,r,c)
VL vl;
COMP a;
Obj r;
COMP *c;
{
	call_usrf(LSS->sa[a->type].arf.pwr,2,a,r,c);
}

int compcomp(vl,a,b)
VL vl;
COMP a,b;
{
	Q c;
	int s;

	if ( a->type > b->type )
		return 1;
	else if ( a->type < b->type )
		return -1;
	else {
		call_usrf(LSS->sa[a->type].arf.comp,2,a,b,&c);
		s = QTOS(c);
		if ( s > 0 )
			return 1;
		else if ( s < 0 )
			return -1;
		else
			return 0;
	}
}