--- ray/src/common/caldefn.c 2023/02/07 20:28:16 2.34 +++ ray/src/common/caldefn.c 2023/10/01 18:02:23 2.37 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: caldefn.c,v 2.34 2023/02/07 20:28:16 greg Exp $"; +static const char RCSid[] = "$Id: caldefn.c,v 2.37 2023/10/01 18:02:23 greg Exp $"; #endif /* * Store variable definitions. @@ -59,9 +59,6 @@ static EPNODE *ochpos; /* ...dnext */ static EPNODE *outchan; EPNODE *curfunc = NULL; -#define dname(ep) ((ep)->v.kid->type == SYM ? \ - (ep)->v.kid->v.name : \ - (ep)->v.kid->v.kid->v.name) void @@ -178,14 +175,14 @@ dclear( /* delete variable definitions of name */ char *name ) { - EPNODE *ep; + VARDEF *vp; + EPNODE *dp; - while ((ep = dpop(name)) != NULL) { - if (ep->type == ':') { - dpush(name, ep); /* don't clear constants */ - return; - } - epfree(ep); + while ((vp = varlookup(name)) != NULL && + (dp = vp->def) != NULL && dp->type == '=') { + vp->def = dp->sibling; + epfree(dp); + varfree(vp); } } @@ -295,12 +292,11 @@ qualname( /* get qualified name */ static char nambuf[RMAXWORD+1]; char *cp = nambuf, *cpp; /* check for explicit local */ - if (*nam == CNTXMARK) + if (*nam == CNTXMARK) { if (lvl > 0) /* only action is to refuse search */ return(NULL); - else - nam++; - else if (nam == nambuf) /* check for repeat call */ + nam++; + } else if (nam == nambuf) /* check for repeat call */ return(lvl > 0 ? NULL : nam); /* copy name to static buffer */ while (*nam) { @@ -322,7 +318,7 @@ qualname( /* get qualified name */ while (*++cpp && *cpp != CNTXMARK) ; } - while (*cpp) { /* copy context to static buffer */ + while (*cpp) { /* add remaining context to name */ if (cp >= nambuf+RMAXWORD) goto toolong; *cp++ = *cpp++; @@ -376,11 +372,13 @@ dcleanup( /* clear definitions (0->vars,1->output,2-> else dclear(vp->name); } - if (lvl >= 1) { - for (ep = outchan; ep != NULL; ep = ep->sibling) + if (lvl >= 1) + while (outchan != NULL) { + ep = outchan; + outchan = ep->sibling; + ep->sibling = NULL; epfree(ep); - outchan = NULL; - } + } } @@ -476,7 +474,7 @@ varfree( /* release link to variable */ vp->next = ln->next; } freestr(ln->name); - efree((char *)ln); + efree(ln); } @@ -592,7 +590,7 @@ getstatement(void) /* get next statement */ addchan(ep); } else { /* ordinary definition */ ep = getdefn(); - qname = qualname(dname(ep), 0); + qname = qualname(dfn_name(ep), 0); if (esupport&E_REDEFW && (vdef = varlookup(qname)) != NULL) { if (vdef->def != NULL && epcmp(ep, vdef->def)) { wputs(qname);