--- ray/src/common/calexpr.c 1993/03/05 15:14:00 2.12 +++ ray/src/common/calexpr.c 1995/02/16 09:49:29 2.16 @@ -34,10 +34,7 @@ static char SCCSid[] = "$SunId$ LBL"; #define isdecimal(c) (isdigit(c) || (c) == '.') -#ifndef atof -extern double atof(); -#endif -extern char *fgets(), *savestr(); +extern char *savestr(); extern char *emalloc(), *ecalloc(); extern EPNODE *curfunc; extern double efunc(), evariable(); @@ -48,6 +45,10 @@ static double echannel(); static double eadd(), esubtr(), emult(), edivi(), epow(); static double ebotch(); +#ifdef DCL_ATOF +extern double atof(); +#endif + int nextc; /* lookahead character */ double (*eoper[])() = { /* expression operations */ @@ -125,6 +126,53 @@ char *expr; rval = evalue(ep); epfree(ep); return(rval); +} + + +epcmp(ep1, ep2) /* compare two expressions for equivalence */ +register EPNODE *ep1, *ep2; +{ + double d; + + if (ep1->type != ep2->type) + return(1); + + switch (ep1->type) { + + case VAR: + return(ep1->v.ln != ep2->v.ln); + + case NUM: + if (ep2->v.num == 0) + return(ep1->v.num != 0); + d = ep1->v.num / ep2->v.num; + return(d > 1.000000000001 | d < 0.999999999999); + + case CHAN: + case ARG: + return(ep1->v.chan != ep2->v.chan); + + case '=': + case ':': + return(epcmp(ep1->v.kid->sibling, ep2->v.kid->sibling)); + + case TICK: + case SYM: /* should never get this one */ + return(0); + + default: + ep1 = ep1->v.kid; + ep2 = ep2->v.kid; + while (ep1 != NULL) { + if (ep2 == NULL) + return(1); + if (epcmp(ep1, ep2)) + return(1); + ep1 = ep1->sibling; + ep2 = ep2->sibling; + } + return(ep2 != NULL); + } }