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.11 by greg, Wed Feb 12 17:38:03 1997 UTC vs.
Revision 2.12 by greg, Sat Feb 22 02:07:21 2003 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1997 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   *  Store variable definitions.
6   *
# Line 22 | Line 19 | static char SCCSid[] = "$SunId$ LBL";
19   *  4/23/91  Added ':' assignment for constant expressions
20   *
21   *  8/7/91  Added optional context path to append to variable names
22 + *
23 + *  5/17/2001  Fixed clock counter wrapping behavior
24 + *
25 + *  2/19/03     Eliminated conditional compiles in favor of esupport extern.
26   */
27  
28 + /* ====================================================================
29 + * The Radiance Software License, Version 1.0
30 + *
31 + * Copyright (c) 1990 - 2002 The Regents of the University of California,
32 + * through Lawrence Berkeley National Laboratory.   All rights reserved.
33 + *
34 + * Redistribution and use in source and binary forms, with or without
35 + * modification, are permitted provided that the following conditions
36 + * are met:
37 + *
38 + * 1. Redistributions of source code must retain the above copyright
39 + *         notice, this list of conditions and the following disclaimer.
40 + *
41 + * 2. Redistributions in binary form must reproduce the above copyright
42 + *       notice, this list of conditions and the following disclaimer in
43 + *       the documentation and/or other materials provided with the
44 + *       distribution.
45 + *
46 + * 3. The end-user documentation included with the redistribution,
47 + *           if any, must include the following acknowledgment:
48 + *             "This product includes Radiance software
49 + *                 (http://radsite.lbl.gov/)
50 + *                 developed by the Lawrence Berkeley National Laboratory
51 + *               (http://www.lbl.gov/)."
52 + *       Alternately, this acknowledgment may appear in the software itself,
53 + *       if and wherever such third-party acknowledgments normally appear.
54 + *
55 + * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
56 + *       and "The Regents of the University of California" must
57 + *       not be used to endorse or promote products derived from this
58 + *       software without prior written permission. For written
59 + *       permission, please contact [email protected].
60 + *
61 + * 5. Products derived from this software may not be called "Radiance",
62 + *       nor may "Radiance" appear in their name, without prior written
63 + *       permission of Lawrence Berkeley National Laboratory.
64 + *
65 + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
66 + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
67 + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
68 + * DISCLAIMED.   IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
69 + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
70 + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
71 + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
72 + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
73 + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
74 + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
75 + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
76 + * SUCH DAMAGE.
77 + * ====================================================================
78 + *
79 + * This software consists of voluntary contributions made by many
80 + * individuals on behalf of Lawrence Berkeley National Laboratory.   For more
81 + * information on Lawrence Berkeley National Laboratory, please see
82 + * <http://www.lbl.gov/>.
83 + */
84 +
85   #include  <stdio.h>
86  
87 + #include  <string.h>
88 +
89   #include  <ctype.h>
90  
91   #include  "calcomp.h"
# Line 38 | Line 98 | static char SCCSid[] = "$SunId$ LBL";
98  
99   #define  newnode()      (EPNODE *)ecalloc(1, sizeof(EPNODE))
100  
41 extern char  *ecalloc(), *emalloc(), *savestr(), *strcpy();
42
101   static double  dvalue();
102  
103 + #define  MAXCLOCK       (1L<<31)        /* clock wrap value */
104 +
105   unsigned long  eclock = 0;              /* value storage timer */
106  
107   #define  MAXCNTX        1023            /* maximum context length */
# Line 51 | Line 111 | static char  context[MAXCNTX+1];       /* current context pa
111   static VARDEF  *hashtbl[NHASH];         /* definition list */
112   static int  htndx;                      /* index for */        
113   static VARDEF  *htpos;                  /* ...dfirst() and */
54 #ifdef  OUTCHAN
114   static EPNODE  *ochpos;                 /* ...dnext */
115   static EPNODE  *outchan;
57 #endif
116  
59 #ifdef  FUNCTION
117   EPNODE  *curfunc = NULL;
118   #define  dname(ep)      ((ep)->v.kid->type == SYM ? \
119                          (ep)->v.kid->v.name : \
120                          (ep)->v.kid->v.kid->v.name)
64 #else
65 #define  dname(ep)      ((ep)->v.kid->v.name)
66 #endif
121  
122  
123 + void
124   fcompile(fname)                 /* get definitions from a file */
125   char  *fname;
126   {
# Line 86 | Line 141 | char  *fname;
141   }
142  
143  
144 + void
145   scompile(str, fn, ln)           /* get definitions from a string */
146   char  *str;
147   char  *fn;
# Line 115 | Line 171 | EPNODE *ep;
171   }
172  
173  
174 + void
175   varset(vname, assign, val)      /* set a variable's value */
176   char  *vname;
177   int  assign;
# Line 149 | Line 206 | double val;
206   }
207  
208  
209 + void
210   dclear(name)                    /* delete variable definitions of name */
211   char  *name;
212   {
# Line 164 | Line 222 | char  *name;
222   }
223  
224  
225 + void
226   dremove(name)                   /* delete all definitions of name */
227   char  *name;
228   {
# Line 174 | Line 233 | char  *name;
233   }
234  
235  
236 + int
237   vardefined(name)        /* return non-zero if variable defined */
238   char  *name;
239   {
# Line 298 | Line 358 | toolong:
358   }
359  
360  
361 + int
362   incontext(qn)                   /* is qualified name in current context? */
363   register char  *qn;
364   {
# Line 309 | Line 370 | register char  *qn;
370   }
371  
372  
373 < #ifdef  OUTCHAN
373 > void
374   chanout(cs)                     /* set output channels */
375   int  (*cs)();
376   {
# Line 319 | Line 380 | int  (*cs)();
380          (*cs)(ep->v.kid->v.chan, evalue(ep->v.kid->sibling));
381  
382   }
322 #endif
383  
384  
385 + void
386   dcleanup(lvl)           /* clear definitions (0->vars,1->output,2->consts) */
387   int  lvl;
388   {
# Line 336 | Line 397 | int  lvl;
397                      dremove(vp->name);
398                  else
399                      dclear(vp->name);
339 #ifdef  OUTCHAN
400      if (lvl >= 1) {
401          for (ep = outchan; ep != NULL; ep = ep->sibling)
402              epfree(ep);
403          outchan = NULL;
404      }
345 #endif
405   }
406  
407  
# Line 386 | Line 445 | char  *name;
445          return(vp);
446      }
447      vp = (VARDEF *)emalloc(sizeof(VARDEF));
389 #ifdef  FUNCTION
448      vp->lib = liblookup(name);
391 #else
392    vp->lib = NULL;
393 #endif
449      if (vp->lib == NULL)                /* if name not in library */
450          name = qualname(name, 0);       /* use fully qualified version */
451      hv = hash(name);
# Line 403 | Line 458 | char  *name;
458   }
459  
460  
461 < #ifdef  FUNCTION
461 > void
462   libupdate(fn)                   /* update library links */
463   char  *fn;
464   {
# Line 415 | Line 470 | char  *fn;
470              if (vp->lib != NULL || fn == NULL || !strcmp(fn, vp->name))
471                  vp->lib = liblookup(vp->name);
472   }
418 #endif
473  
474  
475 + void
476   varfree(ln)                             /* release link to variable */
477   register VARDEF  *ln;
478   {
# Line 446 | Line 501 | dfirst()                       /* return pointer to first definition */
501   {
502      htndx = 0;
503      htpos = NULL;
449 #ifdef  OUTCHAN
504      ochpos = outchan;
451 #endif
505      return(dnext());
506   }
507  
# Line 470 | Line 523 | dnext()                                /* return pointer to next definition */
523                  return(ep);
524          }
525      }
473 #ifdef  OUTCHAN
526      if ((ep = ochpos) != NULL)
527          ochpos = ep->sibling;
528      return(ep);
477 #else
478    return(NULL);
479 #endif
529   }
530  
531  
# Line 496 | Line 545 | char  *name;
545   }
546  
547  
548 + void
549   dpush(nm, ep)                   /* push on a definition */
550   char  *nm;
551   register EPNODE  *ep;
# Line 508 | Line 558 | register EPNODE         *ep;
558   }
559  
560  
561 < #ifdef  OUTCHAN
561 > void
562   addchan(sp)                     /* add an output channel assignment */
563   EPNODE  *sp;
564   {
# Line 536 | Line 586 | EPNODE *sp;
586      sp->sibling = NULL;
587  
588   }
539 #endif
589  
590  
591 + void
592   getstatement()                  /* get next statement */
593   {
594      register EPNODE  *ep;
# Line 549 | Line 599 | getstatement()                 /* get next statement */
599          scan();
600          return;
601      }
602 < #ifdef  OUTCHAN
603 <    if (nextc == '$') {         /* channel assignment */
602 >    if (esupport&E_OUTCHAN &&
603 >                nextc == '$') {         /* channel assignment */
604          ep = getchan();
605          addchan(ep);
606 <    } else
557 < #endif
558 <    {                           /* ordinary definition */
606 >    } else {                            /* ordinary definition */
607          ep = getdefn();
608          qname = qualname(dname(ep), 0);
609 < #ifdef  REDEFW
562 <        if ((vdef = varlookup(qname)) != NULL)
609 >        if (esupport&E_REDEFW && (vdef = varlookup(qname)) != NULL)
610              if (vdef->def != NULL && epcmp(ep, vdef->def)) {
611                  wputs(qname);
612                  if (vdef->def->type == ':')
613                      wputs(": redefined constant expression\n");
614                  else
615                      wputs(": redefined\n");
616 <            }
570 < #ifdef  FUNCTION
571 <            else if (ep->v.kid->type == FUNC && vdef->lib != NULL) {
616 >            } else if (ep->v.kid->type == FUNC && vdef->lib != NULL) {
617                  wputs(qname);
618                  wputs(": definition hides library function\n");
619              }
575 #endif
576 #endif
620          if (ep->type == ':')
621              dremove(qname);
622          else
# Line 603 | Line 646 | getdefn()                      /* A -> SYM = E1 */
646      ep1->type = SYM;
647      ep1->v.name = savestr(getname());
648  
649 < #ifdef  FUNCTION
607 <    if (nextc == '(') {
649 >    if (esupport&E_FUNCTION && nextc == '(') {
650          ep2 = newnode();
651          ep2->type = FUNC;
652          addekid(ep2, ep1);
# Line 623 | Line 665 | getdefn()                      /* A -> SYM = E1 */
665          scan();
666          curfunc = ep1;
667      }
626 #endif
668  
669      if (nextc != '=' && nextc != ':')
670          syntax("'=' or ':' expected");
# Line 634 | Line 675 | getdefn()                      /* A -> SYM = E1 */
675      addekid(ep2, ep1);
676      addekid(ep2, getE1());
677  
678 <    if (
638 < #ifdef  FUNCTION
639 <            ep1->type == SYM &&
640 < #endif
641 <            ep1->sibling->type != NUM) {
678 >    if (ep1->type == SYM && ep1->sibling->type != NUM) {
679          ep1 = newnode();
680          ep1->type = TICK;
681          ep1->v.tick = 0;
# Line 647 | Line 684 | getdefn()                      /* A -> SYM = E1 */
684          ep1->type = NUM;
685          addekid(ep2, ep1);
686      }
650
651 #ifdef  FUNCTION
687      curfunc = NULL;
653 #endif
688  
689      return(ep2);
690   }
691  
692  
659 #ifdef  OUTCHAN
693   EPNODE *
694   getchan()                       /* A -> $N = E1 */
695   {
# Line 681 | Line 714 | getchan()                      /* A -> $N = E1 */
714  
715      return(ep2);
716   }
684 #endif
717  
718  
719  
# Line 706 | Line 738 | EPNODE *d;
738      if (ep1->type == NUM)
739          return(ep1->v.num);                     /* return if number */
740      ep2 = ep1->sibling;                         /* check time */
741 <    if (ep2->v.tick == 0 || ep2->v.tick < eclock) {
742 <        ep2->v.tick = d->type == ':' ? ~0L : eclock;
741 >    if (eclock >= MAXCLOCK)
742 >        eclock = 1;                             /* wrap clock counter */
743 >    if (ep2->v.tick < MAXCLOCK &&
744 >                ep2->v.tick == 0 | ep2->v.tick != eclock) {
745 >        ep2->v.tick = d->type == ':' ? MAXCLOCK : eclock;
746          ep2 = ep2->sibling;
747          ep2->v.num = evalue(ep1);               /* needs new value */
748      } else

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines