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.3 by greg, Mon Aug 10 16:20:43 1992 UTC vs.
Revision 2.4 by greg, Mon Sep 21 12:01:44 1992 UTC

# Line 1 | Line 1
1 < /* Copyright (c) 1991 Regents of the University of California */
1 > /* Copyright (c) 1992 Regents of the University of California */
2  
3   #ifndef lint
4   static char SCCSid[] = "$SunId$ LBL";
# Line 30 | Line 30 | static char SCCSid[] = "$SunId$ LBL";
30  
31   #include  "calcomp.h"
32  
33 < #ifndef  NHASH
34 < #define  NHASH          521             /* hash size (a prime!) */
33 > #ifndef  NHASH
34 > #define  NHASH          521             /* hash size (a prime!) */
35   #endif
36  
37 < #define  newnode()      (EPNODE *)ecalloc(1, sizeof(EPNODE))
37 > #define  newnode()      (EPNODE *)ecalloc(1, sizeof(EPNODE))
38  
39 < extern char  *ecalloc(), *savestr(), *strcpy();
39 > extern char  *ecalloc(), *emalloc(), *savestr(), *strcpy();
40  
41   static int  hash();
42  
# Line 49 | Line 49 | static char  context[MAXWORD+1];       /* current context pa
49   static VARDEF  *hashtbl[NHASH];         /* definition list */
50   static int  htndx;                      /* index for */        
51   static VARDEF  *htpos;                  /* ...dfirst() and */
52 < #ifdef  OUTCHAN
52 > #ifdef  OUTCHAN
53   static EPNODE  *ochpos;                 /* ...dnext */
54   static EPNODE  *outchan;
55   #endif
56  
57 < #ifdef  FUNCTION
58 < EPNODE  *curfunc;
59 < #define  dname(ep)      ((ep)->v.kid->type == SYM ? \
57 > #ifdef  FUNCTION
58 > EPNODE  *curfunc;
59 > #define  dname(ep)      ((ep)->v.kid->type == SYM ? \
60                          (ep)->v.kid->v.name : \
61                          (ep)->v.kid->v.kid->v.name)
62   #else
63 < #define  dname(ep)      ((ep)->v.kid->v.name)
63 > #define  dname(ep)      ((ep)->v.kid->v.name)
64   #endif
65  
66  
# Line 105 | Line 105 | char  *vname;
105  
106   double
107   evariable(ep)                   /* evaluate a variable */
108 < EPNODE  *ep;
108 > EPNODE  *ep;
109   {
110      register VARDEF  *dp = ep->v.ln;
111  
# Line 116 | Line 116 | EPNODE  *ep;
116   varset(vname, assign, val)      /* set a variable's value */
117   char  *vname;
118   int  assign;
119 < double  val;
119 > double  val;
120   {
121      char  *qname;
122      register EPNODE  *ep1, *ep2;
# Line 215 | Line 215 | qualname(nam, lvl)             /* get qualified name */
215   register char  *nam;
216   int  lvl;
217   {
218 <    static char  nambuf[MAXWORD+1];
218 >    static char  nambuf[MAXWORD+1];
219      register char  *cp = nambuf, *cpp;
220                                  /* check for explicit local */
221      if (*nam == CNTXMARK)
# Line 265 | Line 265 | register char  *qn;
265   }
266  
267  
268 < #ifdef  OUTCHAN
268 > #ifdef  OUTCHAN
269   chanout(cs)                     /* set output channels */
270   int  (*cs)();
271   {
# Line 292 | Line 292 | int  lvl;
292                      dremove(vp->name);
293                  else
294                      dclear(vp->name);
295 < #ifdef  OUTCHAN
295 > #ifdef  OUTCHAN
296      if (lvl >= 1) {
297          for (ep = outchan; ep != NULL; ep = ep->sibling)
298              epfree(ep);
# Line 309 | Line 309 | char  *name;
309      register VARDEF  *vp;
310      
311      if ((vp = varlookup(name)) == NULL)
312 <        return(NULL);
312 >        return(NULL);
313      return(vp->def);
314   }
315  
# Line 318 | Line 318 | VARDEF *
318   varlookup(name)                 /* look up a variable */
319   char  *name;
320   {
321 <    int  lvl = 0;
321 >    int  lvl = 0;
322      register char  *qname;
323      register VARDEF  *vp;
324 <                                /* find most qualified match */
324 >                                /* find most qualified match */
325      while ((qname = qualname(name, lvl++)) != NULL)
326          for (vp = hashtbl[hash(qname)]; vp != NULL; vp = vp->next)
327              if (!strcmp(vp->name, qname))
# Line 335 | Line 335 | varinsert(name)                        /* get a link to a variable */
335   char  *name;
336   {
337      register VARDEF  *vp;
338 <    int  hv;
338 >    int  hv;
339      
340      if ((vp = varlookup(name)) != NULL) {
341          vp->nlinks++;
342          return(vp);
343      }
344      vp = (VARDEF *)emalloc(sizeof(VARDEF));
345 < #ifdef  FUNCTION
345 > #ifdef  FUNCTION
346      vp->lib = liblookup(name);
347   #else
348      vp->lib = NULL;
# Line 359 | Line 359 | char  *name;
359   }
360  
361  
362 < #ifdef  FUNCTION
362 > #ifdef  FUNCTION
363   libupdate(fn)                   /* update library links */
364   char  *fn;
365   {
# Line 375 | Line 375 | char  *fn;
375  
376  
377   varfree(ln)                             /* release link to variable */
378 < register VARDEF  *ln;
378 > register VARDEF  *ln;
379   {
380      register VARDEF  *vp;
381 <    int  hv;
381 >    int  hv;
382  
383      if (--ln->nlinks > 0)
384 <        return;                         /* still active */
384 >        return;                         /* still active */
385  
386      hv = hash(ln->name);
387      vp = hashtbl[hv];
388      if (vp == ln)
389 <        hashtbl[hv] = vp->next;
389 >        hashtbl[hv] = vp->next;
390      else {
391 <        while (vp->next != ln)          /* must be in list */
392 <                vp = vp->next;
393 <        vp->next = ln->next;
391 >        while (vp->next != ln)          /* must be in list */
392 >                vp = vp->next;
393 >        vp->next = ln->next;
394      }
395      freestr(ln->name);
396      efree((char *)ln);
# Line 402 | Line 402 | dfirst()                       /* return pointer to first definition */
402   {
403      htndx = 0;
404      htpos = NULL;
405 < #ifdef  OUTCHAN
405 > #ifdef  OUTCHAN
406      ochpos = outchan;
407   #endif
408      return(dnext());
# Line 416 | Line 416 | dnext()                                /* return pointer to next definition */
416      register char  *nm;
417  
418      while (htndx < NHASH) {
419 <        if (htpos == NULL)
420 <                htpos = hashtbl[htndx++];
421 <        while (htpos != NULL) {
422 <            ep = htpos->def;
419 >        if (htpos == NULL)
420 >                htpos = hashtbl[htndx++];
421 >        while (htpos != NULL) {
422 >            ep = htpos->def;
423              nm = htpos->name;
424 <            htpos = htpos->next;
425 <            if (ep != NULL && incontext(nm))
426 <                return(ep);
427 <        }
424 >            htpos = htpos->next;
425 >            if (ep != NULL && incontext(nm))
426 >                return(ep);
427 >        }
428      }
429 < #ifdef  OUTCHAN
429 > #ifdef  OUTCHAN
430      if ((ep = ochpos) != NULL)
431 <        ochpos = ep->sibling;
431 >        ochpos = ep->sibling;
432      return(ep);
433   #else
434      return(NULL);
# Line 444 | Line 444 | char  *name;
444      register EPNODE  *dp;
445      
446      if ((vp = varlookup(name)) == NULL || vp->def == NULL)
447 <        return(NULL);
447 >        return(NULL);
448      dp = vp->def;
449      vp->def = dp->sibling;
450      varfree(vp);
# Line 454 | Line 454 | char  *name;
454  
455   dpush(nm, ep)                   /* push on a definition */
456   char  *nm;
457 < register EPNODE  *ep;
457 > register EPNODE  *ep;
458   {
459      register VARDEF  *vp;
460  
# Line 464 | Line 464 | register EPNODE  *ep;
464   }
465  
466  
467 < #ifdef  OUTCHAN
467 > #ifdef  OUTCHAN
468   addchan(sp)                     /* add an output channel assignment */
469 < EPNODE  *sp;
469 > EPNODE  *sp;
470   {
471 <    int  ch = sp->v.kid->v.chan;
471 >    int  ch = sp->v.kid->v.chan;
472      register EPNODE  *ep, *epl;
473  
474      for (epl = NULL, ep = outchan; ep != NULL; epl = ep, ep = ep->sibling)
# Line 505 | Line 505 | getstatement()                 /* get next statement */
505          scan();
506          return;
507      }
508 < #ifdef  OUTCHAN
508 > #ifdef  OUTCHAN
509      if (nextc == '$') {         /* channel assignment */
510          ep = getchan();
511          addchan(ep);
# Line 514 | Line 514 | getstatement()                 /* get next statement */
514      {                           /* ordinary definition */
515          ep = getdefn();
516          qname = qualname(dname(ep), 0);
517 < #ifdef  REDEFW
517 > #ifdef  REDEFW
518          if ((vdef = varlookup(qname)) != NULL)
519              if (vdef->def != NULL) {
520                  wputs(qname);
# Line 523 | Line 523 | getstatement()                 /* get next statement */
523                  else
524                      wputs(": redefined\n");
525              }
526 < #ifdef  FUNCTION
526 > #ifdef  FUNCTION
527              else if (ep->v.kid->type == FUNC && vdef->lib != NULL) {
528                  wputs(qname);
529                  wputs(": definition hides library function\n");
# Line 547 | Line 547 | getstatement()                 /* get next statement */
547   EPNODE *
548   getdefn()                       /* A -> SYM = E1 */
549                                  /*      SYM : E1 */
550 <                                /*      FUNC(SYM,..) = E1 */
550 >                                /*      FUNC(SYM,..) = E1 */
551                                  /*      FUNC(SYM,..) : E1 */
552   {
553      register EPNODE  *ep1, *ep2;
# Line 559 | Line 559 | getdefn()                      /* A -> SYM = E1 */
559      ep1->type = SYM;
560      ep1->v.name = savestr(getname());
561  
562 < #ifdef  FUNCTION
562 > #ifdef  FUNCTION
563      if (nextc == '(') {
564          ep2 = newnode();
565          ep2->type = FUNC;
# Line 592 | Line 592 | getdefn()                      /* A -> SYM = E1 */
592      addekid(ep2, getE1());
593  
594      if (
595 < #ifdef  FUNCTION
596 <            ep1->type == SYM &&
595 > #ifdef  FUNCTION
596 >            ep1->type == SYM &&
597   #endif
598              ep1->sibling->type != NUM) {
599          ep1 = newnode();
# Line 609 | Line 609 | getdefn()                      /* A -> SYM = E1 */
609   }
610  
611  
612 < #ifdef  OUTCHAN
612 > #ifdef  OUTCHAN
613   EPNODE *
614   getchan()                       /* A -> $N = E1 */
615   {
# Line 646 | Line 646 | getchan()                      /* A -> $N = E1 */
646   static double
647   dvalue(name, d)                 /* evaluate a variable */
648   char  *name;
649 < EPNODE  *d;
649 > EPNODE  *d;
650   {
651      register EPNODE  *ep1, *ep2;
652      

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines