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

Comparing ray/src/common/calexpr.c (file contents):
Revision 2.51 by greg, Mon Sep 16 17:31:14 2024 UTC vs.
Revision 2.52 by greg, Tue Nov 25 02:59:53 2025 UTC

# Line 680 | Line 680 | getE2(void)                    /* E2 -> E2 MULOP E3 */
680          addekid(ep2, ep1);
681          addekid(ep2, getE3());
682          if (esupport&E_RCONST) {
683 <                EPNODE  *ep3 = ep1->sibling;
684 <                if ((ep1->type == NUM) & (ep3->type == NUM)) {
685 <                        ep2 = rconst(ep2);
686 <                } else if (ep3->type == NUM) {
687 <                        if (ep2->type == '/') {
688 <                                if (ep3->v.num == 0)
689 <                                        esyntax("divide by zero constant");
690 <                                ep2->type = '*';        /* for speed */
691 <                                ep3->v.num = 1./ep3->v.num;
692 <                        } else if (ep3->v.num == 0) {
693 <                                ep1->sibling = NULL;    /* (E2 * 0) */
694 <                                epfree(ep2,1);
695 <                                ep2 = ep3;
696 <                        }
697 <                } else if (ep1->type == NUM && ep1->v.num == 0) {
698 <                        epfree(ep3,1);          /* (0 * E3) or (0 / E3) */
699 <                        ep1->sibling = NULL;
700 <                        efree(ep2);
701 <                        ep2 = ep1;
683 >            EPNODE      *ep3 = ep1->sibling;
684 >            if ((ep1->type == NUM) & (ep3->type == NUM)) {
685 >                ep2 = rconst(ep2);
686 >            } else if (ep3->type == NUM) {
687 >                if (ep2->type == '/') {
688 >                    if (ep3->v.num == 0)
689 >                        esyntax("divide by zero constant");
690 >                    ep2->type = '*';            /* for speed */
691 >                    ep3->v.num = 1./ep3->v.num;
692 >                } else if (ep3->v.num == 0) {
693 >                    ep1->sibling = NULL;        /* (E2 * 0) */
694 >                    epfree(ep2,1);
695 >                    ep2 = ep3;
696                  }
697 +            } else if (ep1->type == NUM && ep1->v.num == 0) {
698 +                epfree(ep3,1);                  /* (0 * E3) or (0 / E3) */
699 +                ep1->sibling = NULL;
700 +                efree(ep2);
701 +                ep2 = ep1;
702 +            }
703          }
704          ep1 = ep2;
705      }
# Line 722 | Line 722 | getE3(void)                    /* E3 -> E4 ^ E3 */
722          addekid(ep2, ep1);
723          addekid(ep2, getE3());
724          if (esupport&E_RCONST) {
725 <                EPNODE  *ep3 = ep1->sibling;
726 <                if ((ep1->type == NUM) & (ep3->type == NUM)) {
727 <                        ep2 = rconst(ep2);
728 <                } else if (ep1->type == NUM && ep1->v.num == 0) {
729 <                        epfree(ep3,1);          /* (0 ^ E3) */
730 <                        ep1->sibling = NULL;
731 <                        efree(ep2);
732 <                        ep2 = ep1;
733 <                } else if ((ep3->type == NUM && ep3->v.num == 0) |
725 >            EPNODE      *ep3 = ep1->sibling;
726 >            if ((ep1->type == NUM) & (ep3->type == NUM)) {
727 >                ep2 = rconst(ep2);
728 >            } else if (ep1->type == NUM && ep1->v.num == 0) {
729 >                epfree(ep3,1);          /* (0 ^ E3) */
730 >                ep1->sibling = NULL;
731 >                efree(ep2);
732 >                ep2 = ep1;
733 >            } else if ((ep3->type == NUM && ep3->v.num == 0) |
734                                  (ep1->type == NUM && ep1->v.num == 1)) {
735 <                        epfree(ep2,0);          /* (E4 ^ 0) or (1 ^ E3) */
736 <                        ep2->type = NUM;
737 <                        ep2->v.num = 1;
738 <                } else if (ep3->type == NUM && ep3->v.num == 1) {
739 <                        efree(ep3);     /* (E4 ^ 1) */
740 <                        ep1->sibling = NULL;
741 <                        efree(ep2);
742 <                        ep2 = ep1;
743 <                }
735 >                epfree(ep2,0);          /* (E4 ^ 0) or (1 ^ E3) */
736 >                ep2->type = NUM;
737 >                ep2->v.num = 1;
738 >            } else if (ep3->type == NUM && ep3->v.num == 1) {
739 >                efree(ep3);             /* (E4 ^ 1) */
740 >                ep1->sibling = NULL;
741 >                efree(ep2);
742 >                ep2 = ep1;
743 >            }
744          }
745          return(ep2);
746   }
# Line 756 | Line 756 | getE4(void)                    /* E4 -> ADDOP E5 */
756          escan();
757          ep2 = getE5();
758          if (ep2->type == NUM) {
759 <                ep2->v.num = -ep2->v.num;
760 <                return(ep2);
759 >            ep2->v.num = -ep2->v.num;
760 >            return(ep2);
761          }
762          if (ep2->type == UMINUS) {      /* don't generate -(-E5) */
763              ep1 = ep2->v.kid;
# Line 788 | Line 788 | getE5(void)                    /* E5 -> (E1) */
788          EPNODE  *ep1, *ep2;
789  
790          if (nextc == '(') {
791 <                escan();
792 <                ep1 = getE1();
793 <                if (nextc != ')')
794 <                        esyntax("')' expected");
795 <                escan();
796 <                return(ep1);
791 >            escan();
792 >            ep1 = getE1();
793 >            if (nextc != ')')
794 >                esyntax("')' expected");
795 >            escan();
796 >            return(ep1);
797          }
798          if (esupport&E_INCHAN && nextc == '$') {
799 <                escan();
800 <                ep1 = newnode();
801 <                ep1->type = CHAN;
802 <                ep1->v.chan = getinum();
803 <                return(ep1);
799 >            escan();
800 >            ep1 = newnode();
801 >            ep1->type = CHAN;
802 >            ep1->v.chan = getinum();
803 >            return(ep1);
804          }
805          if (esupport&(E_VARIABLE|E_FUNCTION) &&
806                          (isalpha(nextc) | (nextc == CNTXMARK))) {
807 <                nam = getname();
808 <                ep1 = NULL;
809 <                if ((esupport&(E_VARIABLE|E_FUNCTION)) == (E_VARIABLE|E_FUNCTION)
807 >            nam = getname();
808 >            ep1 = NULL;
809 >            if ((esupport&(E_VARIABLE|E_FUNCTION)) == (E_VARIABLE|E_FUNCTION)
810                                  && ecurfunc != NULL)
811 <                        for (i = 1, ep2 = ecurfunc->v.kid->sibling;
812 <                                        ep2 != NULL; i++, ep2 = ep2->sibling)
813 <                                if (!strcmp(ep2->v.name, nam)) {
814 <                                        ep1 = newnode();
815 <                                        ep1->type = ARG;
816 <                                        ep1->v.chan = i;
817 <                                        break;
818 <                                }
819 <                if (ep1 == NULL) {
811 >                for (i = 1, ep2 = ecurfunc->v.kid->sibling;
812 >                                ep2 != NULL; i++, ep2 = ep2->sibling)
813 >                    if (!strcmp(ep2->v.name, nam)) {
814                          ep1 = newnode();
815 <                        ep1->type = VAR;
816 <                        ep1->v.ln = varinsert(nam);
817 <                }
818 <                if (esupport&E_FUNCTION && nextc == '(') {
819 <                        ep2 = newnode();
820 <                        ep2->type = FUNC;
821 <                        addekid(ep2, ep1);
822 <                        ep1 = ep2;
823 <                        do {
824 <                                escan();
825 <                                addekid(ep1, getE1());
826 <                        } while (nextc == ',');
827 <                        if (nextc != ')')
828 <                                esyntax("')' expected");
829 <                        escan();
830 <                } else if (!(esupport&E_VARIABLE))
831 <                        esyntax("'(' expected");
832 <                if (esupport&E_RCONST && isconstvar(ep1))
833 <                        ep1 = rconst(ep1);
834 <                return(ep1);
815 >                        ep1->type = ARG;
816 >                        ep1->v.chan = i;
817 >                        break;
818 >                    }
819 >            if (ep1 == NULL) {
820 >                ep1 = newnode();
821 >                ep1->type = VAR;
822 >                ep1->v.ln = varinsert(nam);
823 >            }
824 >            if (esupport&E_FUNCTION && nextc == '(') {
825 >                ep2 = newnode();
826 >                ep2->type = FUNC;
827 >                addekid(ep2, ep1);
828 >                ep1 = ep2;
829 >                do {
830 >                    escan();
831 >                    addekid(ep1, getE1());
832 >                } while (nextc == ',');
833 >                if (nextc != ')')
834 >                    esyntax("')' expected");
835 >                escan();
836 >            } else if (!(esupport&E_VARIABLE))
837 >                esyntax("'(' expected");
838 >            if (esupport&E_RCONST && isconstvar(ep1))
839 >                ep1 = rconst(ep1);
840 >            return(ep1);
841          }
842          if (isdecimal(nextc)) {
843 <                ep1 = newnode();
844 <                ep1->type = NUM;
845 <                ep1->v.num = getnum();
846 <                return(ep1);
843 >            ep1 = newnode();
844 >            ep1->type = NUM;
845 >            ep1->v.num = getnum();
846 >            return(ep1);
847          }
848          esyntax("unexpected character");
849          return NULL; /* pro forma return */

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)