/** * Parse (and execute) macro undefinition. * @param mc macro context * @param se macro name to undefine * @param slen length of se argument * @return address to continue parsing */ static const char * doUndefine(rpmMacroContext mc, const char * se, size_t slen) { const char *s = se; char *buf = xmalloc(slen + 1); char *n = buf, *ne = n; int c; COPYNAME(ne, s, c); /* Move scan over body */ while (iseol(*s)) s++; se = s; /* Names must start with alphabetic or _ and be at least 3 chars */ if (!((c = *n) && (risalpha(c) || c == '_') && (ne - n) > 2)) { rpmlog(RPMLOG_ERR, _("Macro %%%s has illegal name (%%undefine)\n"), n); goto exit; } popMacro(mc, n); exit: _free(buf); return se; }
void MacroExpander::getToken(Token *token) { if (mReserveToken.get()) { *token = *mReserveToken; mReserveToken.reset(); return; } // First pop all empty macro contexts. while (!mContextStack.empty() && mContextStack.back()->empty()) { popMacro(); } if (!mContextStack.empty()) { *token = mContextStack.back()->get(); } else { ASSERT(mTotalTokensInContexts == 0); mLexer->lex(token); } }
void delMacro(rpmMacroContext mc, const char * n) { rpmMacroEntry * mep; if (mc == NULL) mc = rpmGlobalMacroContext; /* If name exists, pop entry */ if ((mep = findEntry(mc, n, 0)) != NULL) { popMacro(mep); /* If deleted name, sort macro table */ if (!(mep && *mep)) sortMacroTable(mc); } }
/** * Free parsed arguments for parameterized macro. * @param mb macro expansion state */ static void freeArgs(MacroBuf mb) { rpmMacroContext mc = mb->mc; int ndeleted = 0; int i; if (mc == NULL || mc->macroTable == NULL) return; /* Delete dynamic macro definitions */ for (i = 0; i < mc->firstFree; i++) { rpmMacroEntry *mep, me; int skiptest = 0; mep = &mc->macroTable[i]; me = *mep; if (me == NULL) /* XXX this should never happen */ continue; if (me->level < mb->depth) continue; if (strlen(me->name) == 1 && strchr("#*0", *me->name)) { if (*me->name == '*' && me->used > 0) skiptest = 1; /* XXX skip test for %# %* %0 */ } else if (!skiptest && me->used <= 0) { #if NOTYET rpmlog(RPMLOG_ERR, _("Macro %%%s (%s) was not used below level %d\n"), me->name, me->body, me->level); #endif } popMacro(mep); if (!(mep && *mep)) ndeleted++; } /* If any deleted macros, sort macro table */ if (ndeleted) sortMacroTable(mc); }