--- ray/src/common/calexpr.c 2003/02/22 02:07:21 2.18
+++ ray/src/common/calexpr.c 2003/06/07 12:50:20 2.22
@@ -1,5 +1,5 @@
#ifndef lint
-static const char RCSid[] = "$Id: calexpr.c,v 2.18 2003/02/22 02:07:21 greg Exp $";
+static const char RCSid[] = "$Id: calexpr.c,v 2.22 2003/06/07 12:50:20 schorsch Exp $";
#endif
/*
* Compute data values using expression parser
@@ -17,71 +17,13 @@ static const char RCSid[] = "$Id: calexpr.c,v 2.18 200
* 2/19/03 Eliminated conditional compiles in favor of esupport extern.
*/
-/* ====================================================================
- * The Radiance Software License, Version 1.0
- *
- * Copyright (c) 1990 - 2002 The Regents of the University of California,
- * through Lawrence Berkeley National Laboratory. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes Radiance software
- * (http://radsite.lbl.gov/)
- * developed by the Lawrence Berkeley National Laboratory
- * (http://www.lbl.gov/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
- * and "The Regents of the University of California" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact radiance@radsite.lbl.gov.
- *
- * 5. Products derived from this software may not be called "Radiance",
- * nor may "Radiance" appear in their name, without prior written
- * permission of Lawrence Berkeley National Laboratory.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of Lawrence Berkeley National Laboratory. For more
- * information on Lawrence Berkeley National Laboratory, please see
- * .
- */
+#include "copyright.h"
#include
-
+#include
#include
-
#include
-
#include
-
#include
#include "calcomp.h"
@@ -98,7 +40,7 @@ static double eadd(), esubtr(), emult(), edivi(), epo
static double ebotch();
unsigned int esupport = /* what to support */
- E_VARIABLE | E_FUNCTION | E_REDEFW;
+ E_VARIABLE | E_FUNCTION ;
int nextc; /* lookahead character */
@@ -336,7 +278,7 @@ EPNODE *ep;
if (!finite(d))
errno = EDOM;
#endif
- if (errno) {
+ if (errno == EDOM || errno == ERANGE) {
wputs("Illegal power\n");
return(0.0);
}
@@ -350,6 +292,7 @@ EPNODE *ep;
{
eputs("Bad expression!\n");
quit(1);
+ return 0.0; /* pro forma return */
}
@@ -703,72 +646,73 @@ getE5() /* E5 -> (E1) */
/* FUNC(E1,..) */
/* ARG */
{
- int i;
- char *nam;
- register EPNODE *ep1, *ep2;
+ int i;
+ char *nam;
+ register EPNODE *ep1, *ep2;
- if (nextc == '(') {
- scan();
- ep1 = getE1();
- if (nextc != ')')
- syntax("')' expected");
- scan();
- return(ep1);
- }
+ if (nextc == '(') {
+ scan();
+ ep1 = getE1();
+ if (nextc != ')')
+ syntax("')' expected");
+ scan();
+ return(ep1);
+ }
- if (esupport&E_INCHAN && nextc == '$') {
- scan();
- ep1 = newnode();
- ep1->type = CHAN;
- ep1->v.chan = getinum();
- return(ep1);
- }
+ if (esupport&E_INCHAN && nextc == '$') {
+ scan();
+ ep1 = newnode();
+ ep1->type = CHAN;
+ ep1->v.chan = getinum();
+ return(ep1);
+ }
- if (esupport&(E_VARIABLE|E_FUNCTION) &&
- (isalpha(nextc) || nextc == CNTXMARK)) {
- nam = getname();
- ep1 = NULL;
- if ((esupport&(E_VARIABLE|E_FUNCTION)) == (E_VARIABLE|E_FUNCTION)
- && curfunc != NULL)
- for (i = 1, ep2 = curfunc->v.kid->sibling;
- ep2 != NULL; i++, ep2 = ep2->sibling)
- if (!strcmp(ep2->v.name, nam)) {
- ep1 = newnode();
- ep1->type = ARG;
- ep1->v.chan = i;
- break;
+ if (esupport&(E_VARIABLE|E_FUNCTION) &&
+ (isalpha(nextc) || nextc == CNTXMARK)) {
+ nam = getname();
+ ep1 = NULL;
+ if ((esupport&(E_VARIABLE|E_FUNCTION)) == (E_VARIABLE|E_FUNCTION)
+ && curfunc != NULL)
+ for (i = 1, ep2 = curfunc->v.kid->sibling;
+ ep2 != NULL; i++, ep2 = ep2->sibling)
+ if (!strcmp(ep2->v.name, nam)) {
+ ep1 = newnode();
+ ep1->type = ARG;
+ ep1->v.chan = i;
+ break;
+ }
+ if (ep1 == NULL) {
+ ep1 = newnode();
+ ep1->type = VAR;
+ ep1->v.ln = varinsert(nam);
}
- if (ep1 == NULL) {
- ep1 = newnode();
- ep1->type = VAR;
- ep1->v.ln = varinsert(nam);
+ if (esupport&E_FUNCTION && nextc == '(') {
+ ep2 = newnode();
+ ep2->type = FUNC;
+ addekid(ep2, ep1);
+ ep1 = ep2;
+ do {
+ scan();
+ addekid(ep1, getE1());
+ } while (nextc == ',');
+ if (nextc != ')')
+ syntax("')' expected");
+ scan();
+ } else if (!(esupport&E_VARIABLE))
+ syntax("'(' expected");
+ if (esupport&E_RCONST && isconstvar(ep1))
+ ep1 = rconst(ep1);
+ return(ep1);
}
- if (esupport&E_FUNCTION && nextc == '(') {
- ep2 = newnode();
- ep2->type = FUNC;
- addekid(ep2, ep1);
- ep1 = ep2;
- do {
- scan();
- addekid(ep1, getE1());
- } while (nextc == ',');
- if (nextc != ')')
- syntax("')' expected");
- scan();
- } else if (!(esupport&E_VARIABLE))
- syntax("'(' expected");
- if (esupport&E_RCONST && isconstvar(ep1))
- ep1 = rconst(ep1);
- return(ep1);
- }
- if (isdecimal(nextc)) {
- ep1 = newnode();
- ep1->type = NUM;
- ep1->v.num = getnum();
- return(ep1);
- }
- syntax("unexpected character");
+ if (isdecimal(nextc)) {
+ ep1 = newnode();
+ ep1->type = NUM;
+ ep1->v.num = getnum();
+ return(ep1);
+ }
+ syntax("unexpected character");
+ return NULL; /* pro forma return */
}
@@ -782,7 +726,7 @@ register EPNODE *epar;
ep->type = NUM;
errno = 0;
ep->v.num = evalue(epar);
- if (errno)
+ if (errno == EDOM || errno == ERANGE)
syntax("bad constant expression");
epfree(epar);