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

Comparing ray/src/common/caldefn.c (file contents):
Revision 2.24 by greg, Fri Mar 5 17:28:46 2010 UTC vs.
Revision 2.33 by greg, Fri Apr 8 23:32:25 2022 UTC

# Line 27 | Line 27 | static const char      RCSid[] = "$Id$";
27  
28   #include "copyright.h"
29  
30 #include  <stdio.h>
31 #include  <string.h>
30   #include  <ctype.h>
31  
32   #include  "rterror.h"
# Line 115 | Line 113 | evariable(                     /* evaluate a variable */
113          EPNODE  *ep
114   )
115   {
116 <    register VARDEF  *dp = ep->v.ln;
116 >    VARDEF  *dp = ep->v.ln;
117  
118      return(dvalue(dp->name, dp->def));
119   }
# Line 129 | Line 127 | varset(                /* set a variable's value */
127   )
128   {
129      char  *qname;
130 <    register EPNODE  *ep1, *ep2;
130 >    EPNODE  *ep1, *ep2;
131                                          /* get qualified name */
132      qname = qualname(vname, 0);
133                                          /* check for quick set */
134 <    if ((ep1 = dlookup(qname)) != NULL && ep1->v.kid->type == SYM) {
134 >    if ((ep1 = dlookup(qname)) != NULL && ep1->v.kid->type == SYM &&
135 >                (ep1->type == ':') <= (assign == ':')) {
136          ep2 = ep1->v.kid->sibling;
137          if (ep2->type == NUM) {
138              ep2->v.num = val;
# Line 141 | Line 140 | varset(                /* set a variable's value */
140              return;
141          }
142      }
143 +    if (ep1 != NULL && esupport&E_REDEFW) {
144 +        wputs(qname);
145 +        if (ep1->type == ':')
146 +            wputs(": reset constant expression\n");
147 +        else
148 +            wputs(": reset expression\n");
149 +    }
150                                          /* hand build definition */
151      ep1 = newnode();
152      ep1->type = assign;
# Line 152 | Line 158 | varset(                /* set a variable's value */
158      ep2->type = NUM;
159      ep2->v.num = val;
160      addekid(ep1, ep2);
161 <    dremove(qname);
161 >    if (assign == ':')
162 >        dremove(qname);
163 >    else
164 >        dclear(qname);
165      dpush(qname, ep1);
166   }
167  
# Line 162 | Line 171 | dclear(                        /* delete variable definitions of name */
171          char  *name
172   )
173   {
174 <    register EPNODE  *ep;
174 >    EPNODE  *ep;
175  
176      while ((ep = dpop(name)) != NULL) {
177          if (ep->type == ':') {
# Line 179 | Line 188 | dremove(                       /* delete all definitions of name */
188          char  *name
189   )
190   {
191 <    register EPNODE  *ep;
191 >    EPNODE  *ep;
192  
193      while ((ep = dpop(name)) != NULL)
194          epfree(ep);
# Line 187 | Line 196 | dremove(                       /* delete all definitions of name */
196  
197  
198   int
199 < vardefined(     /* return non-zero if variable defined */
199 > vardefined(     /* return '=' or ':' if variable/constant defined */
200          char  *name
201   )
202   {
203 <    register EPNODE  *dp;
203 >    EPNODE  *dp = dlookup(name);
204  
205 <    return((dp = dlookup(name)) != NULL && dp->v.kid->type == SYM);
205 >    if (dp == NULL || dp->v.kid->type != SYM)
206 >        return(0);
207 >
208 >    return(dp->type);
209   }
210  
211  
212   char *
213 < setcontext(                     /* set a new context path */
214 <        register char  *ctx
213 > calcontext(                     /* set a new context path */
214 >        char  *ctx
215   )
216   {
217 <    register char  *cpp;
217 >    char  *cpp;
218  
219      if (ctx == NULL)
220          return(context);                /* just asking */
# Line 236 | Line 248 | pushcontext(           /* push on another context */
248   )
249   {
250      char  oldcontext[MAXCNTX+1];
251 <    register int  n;
251 >    int  n;
252  
253      strcpy(oldcontext, context);        /* save old context */
254 <    setcontext(ctx);                    /* set new context */
254 >    calcontext(ctx);                    /* set new context */
255      n = strlen(context);                /* tack on old */
256      if (n+strlen(oldcontext) > MAXCNTX) {
257          strncpy(context+n, oldcontext, MAXCNTX-n);
# Line 253 | Line 265 | pushcontext(           /* push on another context */
265   char *
266   popcontext(void)                        /* pop off top context */
267   {
268 <    register char  *cp1, *cp2;
268 >    char  *cp1, *cp2;
269  
270      if (!context[0])                    /* nothing left to pop */
271          return(context);
# Line 269 | Line 281 | popcontext(void)                       /* pop off top context */
281  
282   char *
283   qualname(               /* get qualified name */
284 <        register char  *nam,
284 >        char  *nam,
285          int  lvl
286   )
287   {
288      static char  nambuf[RMAXWORD+1];
289 <    register char  *cp = nambuf, *cpp;
289 >    char  *cp = nambuf, *cpp;
290                                  /* check for explicit local */
291      if (*nam == CNTXMARK)
292          if (lvl > 0)            /* only action is to refuse search */
# Line 316 | Line 328 | toolong:
328  
329   int
330   incontext(                      /* is qualified name in current context? */
331 <        register char  *qn
331 >        char  *qn
332   )
333   {
334      if (!context[0])                    /* global context accepts all */
# Line 332 | Line 344 | chanout(                       /* set output channels */
344          void  (*cs)(int n, double v)
345   )
346   {
347 <    register EPNODE  *ep;
347 >    EPNODE  *ep;
348  
349      for (ep = outchan; ep != NULL; ep = ep->sibling)
350          (*cs)(ep->v.kid->v.chan, evalue(ep->v.kid->sibling));
# Line 345 | Line 357 | dcleanup(              /* clear definitions (0->vars,1->output,2->
357          int  lvl
358   )
359   {
360 <    register int  i;
361 <    register VARDEF  *vp;
362 <    register EPNODE  *ep;
360 >    int  i;
361 >    VARDEF  *vp;
362 >    EPNODE  *ep;
363                                  /* if context is global, clear all */
364      for (i = 0; i < NHASH; i++)
365          for (vp = hashtbl[i]; vp != NULL; vp = vp->next)
# Line 370 | Line 382 | dlookup(                       /* look up a definition */
382          char  *name
383   )
384   {
385 <    register VARDEF  *vp;
385 >    VARDEF  *vp;
386      
387      if ((vp = varlookup(name)) == NULL)
388          return(NULL);
# Line 384 | Line 396 | varlookup(                     /* look up a variable */
396   )
397   {
398      int  lvl = 0;
399 <    register char  *qname;
400 <    register VARDEF  *vp;
399 >    char  *qname;
400 >    VARDEF  *vp;
401                                  /* find most qualified match */
402      while ((qname = qualname(name, lvl++)) != NULL)
403          for (vp = hashtbl[hash(qname)]; vp != NULL; vp = vp->next)
# Line 400 | Line 412 | varinsert(                     /* get a link to a variable */
412          char  *name
413   )
414   {
415 <    register VARDEF  *vp;
415 >    VARDEF  *vp;
416      int  hv;
417      
418      if ((vp = varlookup(name)) != NULL) {
# Line 426 | Line 438 | libupdate(                     /* update library links */
438          char  *fn
439   )
440   {
441 <    register int  i;
442 <    register VARDEF  *vp;
441 >    int  i;
442 >    VARDEF  *vp;
443                                          /* if fn is NULL then relink all */
444      for (i = 0; i < NHASH; i++)
445          for (vp = hashtbl[i]; vp != NULL; vp = vp->next)
446 <            if (vp->lib != NULL || fn == NULL || !strcmp(fn, vp->name))
446 >            if ((vp->lib != NULL) | (fn == NULL) || !strcmp(fn, vp->name))
447                  vp->lib = liblookup(vp->name);
448   }
449  
450  
451   void
452   varfree(                                /* release link to variable */
453 <        register VARDEF  *ln
453 >        VARDEF   *ln
454   )
455   {
456 <    register VARDEF  *vp;
456 >    VARDEF  *vp;
457      int  hv;
458  
459      if (--ln->nlinks > 0)
# Line 474 | Line 486 | dfirst(void)                   /* return pointer to first definition *
486   EPNODE *
487   dnext(void)                             /* return pointer to next definition */
488   {
489 <    register EPNODE  *ep;
490 <    register char  *nm;
489 >    EPNODE  *ep;
490 >    char  *nm;
491  
492      while (htndx < NHASH) {
493          if (htpos == NULL)
# Line 499 | Line 511 | dpop(                  /* pop a definition */
511          char  *name
512   )
513   {
514 <    register VARDEF  *vp;
515 <    register EPNODE  *dp;
514 >    VARDEF  *vp;
515 >    EPNODE  *dp;
516      
517      if ((vp = varlookup(name)) == NULL || vp->def == NULL)
518          return(NULL);
# Line 514 | Line 526 | dpop(                  /* pop a definition */
526   void
527   dpush(                  /* push on a definition */
528          char  *nm,
529 <        register EPNODE  *ep
529 >        EPNODE   *ep
530   )
531   {
532 <    register VARDEF  *vp;
532 >    VARDEF  *vp;
533  
534      vp = varinsert(nm);
535      ep->sibling = vp->def;
# Line 531 | Line 543 | addchan(                       /* add an output channel assignment */
543   )
544   {
545      int  ch = sp->v.kid->v.chan;
546 <    register EPNODE  *ep, *epl;
546 >    EPNODE  *ep, *epl;
547  
548      for (epl = NULL, ep = outchan; ep != NULL; epl = ep, ep = ep->sibling)
549          if (ep->v.kid->v.chan >= ch) {
# Line 559 | Line 571 | addchan(                       /* add an output channel assignment */
571   void
572   getstatement(void)                      /* get next statement */
573   {
574 <    register EPNODE  *ep;
574 >    EPNODE  *ep;
575      char  *qname;
576 <    register VARDEF  *vdef;
576 >    VARDEF  *vdef;
577  
578      if (nextc == ';') {         /* empty statement */
579          scan();
# Line 607 | Line 619 | getdefn(void)
619          /*      FUNC(SYM,..) = E1 */
620          /*      FUNC(SYM,..) : E1 */
621   {
622 <    register EPNODE  *ep1, *ep2;
622 >    EPNODE  *ep1, *ep2;
623  
624 <    if (!isalpha(nextc) && nextc != CNTXMARK)
624 >    if (!isalpha(nextc) & (nextc != CNTXMARK))
625          syntax("illegal variable name");
626  
627      ep1 = newnode();
# Line 628 | Line 640 | getdefn(void)
640              ep2 = newnode();
641              ep2->type = SYM;
642              ep2->v.name = savestr(getname());
643 +            if (strchr(ep2->v.name, CNTXMARK) != NULL)
644 +                syntax("illegal parameter name");
645              addekid(ep1, ep2);
646          } while (nextc == ',');
647          if (nextc != ')')
# Line 636 | Line 650 | getdefn(void)
650          curfunc = ep1;
651      }
652  
653 <    if (nextc != '=' && nextc != ':')
653 >    if ((nextc != '=') & (nextc != ':'))
654          syntax("'=' or ':' expected");
655  
656      ep2 = newnode();
# Line 663 | Line 677 | getdefn(void)
677   EPNODE *
678   getchan(void)                   /* A -> $N = E1 */
679   {
680 <    register EPNODE  *ep1, *ep2;
680 >    EPNODE  *ep1, *ep2;
681  
682      if (nextc != '$')
683          syntax("missing '$'");
# Line 693 | Line 707 | getchan(void)                  /* A -> $N = E1 */
707  
708  
709   static double                   /* evaluate a variable */
710 < dvalue(char  *name, EPNODE      *d)
710 > dvalue(char *name, EPNODE *d)
711   {
712 <    register EPNODE  *ep1, *ep2;
712 >    EPNODE  *ep1, *ep2;
713      
714      if (d == NULL || d->v.kid->type != SYM) {
715          eputs(name);
# Line 705 | Line 719 | dvalue(char  *name, EPNODE     *d)
719      ep1 = d->v.kid->sibling;                    /* get expression */
720      if (ep1->type == NUM)
721          return(ep1->v.num);                     /* return if number */
722 +    if (esupport&E_RCONST && d->type == ':') {
723 +        wputs(name);
724 +        wputs(": assigned non-constant value\n");
725 +    }
726      ep2 = ep1->sibling;                         /* check time */
727      if (eclock >= MAXCLOCK)
728          eclock = 1;                             /* wrap clock counter */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines