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.33 by greg, Sun Jun 14 18:21:58 2009 UTC vs.
Revision 2.35 by greg, Sat Sep 4 19:04:35 2010 UTC

# Line 581 | Line 581 | getnum(void)                   /* scan a positive float */
581  
582  
583   EPNODE *
584 < getE1(void)                             /* E1 -> E1 ADDOP E2 */
584 > getE1(void)                     /* E1 -> E1 ADDOP E2 */
585                                  /*       E2 */
586   {
587      register EPNODE  *ep1, *ep2;
# Line 603 | Line 603 | getE1(void)                            /* E1 -> E1 ADDOP E2 */
603  
604  
605   EPNODE *
606 < getE2(void)                             /* E2 -> E2 MULOP E3 */
606 > getE2(void)                     /* E2 -> E2 MULOP E3 */
607                                  /*       E3 */
608   {
609      register EPNODE  *ep1, *ep2;
# Line 615 | Line 615 | getE2(void)                            /* E2 -> E2 MULOP E3 */
615          scan();
616          addekid(ep2, ep1);
617          addekid(ep2, getE3());
618 <        if (esupport&E_RCONST &&
619 <                        ep1->type == NUM && ep1->sibling->type == NUM)
620 <                ep2 = rconst(ep2);
618 >        if (esupport&E_RCONST) {
619 >                EPNODE  *ep3 = ep1->sibling;
620 >                if (ep1->type == NUM && ep3->type == NUM) {
621 >                        ep2 = rconst(ep2);
622 >                } else if (ep3->type == NUM) {
623 >                        if (ep2->type == '/') {
624 >                                if (ep3->v.num == 0)
625 >                                        syntax("divide by zero constant");
626 >                                ep2->type = '*';        /* for speed */
627 >                                ep3->v.num = 1./ep3->v.num;
628 >                        } else if (ep3->v.num == 0) {
629 >                                ep1->sibling = NULL;    /* (E2 * 0) */
630 >                                epfree(ep2);
631 >                                ep2 = ep3;
632 >                        }
633 >                } else if (ep1->type == NUM && ep1->v.num == 0) {
634 >                        epfree(ep3);            /* (0 * E3) or (0 / E3) */
635 >                        ep1->sibling = NULL;
636 >                        efree((char *)ep2);
637 >                        ep2 = ep1;
638 >                }
639 >        }
640          ep1 = ep2;
641      }
642      return(ep1);
# Line 625 | Line 644 | getE2(void)                            /* E2 -> E2 MULOP E3 */
644  
645  
646   EPNODE *
647 < getE3(void)                             /* E3 -> E4 ^ E3 */
647 > getE3(void)                     /* E3 -> E4 ^ E3 */
648                                  /*       E4 */
649   {
650 <    register EPNODE  *ep1, *ep2;
650 >        register EPNODE  *ep1, *ep2;
651  
652 <    ep1 = getE4();
653 <    if (nextc == '^') {
652 >        ep1 = getE4();
653 >        if (nextc != '^')
654 >                return(ep1);
655          ep2 = newnode();
656          ep2->type = nextc;
657          scan();
658          addekid(ep2, ep1);
659          addekid(ep2, getE3());
660 <        if (esupport&E_RCONST &&
661 <                        ep1->type == NUM && ep1->sibling->type == NUM)
662 <                ep2 = rconst(ep2);
660 >        if (esupport&E_RCONST) {
661 >                EPNODE  *ep3 = ep1->sibling;
662 >                if (ep1->type == NUM && ep3->type == NUM) {
663 >                        ep2 = rconst(ep2);
664 >                } else if (ep1->type == NUM && ep1->v.num == 0) {
665 >                        epfree(ep3);            /* (0 ^ E3) */
666 >                        ep1->sibling = NULL;
667 >                        efree((char *)ep2);
668 >                        ep2 = ep1;
669 >                } else if ((ep3->type == NUM && ep3->v.num == 0) ||
670 >                                (ep1->type == NUM && ep1->v.num == 1)) {
671 >                        epfree(ep2);            /* (E4 ^ 0) or (1 ^ E3) */
672 >                        ep2 = newnode();
673 >                        ep2->type = NUM;
674 >                        ep2->v.num = 1;
675 >                }
676 >        }
677          return(ep2);
644    }
645    return(ep1);
678   }
679  
680  
681   EPNODE *
682 < getE4(void)                             /* E4 -> ADDOP E5 */
682 > getE4(void)                     /* E4 -> ADDOP E5 */
683                                  /*       E5 */
684   {
685      register EPNODE  *ep1, *ep2;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines