ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/calexpr.c
(Generate patch)

Comparing ray/src/common/calexpr.c (file contents):
Revision 2.31 by greg, Wed May 10 15:21:20 2006 UTC vs.
Revision 2.39 by greg, Sat Dec 28 18:05:13 2019 UTC

# Line 19 | Line 19 | static const char      RCSid[] = "$Id$";
19  
20   #include "copyright.h"
21  
22 #include  <stdio.h>
23 #include  <string.h>
22   #include  <ctype.h>
23   #include  <errno.h>
24   #include  <math.h>
# Line 105 | Line 103 | eval(                  /* evaluate an expression string */
103      char  *expr
104   )
105   {
106 <    register EPNODE  *ep;
106 >    int  prev_support = esupport;
107 >    EPNODE  *ep;
108      double  rval;
109  
110 +    esupport &= ~E_RCONST;      /* don't bother reducing constant expr */
111      ep = eparse(expr);
112 +    esupport = prev_support;    /* as you were */
113      rval = evalue(ep);
114      epfree(ep);
115      return(rval);
# Line 117 | Line 118 | eval(                  /* evaluate an expression string */
118  
119   int
120   epcmp(                  /* compare two expressions for equivalence */
121 <    register EPNODE  *ep1,
122 <    register EPNODE  *ep2
121 >    EPNODE  *ep1,
122 >    EPNODE  *ep2
123   )
124   {
125          double  d;
# Line 145 | Line 146 | epcmp(                 /* compare two expressions for equivalence */
146          case ':':
147                  return(epcmp(ep1->v.kid->sibling, ep2->v.kid->sibling));
148  
149 <        case TICK:
149 >        case CLKT:
150          case SYM:                       /* should never get this one */
151                  return(0);
152  
# Line 167 | Line 168 | epcmp(                 /* compare two expressions for equivalence */
168  
169   void
170   epfree(                 /* free a parse tree */
171 <    register EPNODE      *epar
171 >    EPNODE       *epar
172   )
173   {
174 <    register EPNODE  *ep;
174 >    EPNODE  *ep;
175  
176      switch (epar->type) {
177  
# Line 185 | Line 186 | epfree(                        /* free a parse tree */
186          case NUM:
187          case CHAN:
188          case ARG:
189 <        case TICK:
189 >        case CLKT:
190              break;
191  
192          default:
# Line 222 | Line 223 | euminus(
223      EPNODE      *ep
224   )
225   {
226 <    register EPNODE  *ep1 = ep->v.kid;
226 >    EPNODE  *ep1 = ep->v.kid;
227  
228      return(-evalue(ep1));
229   }
# Line 240 | Line 241 | eadd(
241      EPNODE      *ep
242   )
243   {
244 <    register EPNODE  *ep1 = ep->v.kid;
244 >    EPNODE  *ep1 = ep->v.kid;
245  
246      return(evalue(ep1) + evalue(ep1->sibling));
247   }
# Line 250 | Line 251 | esubtr(
251      EPNODE      *ep
252   )
253   {
254 <    register EPNODE  *ep1 = ep->v.kid;
254 >    EPNODE  *ep1 = ep->v.kid;
255  
256      return(evalue(ep1) - evalue(ep1->sibling));
257   }
# Line 260 | Line 261 | emult(
261      EPNODE      *ep
262   )
263   {
264 <    register EPNODE  *ep1 = ep->v.kid;
264 >    EPNODE  *ep1 = ep->v.kid;
265  
266      return(evalue(ep1) * evalue(ep1->sibling));
267   }
# Line 270 | Line 271 | edivi(
271      EPNODE      *ep
272   )
273   {
274 <    register EPNODE  *ep1 = ep->v.kid;
274 >    EPNODE  *ep1 = ep->v.kid;
275      double  d;
276  
277      d = evalue(ep1->sibling);
# Line 287 | Line 288 | epow(
288      EPNODE      *ep
289   )
290   {
291 <    register EPNODE  *ep1 = ep->v.kid;
291 >    EPNODE  *ep1 = ep->v.kid;
292      double  d;
293      int  lasterrno;
294  
# Line 295 | Line 296 | epow(
296      errno = 0;
297      d = pow(evalue(ep1), evalue(ep1->sibling));
298   #ifdef  isnan
299 <    if (errno == 0)
299 >    if (errno == 0) {
300          if (isnan(d))
301              errno = EDOM;
302          else if (isinf(d))
303              errno = ERANGE;
304 +    }
305   #endif
306      if (errno == EDOM || errno == ERANGE) {
307          wputs("Illegal power\n");
# Line 322 | Line 324 | ebotch(
324  
325   EPNODE *
326   ekid(                   /* return pointer to a node's nth kid */
327 <    register EPNODE      *ep,
328 <    register int  n
327 >    EPNODE       *ep,
328 >    int  n
329   )
330   {
331  
# Line 337 | Line 339 | ekid(                  /* return pointer to a node's nth kid */
339  
340   int
341   nekids(                 /* return # of kids for node ep */
342 <    register EPNODE      *ep
342 >    EPNODE       *ep
343   )
344   {
345 <    register int  n = 0;
345 >    int  n = 0;
346  
347      for (ep = ep->v.kid; ep != NULL; ep = ep->sibling)
348          n++;
# Line 402 | Line 404 | getscanpos(    /* return current scan position */
404   int
405   scan(void)              /* scan next character, return literal next */
406   {
407 <    register int  lnext = 0;
407 >    int  lnext = 0;
408  
409      do {
410          if (linbuf[linepos] == '\0')
# Line 441 | Line 443 | long2ascii(                          /* convert long to ascii */
443   )
444   {
445      static char  buf[16];
446 <    register char  *cp;
446 >    char  *cp;
447      int  neg = 0;
448  
449      if (l == 0)
# Line 467 | Line 469 | syntax(                        /* report syntax error and quit */
469      char  *err
470   )
471   {
472 <    register int  i;
472 >    int  i;
473  
474      if (infile != NULL || lineno != 0) {
475          if (infile != NULL) eputs(infile);
# Line 491 | Line 493 | syntax(                        /* report syntax error and quit */
493  
494   void
495   addekid(                        /* add a child to ep */
496 <    register EPNODE      *ep,
496 >    EPNODE       *ep,
497      EPNODE      *ekid
498   )
499   {
# Line 510 | Line 512 | char *
512   getname(void)                   /* scan an identifier */
513   {
514      static char  str[RMAXWORD+1];
515 <    register int  i, lnext;
515 >    int  i, lnext;
516  
517      lnext = nextc;
518      for (i = 0; i < RMAXWORD && isid(lnext); i++, lnext = scan())
# Line 526 | Line 528 | getname(void)                  /* scan an identifier */
528   int
529   getinum(void)                   /* scan a positive integer */
530   {
531 <    register int  n, lnext;
531 >    int  n, lnext;
532  
533      n = 0;
534      lnext = nextc;
# Line 541 | Line 543 | getinum(void)                  /* scan a positive integer */
543   double
544   getnum(void)                    /* scan a positive float */
545   {
546 <    register int  i, lnext;
546 >    int  i, lnext;
547      char  str[RMAXWORD+1];
548  
549      i = 0;
# Line 581 | Line 583 | getnum(void)                   /* scan a positive float */
583  
584  
585   EPNODE *
586 < getE1(void)                             /* E1 -> E1 ADDOP E2 */
586 > getE1(void)                     /* E1 -> E1 ADDOP E2 */
587                                  /*       E2 */
588   {
589 <    register EPNODE  *ep1, *ep2;
589 >    EPNODE  *ep1, *ep2;
590  
591      ep1 = getE2();
592      while (nextc == '+' || nextc == '-') {
# Line 603 | Line 605 | getE1(void)                            /* E1 -> E1 ADDOP E2 */
605  
606  
607   EPNODE *
608 < getE2(void)                             /* E2 -> E2 MULOP E3 */
608 > getE2(void)                     /* E2 -> E2 MULOP E3 */
609                                  /*       E3 */
610   {
611 <    register EPNODE  *ep1, *ep2;
611 >    EPNODE  *ep1, *ep2;
612  
613      ep1 = getE3();
614      while (nextc == '*' || nextc == '/') {
# Line 615 | Line 617 | getE2(void)                            /* E2 -> E2 MULOP E3 */
617          scan();
618          addekid(ep2, ep1);
619          addekid(ep2, getE3());
620 <        if (esupport&E_RCONST &&
621 <                        ep1->type == NUM && ep1->sibling->type == NUM)
622 <                ep2 = rconst(ep2);
620 >        if (esupport&E_RCONST) {
621 >                EPNODE  *ep3 = ep1->sibling;
622 >                if (ep1->type == NUM && ep3->type == NUM) {
623 >                        ep2 = rconst(ep2);
624 >                } else if (ep3->type == NUM) {
625 >                        if (ep2->type == '/') {
626 >                                if (ep3->v.num == 0)
627 >                                        syntax("divide by zero constant");
628 >                                ep2->type = '*';        /* for speed */
629 >                                ep3->v.num = 1./ep3->v.num;
630 >                        } else if (ep3->v.num == 0) {
631 >                                ep1->sibling = NULL;    /* (E2 * 0) */
632 >                                epfree(ep2);
633 >                                ep2 = ep3;
634 >                        }
635 >                } else if (ep1->type == NUM && ep1->v.num == 0) {
636 >                        epfree(ep3);            /* (0 * E3) or (0 / E3) */
637 >                        ep1->sibling = NULL;
638 >                        efree((char *)ep2);
639 >                        ep2 = ep1;
640 >                }
641 >        }
642          ep1 = ep2;
643      }
644      return(ep1);
# Line 625 | Line 646 | getE2(void)                            /* E2 -> E2 MULOP E3 */
646  
647  
648   EPNODE *
649 < getE3(void)                             /* E3 -> E4 ^ E3 */
649 > getE3(void)                     /* E3 -> E4 ^ E3 */
650                                  /*       E4 */
651   {
652 <    register EPNODE  *ep1, *ep2;
652 >        EPNODE  *ep1, *ep2;
653  
654 <    ep1 = getE4();
655 <    if (nextc == '^') {
654 >        ep1 = getE4();
655 >        if (nextc != '^')
656 >                return(ep1);
657          ep2 = newnode();
658          ep2->type = nextc;
659          scan();
660          addekid(ep2, ep1);
661          addekid(ep2, getE3());
662 <        if (esupport&E_RCONST &&
663 <                        ep1->type == NUM && ep1->sibling->type == NUM)
664 <                ep2 = rconst(ep2);
662 >        if (esupport&E_RCONST) {
663 >                EPNODE  *ep3 = ep1->sibling;
664 >                if (ep1->type == NUM && ep3->type == NUM) {
665 >                        ep2 = rconst(ep2);
666 >                } else if (ep1->type == NUM && ep1->v.num == 0) {
667 >                        epfree(ep3);            /* (0 ^ E3) */
668 >                        ep1->sibling = NULL;
669 >                        efree((char *)ep2);
670 >                        ep2 = ep1;
671 >                } else if ((ep3->type == NUM && ep3->v.num == 0) ||
672 >                                (ep1->type == NUM && ep1->v.num == 1)) {
673 >                        epfree(ep2);            /* (E4 ^ 0) or (1 ^ E3) */
674 >                        ep2 = newnode();
675 >                        ep2->type = NUM;
676 >                        ep2->v.num = 1;
677 >                }
678 >        }
679          return(ep2);
644    }
645    return(ep1);
680   }
681  
682  
683   EPNODE *
684 < getE4(void)                             /* E4 -> ADDOP E5 */
684 > getE4(void)                     /* E4 -> ADDOP E5 */
685                                  /*       E5 */
686   {
687 <    register EPNODE  *ep1, *ep2;
687 >    EPNODE  *ep1, *ep2;
688  
689      if (nextc == '-') {
690          scan();
# Line 660 | Line 694 | getE4(void)                            /* E4 -> ADDOP E5 */
694                  return(ep2);
695          }
696          if (ep2->type == UMINUS) {      /* don't generate -(-E5) */
697 +            ep1 = ep2->v.kid;
698              efree((char *)ep2);
699 <            return(ep2->v.kid);
699 >            return(ep1);
700          }
701          ep1 = newnode();
702          ep1->type = UMINUS;
# Line 684 | Line 719 | getE5(void)                    /* E5 -> (E1) */
719   {
720          int      i;
721          char  *nam;
722 <        register EPNODE  *ep1, *ep2;
722 >        EPNODE  *ep1, *ep2;
723  
724          if (nextc == '(') {
725                  scan();
# Line 754 | Line 789 | getE5(void)                    /* E5 -> (E1) */
789  
790   EPNODE *
791   rconst(                 /* reduce a constant expression */
792 <    register EPNODE      *epar
792 >    EPNODE       *epar
793   )
794   {
795 <    register EPNODE  *ep;
795 >    EPNODE  *ep;
796  
797      ep = newnode();
798      ep->type = NUM;
# Line 773 | Line 808 | rconst(                        /* reduce a constant expression */
808  
809   int
810   isconstvar(                     /* is ep linked to a constant expression? */
811 <    register EPNODE      *ep
811 >    EPNODE       *ep
812   )
813   {
814 <    register EPNODE  *ep1;
814 >    EPNODE  *ep1;
815  
816      if (esupport&E_FUNCTION && ep->type == FUNC) {
817          if (!isconstfun(ep->v.kid))
# Line 799 | Line 834 | isconstvar(                    /* is ep linked to a constant expression
834  
835   int
836   isconstfun(                     /* is ep linked to a constant function? */
837 <    register EPNODE      *ep
837 >    EPNODE       *ep
838   )
839   {
840 <    register EPNODE  *dp;
841 <    register LIBR  *lp;
840 >    EPNODE  *dp;
841 >    LIBR  *lp;
842  
843      if (ep->type != VAR)
844          return(0);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines