--- ray/src/common/caldefn.c 1991/08/08 12:12:16 1.14 +++ ray/src/common/caldefn.c 1991/08/09 08:27:56 1.17 @@ -218,31 +218,35 @@ register char *nam; int lvl; { static char nambuf[MAXWORD]; - register char *cp = nambuf, *cpp = context; - /* check for repeat call */ - if (nam == nambuf) - return(lvl > 0 ? NULL : nambuf); + register char *cp = nambuf, *cpp; + /* check for explicit local */ + if (*nam == CNTXMARK) + if (lvl > 0) /* only action is to refuse search */ + return(NULL); + else + nam++; + else if (nam == nambuf) /* check for repeat call */ + return(lvl > 0 ? NULL : nam); /* copy name to static buffer */ while (*nam) { if (cp >= nambuf+MAXWORD-1) goto toolong; - if ((*cp++ = *nam++) == CNTXMARK) - cpp = NULL; /* flag a qualified name */ + *cp++ = *nam++; } - if (cpp == NULL) { + /* check for explicit global */ + if (cp > nambuf && cp[-1] == CNTXMARK) { if (lvl > 0) - return(NULL); /* no higher level */ - if (cp[-1] == CNTXMARK) { - cp--; cpp = context; /* current context explicitly */ - } else - cpp = ""; /* else fully qualified */ - } else /* else skip the requested levels */ - while (lvl-- > 0) { - if (!*cpp) - return(NULL); /* return NULL if past global level */ - while (*++cpp && *cpp != CNTXMARK) - ; - } + return(NULL); + *--cp = '\0'; + return(nambuf); /* already qualified */ + } + cpp = context; /* else skip the requested levels */ + while (lvl-- > 0) { + if (!*cpp) + return(NULL); /* return NULL if past global level */ + while (*++cpp && *cpp != CNTXMARK) + ; + } while (*cpp) { /* copy context to static buffer */ if (cp >= nambuf+MAXWORD-1) goto toolong; @@ -337,19 +341,26 @@ varinsert(name) /* get a link to a variable */ char *name; { register VARDEF *vp; + LIBR *libp; int hv; if ((vp = varlookup(name)) != NULL) { vp->nlinks++; return(vp); } - name = qualname(name, 0); /* use fully qualified name */ +#ifdef FUNCTION + libp = liblookup(name); +#else + libp = NULL; +#endif + if (libp == NULL) /* if name not in library */ + name = qualname(name, 0); /* use fully qualified version */ hv = hash(name); vp = (VARDEF *)emalloc(sizeof(VARDEF)); vp->name = savestr(name); vp->nlinks = 1; vp->def = NULL; - vp->lib = NULL; + vp->lib = libp; vp->next = hashtbl[hv]; hashtbl[hv] = vp; return(vp); @@ -479,7 +490,7 @@ getstatement() /* get next statement */ { register EPNODE *ep; char *qname; - EPNODE *lastdef; + register VARDEF *vdef; if (nextc == ';') { /* empty statement */ scan(); @@ -495,18 +506,19 @@ getstatement() /* get next statement */ ep = getdefn(); qname = qualname(dname(ep), 0); #ifdef REDEFW - if ((lastdef = dlookup(qname)) != NULL) { - wputs(qname); - if (lastdef->type == ':') - wputs(": redefined constant expression\n"); - else - wputs(": redefined\n"); - } + if ((vdef = varlookup(qname)) != NULL) + if (vdef->def != NULL) { + wputs(qname); + if (vdef->def->type == ':') + wputs(": redefined constant expression\n"); + else + wputs(": redefined\n"); + } #ifdef FUNCTION - else if (ep->v.kid->type == FUNC && liblookup(qname) != NULL) { - wputs(qname); - wputs(": definition hides library function\n"); - } + else if (ep->v.kid->type == FUNC && vdef->lib != NULL) { + wputs(qname); + wputs(": definition hides library function\n"); + } #endif #endif if (ep->type == ':')