Skip to content

Commit

Permalink
Remove common code from expandMacro() and expandThisMacro()
Browse files Browse the repository at this point in the history
Add a mbStartExpansion() function that increases the expansion
depth and stashes some values into a MacroExpansionData area.
Add a mbFinishExpansion() function that decreases the depth again,
restores the values and optionally prints the expansion result.
  • Loading branch information
mlschroe committed Oct 27, 2020
1 parent 91d6061 commit 6c96d96
Showing 1 changed file with 42 additions and 41 deletions.
83 changes: 42 additions & 41 deletions rpmio/macro.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,15 @@ typedef struct MacroBuf_s {
rpmMacroContext mc;
} * MacroBuf;

/**
* Expansion data for a scoping level
*/
typedef struct MacroExpansionData_s {
size_t tpos;
int macro_trace;
int expand_trace;
} MacroExpansionData;

#define _MAX_MACRO_DEPTH 64
static int max_macro_depth = _MAX_MACRO_DEPTH;

Expand Down Expand Up @@ -454,6 +463,31 @@ static MacroBuf mbCreate(rpmMacroContext mc, int flags)
return mb;
}

static int mbStartExpansion(MacroBuf mb, MacroExpansionData *med)
{
if (++mb->depth > max_macro_depth) {
mbErr(mb, 1,
_("Too many levels of recursion in macro expansion. It is likely caused by recursive macro declaration.\n"));
mb->depth--;
mb->expand_trace = 1;
return -1;
}
med->tpos = mb->tpos; /* save expansion pointer for printExpand */
med->macro_trace = mb->macro_trace;
med->expand_trace = mb->expand_trace;
return 0;
}

static void mbFinishExpansion(MacroBuf mb, MacroExpansionData *med)
{
mb->buf[mb->tpos] = '\0';
mb->depth--;
if (mb->error != 0 || mb->expand_trace)
printExpansion(mb, mb->buf + med->tpos, mb->buf + mb->tpos);
mb->macro_trace = med->macro_trace;
mb->expand_trace = med->expand_trace;
}

static void mbAllocBuf(MacroBuf mb, size_t slen)
{
size_t blen = MACROBUFSIZ + slen;
Expand Down Expand Up @@ -1402,14 +1436,13 @@ expandMacro(MacroBuf mb, const char *src, size_t slen)
const char *s = src, *se;
const char *f, *fe;
const char *g, *ge;
size_t fn, gn, tpos;
size_t fn, gn;
int c;
int negate;
const char * lastc;
int chkexist;
char *source = NULL;
int store_macro_trace;
int store_expand_trace;
MacroExpansionData med;

/*
* Always make a (terminated) copy of the source string.
Expand All @@ -1426,17 +1459,8 @@ expandMacro(MacroBuf mb, const char *src, size_t slen)

if (mb->buf == NULL)
mbAllocBuf(mb, slen);
tpos = mb->tpos; /* save expansion pointer for printExpand */
store_macro_trace = mb->macro_trace;
store_expand_trace = mb->expand_trace;

if (++mb->depth > max_macro_depth) {
mbErr(mb, 1,
_("Too many levels of recursion in macro expansion. It is likely caused by recursive macro declaration.\n"));
mb->depth--;
mb->expand_trace = 1;
if (mbStartExpansion(mb, &med) != 0)
goto exit;
}

while (mb->error == 0 && (c = *s) != '\0') {
const struct builtins_s* builtin = NULL;
Expand All @@ -1459,7 +1483,7 @@ expandMacro(MacroBuf mb, const char *src, size_t slen)
f = fe = NULL;
g = ge = NULL;
if (mb->depth > 1) /* XXX full expansion for outermost level */
tpos = mb->tpos; /* save expansion pointer for printExpand */
med.tpos = mb->tpos; /* save expansion pointer for printExpand */
lastc = NULL;
if ((se = findMacroEnd(s)) == NULL) {
mbErr(mb, 1, _("Unterminated %c: %s\n"), (char)*s, s);
Expand Down Expand Up @@ -1592,12 +1616,7 @@ expandMacro(MacroBuf mb, const char *src, size_t slen)
s = se;
}

mb->buf[mb->tpos] = '\0';
mb->depth--;
if (mb->error != 0 || mb->expand_trace)
printExpansion(mb, mb->buf+tpos, mb->buf+mb->tpos);
mb->macro_trace = store_macro_trace;
mb->expand_trace = store_expand_trace;
mbFinishExpansion(mb, &med);
exit:
_free(source);
return mb->error;
Expand All @@ -1614,21 +1633,13 @@ expandMacro(MacroBuf mb, const char *src, size_t slen)
static int
expandThisMacro(MacroBuf mb, rpmMacroEntry me, ARGV_const_t args, int flags)
{
int store_macro_trace;
int store_expand_trace;
size_t tpos;
MacroExpansionData med;
ARGV_t optargs = NULL;

if (mb->buf == NULL)
mbAllocBuf(mb, 0);

if (++mb->depth > max_macro_depth) {
mbErr(mb, 1,
_("Too many levels of recursion in macro expansion. It is likely caused by recursive macro declaration.\n"));
mb->depth--;
mb->expand_trace = 1;
if (mbStartExpansion(mb, &med) != 0)
goto exit;
}

if (mb->macro_trace) {
ARGV_const_t av = args;
Expand All @@ -1638,10 +1649,6 @@ expandThisMacro(MacroBuf mb, rpmMacroEntry me, ARGV_const_t args, int flags)
fprintf(stderr, "\n");
}

tpos = mb->tpos; /* save expansion pointer for printExpand */
store_macro_trace = mb->macro_trace;
store_expand_trace = mb->expand_trace;

/* prepare arguments for parametric macros */
if (me->opts) {
argvAdd(&optargs, me->name);
Expand All @@ -1662,13 +1669,7 @@ expandThisMacro(MacroBuf mb, rpmMacroEntry me, ARGV_const_t args, int flags)
if (optargs)
argvFree(optargs);

mb->buf[mb->tpos] = '\0';
mb->depth--;
if (mb->error != 0 || mb->expand_trace)
printExpansion(mb, mb->buf+tpos, mb->buf+mb->tpos);

mb->macro_trace = store_macro_trace;
mb->expand_trace = store_expand_trace;
mbFinishExpansion(mb, &med);
exit:
return mb->error;
}
Expand Down

0 comments on commit 6c96d96

Please sign in to comment.