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.14 by greg, Thu Aug 8 12:12:16 1991 UTC vs.
Revision 1.19 by greg, Wed Aug 14 15:50:38 1991 UTC

# Line 42 | Line 42 | static double  dvalue();
42  
43   long  eclock = -1;                      /* value storage timer */
44  
45 < static char  context[MAXWORD];          /* current context path */
45 > static char  context[MAXWORD+1];        /* current context path */
46  
47   static VARDEF  *hashtbl[NHASH];         /* definition list */
48   static int  htndx;                      /* index for */        
# Line 195 | Line 195 | register char  *ctx;
195      if (*ctx != CNTXMARK)
196          *cpp++ = CNTXMARK;              /* make sure there's a mark */
197      do {
198 <        if (cpp >= context+MAXWORD-1) {
199 <            *cpp = '\0';
200 <            wputs(context);
201 <            wputs(": context path too long\n");
202 <            return(NULL);
203 <        }
198 >        if (cpp >= context+MAXWORD)
199 >            break;                      /* just copy what we can */
200          if (isid(*ctx))
201              *cpp++ = *ctx++;
202          else {
# Line 217 | Line 213 | qualname(nam, lvl)             /* get qualified name */
213   register char  *nam;
214   int  lvl;
215   {
216 <    static char  nambuf[MAXWORD];
217 <    register char  *cp = nambuf, *cpp = context;
218 <                                /* check for repeat call */
219 <    if (nam == nambuf)
220 <        return(lvl > 0 ? NULL : nambuf);
216 >    static char  nambuf[MAXWORD+1];
217 >    register char  *cp = nambuf, *cpp;
218 >                                /* check for explicit local */
219 >    if (*nam == CNTXMARK)
220 >        if (lvl > 0)            /* only action is to refuse search */
221 >            return(NULL);
222 >        else
223 >            nam++;
224 >    else if (nam == nambuf)     /* check for repeat call */
225 >        return(lvl > 0 ? NULL : nam);
226                                  /* copy name to static buffer */
227      while (*nam) {
228 <        if (cp >= nambuf+MAXWORD-1)
228 >        if (cp >= nambuf+MAXWORD)
229                  goto toolong;
230 <        if ((*cp++ = *nam++) == CNTXMARK)
230 <            cpp = NULL;         /* flag a qualified name */
230 >        *cp++ = *nam++;
231      }
232 <    if (cpp == NULL) {
232 >                                /* check for explicit global */
233 >    if (cp > nambuf && cp[-1] == CNTXMARK) {
234          if (lvl > 0)
235 <            return(NULL);               /* no higher level */
236 <        if (cp[-1] == CNTXMARK) {
237 <            cp--; cpp = context;        /* current context explicitly */
238 <        } else
239 <            cpp = "";                   /* else fully qualified */
240 <    } else                      /* else skip the requested levels */
241 <        while (lvl-- > 0) {
242 <            if (!*cpp)
243 <                return(NULL);   /* return NULL if past global level */
244 <            while (*++cpp && *cpp != CNTXMARK)
245 <                ;
245 <        }
235 >            return(NULL);
236 >        *--cp = '\0';
237 >        return(nambuf);         /* already qualified */
238 >    }
239 >    cpp = context;              /* else skip the requested levels */
240 >    while (lvl-- > 0) {
241 >        if (!*cpp)
242 >            return(NULL);       /* return NULL if past global level */
243 >        while (*++cpp && *cpp != CNTXMARK)
244 >            ;
245 >    }
246      while (*cpp) {              /* copy context to static buffer */
247 <        if (cp >= nambuf+MAXWORD-1)
247 >        if (cp >= nambuf+MAXWORD)
248              goto toolong;
249          *cp++ = *cpp++;
250      }
251    *cp = '\0';
252    return(nambuf);             /* return qualified name */
251   toolong:
252      *cp = '\0';
253 <    eputs(nambuf);
256 <    eputs(": name too long\n");
257 <    quit(1);
253 >    return(nambuf);             /* return qualified name */
254   }
255  
256  
# Line 262 | Line 258 | incontext(qn)                  /* is qualified name in current contex
258   register char  *qn;
259   {
260      while (*qn && *qn != CNTXMARK)      /* find context mark */
261 <        ;
261 >        qn++;
262      return(!strcmp(qn, context));
263   }
264  
# Line 337 | Line 333 | varinsert(name)                        /* get a link to a variable */
333   char  *name;
334   {
335      register VARDEF  *vp;
336 +    LIBR  *libp;
337      int  hv;
338      
339      if ((vp = varlookup(name)) != NULL) {
340          vp->nlinks++;
341          return(vp);
342      }
343 <    name = qualname(name, 0);           /* use fully qualified name */
343 > #ifdef  FUNCTION
344 >    libp = liblookup(name);
345 > #else
346 >    libp = NULL;
347 > #endif
348 >    if (libp == NULL)                   /* if name not in library */
349 >        name = qualname(name, 0);       /* use fully qualified version */
350      hv = hash(name);
351      vp = (VARDEF *)emalloc(sizeof(VARDEF));
352      vp->name = savestr(name);
353      vp->nlinks = 1;
354      vp->def = NULL;
355 <    vp->lib = NULL;
355 >    vp->lib = libp;
356      vp->next = hashtbl[hv];
357      hashtbl[hv] = vp;
358      return(vp);
# Line 395 | Line 398 | EPNODE *
398   dnext()                         /* return pointer to next definition */
399   {
400      register EPNODE  *ep;
401 +    register char  *nm;
402  
403      while (htndx < NHASH) {
404          if (htpos == NULL)
405                  htpos = hashtbl[htndx++];
406          while (htpos != NULL) {
407              ep = htpos->def;
408 +            nm = htpos->name;
409              htpos = htpos->next;
410 <            if (ep != NULL)
410 >            if (ep != NULL && incontext(nm))
411                  return(ep);
412          }
413      }
# Line 479 | Line 484 | getstatement()                 /* get next statement */
484   {
485      register EPNODE  *ep;
486      char  *qname;
487 <    EPNODE  *lastdef;
487 >    register VARDEF  *vdef;
488  
489      if (nextc == ';') {         /* empty statement */
490          scan();
# Line 495 | Line 500 | getstatement()                 /* get next statement */
500          ep = getdefn();
501          qname = qualname(dname(ep), 0);
502   #ifdef  REDEFW
503 <        if ((lastdef = dlookup(qname)) != NULL) {
504 <            wputs(qname);
505 <            if (lastdef->type == ':')
506 <                wputs(": redefined constant expression\n");
507 <            else
508 <                wputs(": redefined\n");
509 <        }
503 >        if ((vdef = varlookup(qname)) != NULL)
504 >            if (vdef->def != NULL) {
505 >                wputs(qname);
506 >                if (vdef->def->type == ':')
507 >                    wputs(": redefined constant expression\n");
508 >                else
509 >                    wputs(": redefined\n");
510 >            }
511   #ifdef  FUNCTION
512 <        else if (ep->v.kid->type == FUNC && liblookup(qname) != NULL) {
513 <            wputs(qname);
514 <            wputs(": definition hides library function\n");
515 <        }
512 >            else if (ep->v.kid->type == FUNC && vdef->lib != NULL) {
513 >                wputs(qname);
514 >                wputs(": definition hides library function\n");
515 >            }
516   #endif
517   #endif
518          if (ep->type == ':')
# Line 531 | Line 537 | getdefn()                      /* A -> SYM = E1 */
537   {
538      register EPNODE  *ep1, *ep2;
539  
540 <    if (!isalpha(nextc))
540 >    if (!isalpha(nextc) && nextc != CNTXMARK)
541          syntax("illegal variable name");
542  
543      ep1 = newnode();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines