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 1.15 by greg, Thu Aug 8 12:28:30 1991 UTC vs.
Revision 2.2 by greg, Fri May 15 16:38:49 1992 UTC

# Line 38 | Line 38 | static char SCCSid[] = "$SunId$ LBL";
38  
39   extern char  *ecalloc(), *savestr(), *strcpy();
40  
41 + static int  hash();
42 +
43   static double  dvalue();
44  
45   long  eclock = -1;                      /* value storage timer */
46  
47 < static char  context[MAXWORD];          /* current context path */
47 > static char  context[MAXWORD+1];        /* current context path */
48  
49   static VARDEF  *hashtbl[NHASH];         /* definition list */
50   static int  htndx;                      /* index for */        
# Line 195 | Line 197 | register char  *ctx;
197      if (*ctx != CNTXMARK)
198          *cpp++ = CNTXMARK;              /* make sure there's a mark */
199      do {
200 <        if (cpp >= context+MAXWORD-1) {
201 <            *cpp = '\0';
200 <            wputs(context);
201 <            wputs(": context path too long\n");
202 <            return(NULL);
203 <        }
200 >        if (cpp >= context+MAXWORD)
201 >            break;                      /* just copy what we can */
202          if (isid(*ctx))
203              *cpp++ = *ctx++;
204          else {
# Line 217 | Line 215 | qualname(nam, lvl)             /* get qualified name */
215   register char  *nam;
216   int  lvl;
217   {
218 <    static char  nambuf[MAXWORD];
219 <    register char  *cp = nambuf, *cpp = context;
220 <                                /* check for explicit global */
218 >    static char  nambuf[MAXWORD+1];
219 >    register char  *cp = nambuf, *cpp;
220 >                                /* check for explicit local */
221      if (*nam == CNTXMARK)
222 <        return(lvl > 0 ? NULL : nam+1);
223 <                                /* check for repeat call */
224 <    if (nam == nambuf)
225 <        return(lvl > 0 ? NULL : nambuf);
222 >        if (lvl > 0)            /* only action is to refuse search */
223 >            return(NULL);
224 >        else
225 >            nam++;
226 >    else if (nam == nambuf)     /* check for repeat call */
227 >        return(lvl > 0 ? NULL : nam);
228                                  /* copy name to static buffer */
229      while (*nam) {
230 <        if (cp >= nambuf+MAXWORD-1)
230 >        if (cp >= nambuf+MAXWORD)
231                  goto toolong;
232 <        if ((*cp++ = *nam++) == CNTXMARK)
233 <            cpp = NULL;         /* flag a qualified name */
232 >        *cp++ = *nam++;
233      }
234 <    if (cpp == NULL) {
234 >                                /* check for explicit global */
235 >    if (cp > nambuf && cp[-1] == CNTXMARK) {
236          if (lvl > 0)
237 <            return(NULL);               /* no higher level */
238 <        if (cp[-1] == CNTXMARK) {
239 <            cp--; cpp = context;        /* current context explicitly */
240 <        } else
241 <            cpp = "";                   /* else fully qualified */
242 <    } else                      /* else skip the requested levels */
243 <        while (lvl-- > 0) {
244 <            if (!*cpp)
245 <                return(NULL);   /* return NULL if past global level */
246 <            while (*++cpp && *cpp != CNTXMARK)
247 <                ;
248 <        }
237 >            return(NULL);
238 >        *--cp = '\0';
239 >        return(nambuf);         /* already qualified */
240 >    }
241 >    cpp = context;              /* else skip the requested levels */
242 >    while (lvl-- > 0) {
243 >        if (!*cpp)
244 >            return(NULL);       /* return NULL if past global level */
245 >        while (*++cpp && *cpp != CNTXMARK)
246 >            ;
247 >    }
248      while (*cpp) {              /* copy context to static buffer */
249 <        if (cp >= nambuf+MAXWORD-1)
249 >        if (cp >= nambuf+MAXWORD)
250              goto toolong;
251          *cp++ = *cpp++;
252      }
254    *cp = '\0';
255    return(nambuf);             /* return qualified name */
253   toolong:
254      *cp = '\0';
255 <    eputs(nambuf);
259 <    eputs(": name too long\n");
260 <    quit(1);
255 >    return(nambuf);             /* return qualified name */
256   }
257  
258  
# Line 265 | Line 260 | incontext(qn)                  /* is qualified name in current contex
260   register char  *qn;
261   {
262      while (*qn && *qn != CNTXMARK)      /* find context mark */
263 <        ;
263 >        qn++;
264      return(!strcmp(qn, context));
265   }
266  
# Line 340 | Line 335 | varinsert(name)                        /* get a link to a variable */
335   char  *name;
336   {
337      register VARDEF  *vp;
338 +    register LIBR  *libp;
339      int  hv;
340      
341      if ((vp = varlookup(name)) != NULL) {
342          vp->nlinks++;
343          return(vp);
344      }
345 <    name = qualname(name, 0);           /* use fully qualified name */
345 > #ifdef  FUNCTION
346 >    libp = liblookup(name);
347 > #else
348 >    libp = NULL;
349 > #endif
350 >    if (libp == NULL)                   /* if name not in library */
351 >        name = qualname(name, 0);       /* use fully qualified version */
352      hv = hash(name);
353      vp = (VARDEF *)emalloc(sizeof(VARDEF));
354      vp->name = savestr(name);
355      vp->nlinks = 1;
356      vp->def = NULL;
357 <    vp->lib = NULL;
357 >    vp->lib = libp;
358      vp->next = hashtbl[hv];
359      hashtbl[hv] = vp;
360      return(vp);
361   }
362  
363  
364 + #ifdef  FUNCTION
365 + libupdate(fn)                   /* update library links */
366 + char  *fn;
367 + {
368 +    register int  i;
369 +    register VARDEF  *vp;
370 +                                        /* if fn is NULL then relink all */
371 +    for (i = 0; i < NHASH; i++)
372 +        for (vp = hashtbl[i]; vp != NULL; vp = vp->next)
373 +            if (vp->lib != NULL || fn == NULL || !strcmp(fn, vp->name))
374 +                vp->lib = liblookup(vp->name);
375 + }
376 + #endif
377 +
378 +
379   varfree(ln)                             /* release link to variable */
380   register VARDEF  *ln;
381   {
# Line 398 | Line 415 | EPNODE *
415   dnext()                         /* return pointer to next definition */
416   {
417      register EPNODE  *ep;
418 +    register char  *nm;
419  
420      while (htndx < NHASH) {
421          if (htpos == NULL)
422                  htpos = hashtbl[htndx++];
423          while (htpos != NULL) {
424              ep = htpos->def;
425 +            nm = htpos->name;
426              htpos = htpos->next;
427 <            if (ep != NULL)
427 >            if (ep != NULL && incontext(nm))
428                  return(ep);
429          }
430      }
# Line 482 | Line 501 | getstatement()                 /* get next statement */
501   {
502      register EPNODE  *ep;
503      char  *qname;
504 <    EPNODE  *lastdef;
504 >    register VARDEF  *vdef;
505  
506      if (nextc == ';') {         /* empty statement */
507          scan();
# Line 498 | Line 517 | getstatement()                 /* get next statement */
517          ep = getdefn();
518          qname = qualname(dname(ep), 0);
519   #ifdef  REDEFW
520 <        if ((lastdef = dlookup(qname)) != NULL) {
521 <            wputs(qname);
522 <            if (lastdef->type == ':')
523 <                wputs(": redefined constant expression\n");
524 <            else
525 <                wputs(": redefined\n");
526 <        }
520 >        if ((vdef = varlookup(qname)) != NULL)
521 >            if (vdef->def != NULL) {
522 >                wputs(qname);
523 >                if (vdef->def->type == ':')
524 >                    wputs(": redefined constant expression\n");
525 >                else
526 >                    wputs(": redefined\n");
527 >            }
528   #ifdef  FUNCTION
529 <        else if (ep->v.kid->type == FUNC && liblookup(qname) != NULL) {
530 <            wputs(qname);
531 <            wputs(": definition hides library function\n");
532 <        }
529 >            else if (ep->v.kid->type == FUNC && vdef->lib != NULL) {
530 >                wputs(qname);
531 >                wputs(": definition hides library function\n");
532 >            }
533   #endif
534   #endif
535          if (ep->type == ':')
# Line 534 | Line 554 | getdefn()                      /* A -> SYM = E1 */
554   {
555      register EPNODE  *ep1, *ep2;
556  
557 <    if (!isalpha(nextc))
557 >    if (!isalpha(nextc) && nextc != CNTXMARK)
558          syntax("illegal variable name");
559  
560      ep1 = newnode();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines