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.36 by greg, Sat Aug 1 23:27:04 2015 UTC vs.
Revision 2.51 by greg, Mon Sep 16 17:31:14 2024 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 35 | Line 33 | static const char      RCSid[] = "$Id$";
33  
34   #define  newnode()      (EPNODE *)ecalloc(1, sizeof(EPNODE))
35  
36 < #define  isdecimal(c)   (isdigit(c) || (c) == '.')
36 > #define  isdecimal(c)   (isdigit(c) | ((c) == '.'))
37  
38 < static double  euminus(EPNODE *), eargument(EPNODE *), enumber(EPNODE *);
38 > #define  envalue(ep)    ((ep)->type==NUM ? (ep)->v.num : evalue(ep))
39 >
40 > static double  euminus(EPNODE *), enumber(EPNODE *);
41   static double  echannel(EPNODE *);
42   static double  eadd(EPNODE *), esubtr(EPNODE *),
43                 emult(EPNODE *), edivi(EPNODE *),
# Line 92 | Line 92 | eparse(                        /* parse an expression string */
92      EPNODE  *ep;
93  
94      initstr(expr, NULL, 0);
95 <    curfunc = NULL;
95 >    ecurfunc = NULL;
96      ep = getE1();
97      if (nextc != EOF)
98 <        syntax("unexpected character");
98 >        esyntax("unexpected character");
99      return(ep);
100   }
101  
# Line 105 | Line 105 | eval(                  /* evaluate an expression string */
105      char  *expr
106   )
107   {
108 <    register EPNODE  *ep;
108 >    int  prev_support = esupport;
109 >    EPNODE  *ep;
110      double  rval;
111  
112 +    esupport &= ~E_RCONST;      /* don't bother reducing constant expr */
113      ep = eparse(expr);
114 +    esupport = prev_support;    /* as you were */
115      rval = evalue(ep);
116 <    epfree(ep);
116 >    epfree(ep,1);
117      return(rval);
118   }
119  
120  
121   int
122   epcmp(                  /* compare two expressions for equivalence */
123 <    register EPNODE  *ep1,
124 <    register EPNODE  *ep2
123 >    EPNODE  *ep1,
124 >    EPNODE  *ep2
125   )
126   {
127          double  d;
# Line 167 | Line 170 | epcmp(                 /* compare two expressions for equivalence */
170  
171   void
172   epfree(                 /* free a parse tree */
173 <    register EPNODE      *epar
173 >    EPNODE       *epar,
174 >    int         frep
175   )
176   {
177 <    register EPNODE  *ep;
177 >    EPNODE      *ep;
178  
179      switch (epar->type) {
180  
# Line 189 | Line 193 | epfree(                        /* free a parse tree */
193              break;
194  
195          default:
196 <            while ((ep = epar->v.kid) != NULL) {
197 <                epar->v.kid = ep->sibling;
198 <                epfree(ep);
199 <            }
196 >            if (epar->nkids < 0) {
197 >                ep = epar->v.kid - epar->nkids;
198 >                while (ep > epar->v.kid)
199 >                        epfree(--ep, 0);
200 >                efree(ep);      /* free array space */
201 >            } else
202 >                while ((ep = epar->v.kid) != NULL) {
203 >                    epar->v.kid = ep->sibling;
204 >                    epfree(ep, 1);
205 >                }
206              break;
207  
208      }
209 +    if (frep)
210 +        efree(epar);
211 +    else
212 +        memset(epar, 0, sizeof(EPNODE));
213 + }
214  
215 <    efree((char *)epar);
215 >
216 > static void
217 > epflatten(                      /* flatten hierarchies for '+', '*' */
218 >        EPNODE *epar
219 > )
220 > {
221 >    EPNODE      *ep;
222 >
223 >    if (epar->nkids < 0)        /* can't handle array allocations */
224 >        return;
225 >
226 >    for (ep = epar->v.kid; ep != NULL; ep = ep->sibling)
227 >        while (ep->type == epar->type && ep->nkids > 0) {
228 >            EPNODE      *ep1 = ep->v.kid;
229 >            while (ep1->sibling != NULL)
230 >                ep1 = ep1->sibling;
231 >            ep1->sibling = ep->sibling;
232 >            epar->nkids += ep->nkids - 1;
233 >            ep1 = ep->v.kid;
234 >            *ep = *ep1;
235 >            efree(ep1);         /* not epfree()! */
236 >        }
237   }
238  
239 <                                /* the following used to be a switch */
240 < static double
241 < eargument(
242 <    EPNODE      *ep
239 >
240 > void
241 > epoptimize(                     /* flatten operations, lists -> arrays */
242 >        EPNODE  *epar
243   )
244   {
245 <    return(argument(ep->v.chan));
245 >    EPNODE      *ep;
246 >
247 >    if ((epar->type == '+') | (epar->type == '*'))
248 >        epflatten(epar);        /* flatten associative operations */
249 >
250 >    if (epar->nkids)            /* do children if any */
251 >        for (ep = epar->v.kid; ep != NULL; ep = ep->sibling)
252 >            epoptimize(ep);
253 >
254 >    if (epar->nkids > 4) {      /* make list into array if > 4 kids */
255 >        int     n = 1;
256 >        epar->v.kid = (EPNODE *)erealloc(epar->v.kid,
257 >                                        sizeof(EPNODE)*epar->nkids);
258 >        while (n < epar->nkids) {
259 >            ep = epar->v.kid[n-1].sibling;
260 >            epar->v.kid[n] = *ep;
261 >            efree(ep);          /* not epfree()! */
262 >            epar->v.kid[n-1].sibling = epar->v.kid + n;
263 >            n++;
264 >        }
265 >        epar->nkids = -n;
266 >    }
267   }
268  
269 +                                /* the following used to be a switch */
270   static double
271   enumber(
272      EPNODE      *ep
# Line 222 | Line 280 | euminus(
280      EPNODE      *ep
281   )
282   {
283 <    register EPNODE  *ep1 = ep->v.kid;
283 >    EPNODE  *ep1 = ep->v.kid;
284  
285      return(-evalue(ep1));
286   }
# Line 240 | Line 298 | eadd(
298      EPNODE      *ep
299   )
300   {
301 <    register EPNODE  *ep1 = ep->v.kid;
301 >    double  sum = 0;
302 >    EPNODE  *ep1 = ep->v.kid;
303  
304 <    return(evalue(ep1) + evalue(ep1->sibling));
304 >    do
305 >        sum += envalue(ep1);
306 >    while ((ep1 = ep1->sibling) != NULL);
307 >
308 >    return(sum);
309   }
310  
311   static double
# Line 250 | Line 313 | esubtr(
313      EPNODE      *ep
314   )
315   {
316 <    register EPNODE  *ep1 = ep->v.kid;
316 >    EPNODE  *ep1 = ep->v.kid;
317 >    EPNODE  *ep2 = ep1->sibling;
318  
319 <    return(evalue(ep1) - evalue(ep1->sibling));
319 >    return(envalue(ep1) - envalue(ep2));
320   }
321  
322   static double
# Line 260 | Line 324 | emult(
324      EPNODE      *ep
325   )
326   {
327 <    register EPNODE  *ep1 = ep->v.kid;
327 >    double  prod = 1;
328 >    EPNODE  *ep1 = ep->v.kid;
329  
330 <    return(evalue(ep1) * evalue(ep1->sibling));
330 >    do
331 >        prod *= envalue(ep1);
332 >    while ((ep1 = ep1->sibling) != NULL);
333 >
334 >    return(prod);
335   }
336  
337   static double
# Line 270 | Line 339 | edivi(
339      EPNODE      *ep
340   )
341   {
342 <    register EPNODE  *ep1 = ep->v.kid;
343 <    double  d;
342 >    EPNODE  *ep1 = ep->v.kid;
343 >    double  den = evalue(ep1->sibling);
344  
345 <    d = evalue(ep1->sibling);
277 <    if (d == 0.0) {
345 >    if (den == 0.0) {
346          wputs("Division by zero\n");
347          errno = ERANGE;
348          return(0.0);
349      }
350 <    return(evalue(ep1) / d);
350 >    return(envalue(ep1) / den);
351   }
352  
353   static double
# Line 287 | Line 355 | epow(
355      EPNODE      *ep
356   )
357   {
358 <    register EPNODE  *ep1 = ep->v.kid;
358 >    EPNODE  *ep1 = ep->v.kid;
359      double  d;
360      int  lasterrno;
361  
# Line 302 | Line 370 | epow(
370              errno = ERANGE;
371      }
372   #endif
373 <    if (errno == EDOM || errno == ERANGE) {
373 >    if ((errno == EDOM) | (errno == ERANGE)) {
374          wputs("Illegal power\n");
375          return(0.0);
376      }
# Line 323 | Line 391 | ebotch(
391  
392   EPNODE *
393   ekid(                   /* return pointer to a node's nth kid */
394 <    register EPNODE      *ep,
395 <    register int  n
394 >    EPNODE       *ep,
395 >    int  n
396   )
397   {
398 <
399 <    for (ep = ep->v.kid; ep != NULL; ep = ep->sibling)
400 <        if (--n < 0)
401 <            break;
402 <
398 >    if (ep->nkids < 0) {        /* allocated array? */
399 >        if (n >= -ep->nkids)
400 >            return(NULL);
401 >        return(ep->v.kid + n);
402 >    }
403 >    ep = ep->v.kid;             /* else get from list */
404 >    while (n-- > 0)
405 >        if ((ep = ep->sibling) == NULL)
406 >                break;
407      return(ep);
408   }
409  
410  
339 int
340 nekids(                 /* return # of kids for node ep */
341    register EPNODE      *ep
342 )
343 {
344    register int  n = 0;
345
346    for (ep = ep->v.kid; ep != NULL; ep = ep->sibling)
347        n++;
348
349    return(n);
350 }
351
352
411   void
412   initfile(               /* prepare input file */
413      FILE  *fp,
# Line 365 | Line 423 | initfile(              /* prepare input file */
423      lineno = ln;
424      linepos = 0;
425      inpbuf[0] = '\0';
426 <    scan();
426 >    escan();
427   }
428  
429  
# Line 381 | Line 439 | initstr(               /* prepare input string */
439      lineno = ln;
440      linbuf = s;
441      linepos = 0;
442 <    scan();
442 >    escan();
443   }
444  
445  
# Line 401 | Line 459 | getscanpos(    /* return current scan position */
459  
460  
461   int
462 < scan(void)              /* scan next character, return literal next */
462 > escan(void)             /* scan next character, return literal next */
463   {
464 <    register int  lnext = 0;
464 >    int  lnext = 0;
465  
466      do {
467          if (linbuf[linepos] == '\0')
# Line 423 | Line 481 | scan(void)             /* scan next character, return literal nex
481                  break;
482          }
483          if (nextc == '{') {
484 <            scan();
484 >            escan();
485              while (nextc != '}')
486                  if (nextc == EOF)
487 <                    syntax("'}' expected");
487 >                    esyntax("'}' expected");
488                  else
489 <                    scan();
490 <            scan();
489 >                    escan();
490 >            escan();
491          }
492      } while (isspace(nextc));
493      return(lnext);
# Line 442 | Line 500 | long2ascii(                          /* convert long to ascii */
500   )
501   {
502      static char  buf[16];
503 <    register char  *cp;
503 >    char  *cp;
504      int  neg = 0;
505  
506      if (l == 0)
# Line 464 | Line 522 | long2ascii(                          /* convert long to ascii */
522  
523  
524   void
525 < syntax(                 /* report syntax error and quit */
525 > esyntax(                        /* report syntax error and quit */
526      char  *err
527   )
528   {
529 <    register int  i;
529 >    int  i;
530  
531 <    if (infile != NULL || lineno != 0) {
531 >    if ((infile != NULL) | (lineno != 0)) {
532          if (infile != NULL) eputs(infile);
533          if (lineno != 0) {
534              eputs(infile != NULL ? ", line " : "line ");
# Line 492 | Line 550 | syntax(                        /* report syntax error and quit */
550  
551   void
552   addekid(                        /* add a child to ep */
553 <    register EPNODE      *ep,
554 <    EPNODE      *ekid
553 >    EPNODE       *ep,
554 >    EPNODE      *ek
555   )
556   {
557 +    if (ep->nkids < 0) {
558 +        eputs("Cannot add kid to EPNODE array\n");
559 +        quit(1);
560 +    }
561 +    ep->nkids++;
562      if (ep->v.kid == NULL)
563 <        ep->v.kid = ekid;
563 >        ep->v.kid = ek;
564      else {
565          for (ep = ep->v.kid; ep->sibling != NULL; ep = ep->sibling)
566              ;
567 <        ep->sibling = ekid;
567 >        ep->sibling = ek;
568      }
569 <    ekid->sibling = NULL;
569 >    ek->sibling = NULL;         /* shouldn't be necessary */
570   }
571  
572  
# Line 511 | Line 574 | char *
574   getname(void)                   /* scan an identifier */
575   {
576      static char  str[RMAXWORD+1];
577 <    register int  i, lnext;
577 >    int  i, lnext;
578  
579      lnext = nextc;
580 <    for (i = 0; i < RMAXWORD && isid(lnext); i++, lnext = scan())
580 >    for (i = 0; i < RMAXWORD && isid(lnext); i++, lnext = escan())
581          str[i] = lnext;
582      str[i] = '\0';
583      while (isid(lnext))         /* skip rest of name */
584 <        lnext = scan();
584 >        lnext = escan();
585  
586      return(str);
587   }
# Line 527 | Line 590 | getname(void)                  /* scan an identifier */
590   int
591   getinum(void)                   /* scan a positive integer */
592   {
593 <    register int  n, lnext;
593 >    int  n, lnext;
594  
595      n = 0;
596      lnext = nextc;
597      while (isdigit(lnext)) {
598          n = n * 10 + lnext - '0';
599 <        lnext = scan();
599 >        lnext = escan();
600      }
601      return(n);
602   }
# Line 542 | Line 605 | getinum(void)                  /* scan a positive integer */
605   double
606   getnum(void)                    /* scan a positive float */
607   {
608 <    register int  i, lnext;
608 >    int  i, lnext;
609      char  str[RMAXWORD+1];
610  
611      i = 0;
612      lnext = nextc;
613      while (isdigit(lnext) && i < RMAXWORD) {
614          str[i++] = lnext;
615 <        lnext = scan();
615 >        lnext = escan();
616      }
617 <    if (lnext == '.' && i < RMAXWORD) {
617 >    if ((lnext == '.') & (i < RMAXWORD)) {
618          str[i++] = lnext;
619 <        lnext = scan();
619 >        lnext = escan();
620          if (i == 1 && !isdigit(lnext))
621 <            syntax("badly formed number");
621 >            esyntax("badly formed number");
622          while (isdigit(lnext) && i < RMAXWORD) {
623              str[i++] = lnext;
624 <            lnext = scan();
624 >            lnext = escan();
625          }
626      }
627      if ((lnext == 'e') | (lnext == 'E') && i < RMAXWORD) {
628          str[i++] = lnext;
629 <        lnext = scan();
629 >        lnext = escan();
630          if ((lnext == '-') | (lnext == '+') && i < RMAXWORD) {
631              str[i++] = lnext;
632 <            lnext = scan();
632 >            lnext = escan();
633          }
634          if (!isdigit(lnext))
635 <            syntax("missing exponent");
635 >            esyntax("missing exponent");
636          while (isdigit(lnext) && i < RMAXWORD) {
637              str[i++] = lnext;
638 <            lnext = scan();
638 >            lnext = escan();
639          }
640      }
641      str[i] = '\0';
# Line 585 | Line 648 | EPNODE *
648   getE1(void)                     /* E1 -> E1 ADDOP E2 */
649                                  /*       E2 */
650   {
651 <    register EPNODE  *ep1, *ep2;
651 >    EPNODE  *ep1, *ep2;
652  
653      ep1 = getE2();
654 <    while (nextc == '+' || nextc == '-') {
654 >    while ((nextc == '+') | (nextc == '-')) {
655          ep2 = newnode();
656          ep2->type = nextc;
657 <        scan();
657 >        escan();
658          addekid(ep2, ep1);
659          addekid(ep2, getE2());
660          if (esupport&E_RCONST &&
661 <                        ep1->type == NUM && ep1->sibling->type == NUM)
661 >                        (ep1->type == NUM) & (ep1->sibling->type == NUM))
662                  ep2 = rconst(ep2);
663          ep1 = ep2;
664      }
# Line 607 | Line 670 | EPNODE *
670   getE2(void)                     /* E2 -> E2 MULOP E3 */
671                                  /*       E3 */
672   {
673 <    register EPNODE  *ep1, *ep2;
673 >    EPNODE  *ep1, *ep2;
674  
675      ep1 = getE3();
676 <    while (nextc == '*' || nextc == '/') {
676 >    while ((nextc == '*') | (nextc == '/')) {
677          ep2 = newnode();
678          ep2->type = nextc;
679 <        scan();
679 >        escan();
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) {
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 <                                        syntax("divide by zero constant");
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);
694 >                                epfree(ep2,1);
695                                  ep2 = ep3;
696                          }
697                  } else if (ep1->type == NUM && ep1->v.num == 0) {
698 <                        epfree(ep3);            /* (0 * E3) or (0 / E3) */
698 >                        epfree(ep3,1);          /* (0 * E3) or (0 / E3) */
699                          ep1->sibling = NULL;
700 <                        efree((char *)ep2);
700 >                        efree(ep2);
701                          ep2 = ep1;
702                  }
703          }
# Line 648 | Line 711 | EPNODE *
711   getE3(void)                     /* E3 -> E4 ^ E3 */
712                                  /*       E4 */
713   {
714 <        register EPNODE  *ep1, *ep2;
714 >        EPNODE  *ep1, *ep2;
715  
716          ep1 = getE4();
717          if (nextc != '^')
718                  return(ep1);
719          ep2 = newnode();
720          ep2->type = nextc;
721 <        scan();
721 >        escan();
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) {
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);            /* (0 ^ E3) */
729 >                        epfree(ep3,1);          /* (0 ^ E3) */
730                          ep1->sibling = NULL;
731 <                        efree((char *)ep2);
731 >                        efree(ep2);
732                          ep2 = ep1;
733 <                } else if ((ep3->type == NUM && ep3->v.num == 0) ||
733 >                } else if ((ep3->type == NUM && ep3->v.num == 0) |
734                                  (ep1->type == NUM && ep1->v.num == 1)) {
735 <                        epfree(ep2);            /* (E4 ^ 0) or (1 ^ E3) */
673 <                        ep2 = newnode();
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);
# Line 683 | Line 750 | EPNODE *
750   getE4(void)                     /* E4 -> ADDOP E5 */
751                                  /*       E5 */
752   {
753 <    register EPNODE  *ep1, *ep2;
753 >    EPNODE  *ep1, *ep2;
754  
755      if (nextc == '-') {
756 <        scan();
756 >        escan();
757          ep2 = getE5();
758          if (ep2->type == NUM) {
759                  ep2->v.num = -ep2->v.num;
# Line 694 | Line 761 | getE4(void)                    /* E4 -> ADDOP E5 */
761          }
762          if (ep2->type == UMINUS) {      /* don't generate -(-E5) */
763              ep1 = ep2->v.kid;
764 <            efree((char *)ep2);
764 >            efree(ep2);
765              return(ep1);
766          }
767          ep1 = newnode();
# Line 703 | Line 770 | getE4(void)                    /* E4 -> ADDOP E5 */
770          return(ep1);
771      }
772      if (nextc == '+')
773 <        scan();
773 >        escan();
774      return(getE5());
775   }
776  
# Line 718 | Line 785 | getE5(void)                    /* E5 -> (E1) */
785   {
786          int      i;
787          char  *nam;
788 <        register EPNODE  *ep1, *ep2;
788 >        EPNODE  *ep1, *ep2;
789  
790          if (nextc == '(') {
791 <                scan();
791 >                escan();
792                  ep1 = getE1();
793                  if (nextc != ')')
794 <                        syntax("')' expected");
795 <                scan();
794 >                        esyntax("')' expected");
795 >                escan();
796                  return(ep1);
797          }
731
798          if (esupport&E_INCHAN && nextc == '$') {
799 <                scan();
799 >                escan();
800                  ep1 = newnode();
801                  ep1->type = CHAN;
802                  ep1->v.chan = getinum();
803                  return(ep1);
804          }
739
805          if (esupport&(E_VARIABLE|E_FUNCTION) &&
806 <                        (isalpha(nextc) || nextc == CNTXMARK)) {
806 >                        (isalpha(nextc) | (nextc == CNTXMARK))) {
807                  nam = getname();
808                  ep1 = NULL;
809                  if ((esupport&(E_VARIABLE|E_FUNCTION)) == (E_VARIABLE|E_FUNCTION)
810 <                                && curfunc != NULL)
811 <                        for (i = 1, ep2 = curfunc->v.kid->sibling;
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();
# Line 762 | Line 827 | getE5(void)                    /* E5 -> (E1) */
827                          addekid(ep2, ep1);
828                          ep1 = ep2;
829                          do {
830 <                                scan();
830 >                                escan();
831                                  addekid(ep1, getE1());
832                          } while (nextc == ',');
833                          if (nextc != ')')
834 <                                syntax("')' expected");
835 <                        scan();
834 >                                esyntax("')' expected");
835 >                        escan();
836                  } else if (!(esupport&E_VARIABLE))
837 <                        syntax("'(' expected");
837 >                        esyntax("'(' expected");
838                  if (esupport&E_RCONST && isconstvar(ep1))
839                          ep1 = rconst(ep1);
840                  return(ep1);
841          }
777
842          if (isdecimal(nextc)) {
843                  ep1 = newnode();
844                  ep1->type = NUM;
845                  ep1->v.num = getnum();
846                  return(ep1);
847          }
848 <        syntax("unexpected character");
848 >        esyntax("unexpected character");
849          return NULL; /* pro forma return */
850   }
851  
852  
853   EPNODE *
854   rconst(                 /* reduce a constant expression */
855 <    register EPNODE      *epar
855 >    EPNODE       *epar
856   )
857   {
858 <    register EPNODE  *ep;
858 >    EPNODE  *ep;
859  
860      ep = newnode();
861      ep->type = NUM;
862      errno = 0;
863      ep->v.num = evalue(epar);
864 <    if (errno == EDOM || errno == ERANGE)
865 <        syntax("bad constant expression");
866 <    epfree(epar);
864 >    if ((errno == EDOM) | (errno == ERANGE))
865 >        esyntax("bad constant expression");
866 >    epfree(epar,1);
867  
868      return(ep);
869   }
# Line 807 | Line 871 | rconst(                        /* reduce a constant expression */
871  
872   int
873   isconstvar(                     /* is ep linked to a constant expression? */
874 <    register EPNODE      *ep
874 >    EPNODE       *ep
875   )
876   {
877 <    register EPNODE  *ep1;
877 >    EPNODE  *ep1;
878  
879      if (esupport&E_FUNCTION && ep->type == FUNC) {
880          if (!isconstfun(ep->v.kid))
# Line 833 | Line 897 | isconstvar(                    /* is ep linked to a constant expression
897  
898   int
899   isconstfun(                     /* is ep linked to a constant function? */
900 <    register EPNODE      *ep
900 >    EPNODE       *ep
901   )
902   {
903 <    register EPNODE  *dp;
904 <    register LIBR  *lp;
903 >    EPNODE  *dp;
904 >    ELIBR  *lp;
905  
906      if (ep->type != VAR)
907          return(0);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines