--- ray/src/common/calexpr.c 2004/03/28 20:33:12 2.29 +++ ray/src/common/calexpr.c 2008/05/01 16:42:05 2.32 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: calexpr.c,v 2.29 2004/03/28 20:33:12 schorsch Exp $"; +static const char RCSid[] = "$Id: calexpr.c,v 2.32 2008/05/01 16:42:05 greg Exp $"; #endif /* * Compute data values using expression parser @@ -47,6 +47,7 @@ static double ebotch(EPNODE *); unsigned int esupport = /* what to support */ E_VARIABLE | E_FUNCTION ; +int eofc = 0; /* optional end-of-file character */ int nextc; /* lookahead character */ double (*eoper[])(EPNODE *) = { /* expression operations */ @@ -144,7 +145,7 @@ epcmp( /* compare two expressions for equivalence */ case ':': return(epcmp(ep1->v.kid->sibling, ep2->v.kid->sibling)); - case TICK: + case CLKT: case SYM: /* should never get this one */ return(0); @@ -184,7 +185,7 @@ epfree( /* free a parse tree */ case NUM: case CHAN: case ARG: - case TICK: + case CLKT: break; default: @@ -293,9 +294,12 @@ epow( lasterrno = errno; errno = 0; d = pow(evalue(ep1), evalue(ep1->sibling)); -#ifdef IEEE - if (!finite(d)) - errno = EDOM; +#ifdef isnan + if (errno == 0) + if (isnan(d)) + errno = EDOM; + else if (isinf(d)) + errno = ERANGE; #endif if (errno == EDOM || errno == ERANGE) { wputs("Illegal power\n"); @@ -413,6 +417,10 @@ scan(void) /* scan next character, return literal nex nextc = linbuf[linepos++]; if (!lnext) lnext = nextc; + if (nextc == eofc) { + nextc = EOF; + break; + } if (nextc == '{') { scan(); while (nextc != '}')