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.34 by greg, Sun Jul 25 05:50:27 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 && ep3->v.num == 0) {
623 >                        if (ep2->type == '/')
624 >                                syntax("divide by zero constant");
625 >                        ep1->sibling = NULL;    /* (E2 * 0) */
626 >                        epfree(ep2);
627 >                        ep2 = ep3;
628 >                } else if (ep1->type == NUM && ep1->v.num == 0) {
629 >                        epfree(ep3);            /* (0 * E3) or (0 / E3) */
630 >                        ep1->sibling = NULL;
631 >                        efree((char *)ep2);
632 >                        ep2 = ep1;
633 >                }
634 >        }
635          ep1 = ep2;
636      }
637      return(ep1);
# Line 625 | Line 639 | getE2(void)                            /* E2 -> E2 MULOP E3 */
639  
640  
641   EPNODE *
642 < getE3(void)                             /* E3 -> E4 ^ E3 */
642 > getE3(void)                     /* E3 -> E4 ^ E3 */
643                                  /*       E4 */
644   {
645 <    register EPNODE  *ep1, *ep2;
645 >        register EPNODE  *ep1, *ep2;
646  
647 <    ep1 = getE4();
648 <    if (nextc == '^') {
647 >        ep1 = getE4();
648 >        if (nextc != '^')
649 >                return(ep1);
650          ep2 = newnode();
651          ep2->type = nextc;
652          scan();
653          addekid(ep2, ep1);
654          addekid(ep2, getE3());
655 <        if (esupport&E_RCONST &&
656 <                        ep1->type == NUM && ep1->sibling->type == NUM)
657 <                ep2 = rconst(ep2);
655 >        if (esupport&E_RCONST) {
656 >                EPNODE  *ep3 = ep1->sibling;
657 >                if (ep1->type == NUM && ep3->type == NUM) {
658 >                        ep2 = rconst(ep2);
659 >                } else if (ep1->type == NUM && ep1->v.num == 0) {
660 >                        epfree(ep3);            /* (0 ^ E3) */
661 >                        ep1->sibling = NULL;
662 >                        efree((char *)ep2);
663 >                        ep2 = ep1;
664 >                } else if ((ep3->type == NUM && ep3->v.num == 0) ||
665 >                                (ep1->type == NUM && ep1->v.num == 1)) {
666 >                        epfree(ep2);            /* (E4 ^ 0) or (1 ^ E3) */
667 >                        ep2 = newnode();
668 >                        ep2->type = NUM;
669 >                        ep2->v.num = 1;
670 >                }
671 >        }
672          return(ep2);
644    }
645    return(ep1);
673   }
674  
675  
676   EPNODE *
677 < getE4(void)                             /* E4 -> ADDOP E5 */
677 > getE4(void)                     /* E4 -> ADDOP E5 */
678                                  /*       E5 */
679   {
680      register EPNODE  *ep1, *ep2;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines