From 309fa3481a1b1860190e8a2ac078fd1b1946f39e Mon Sep 17 00:00:00 2001 From: Anas Nashif Date: Thu, 11 Oct 2012 12:34:48 -0700 Subject: [PATCH] Extended condition support This patch supports an extension in the condition evaluation. If the condition is a format and returns an nonempty string, it is assumed to be true. This mechanism is used by the weakdeps patch to filter the "RPMSENSE_STRONG" flag. --- lib/headerfmt.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/headerfmt.c b/lib/headerfmt.c index 9b3cc72..a865ee7 100644 --- a/lib/headerfmt.c +++ b/lib/headerfmt.c @@ -568,8 +568,12 @@ static int parseExpression(headerSprintfArgs hsa, sprintfToken token, *endPtr = chptr; + token->u.cond.tag.type = NULL; + token->u.cond.tag.format = ""; token->type = PTOK_COND; + if ((token->u.cond.tag.type = strchr(str, ':')) != 0) + *token->u.cond.tag.type++ = 0; (void) findTag(hsa, token, str); return 0; @@ -665,6 +669,7 @@ static char * singleSprintf(headerSprintfArgs hsa, sprintfToken token, int i, j, found; rpm_count_t count, numElements; sprintfToken spft; + sprintfTag stag; int condNumFormats; size_t need; @@ -695,6 +700,18 @@ static char * singleSprintf(headerSprintfArgs hsa, sprintfToken token, headerIsEntry(hsa->h, token->u.cond.tag.tag)) { spft = token->u.cond.ifFormat; condNumFormats = token->u.cond.numIfTokens; + if (token->u.cond.tag.fmt) { + /* check if format creates output */ + size_t vallen = hsa->vallen; + formatValue(hsa, &token->u.cond.tag, element); + if (hsa->vallen == vallen) { + spft = token->u.cond.elseFormat; + condNumFormats = token->u.cond.numElseTokens; + } else { + hsa->vallen = vallen; + hsa->val[hsa->vallen] = 0; + } + } } else { spft = token->u.cond.elseFormat; condNumFormats = token->u.cond.numElseTokens; @@ -718,10 +735,13 @@ static char * singleSprintf(headerSprintfArgs hsa, sprintfToken token, for (i = 0; i < token->u.array.numTokens; i++, spft++) { rpmtd td = NULL; - if (spft->type != PTOK_TAG || - spft->u.tag.justOne) continue; + if (spft->type != PTOK_TAG && spft->type != PTOK_COND) + continue; + stag = (spft->type == PTOK_COND ? &spft->u.cond.tag : &spft->u.tag); + if (stag->justOne) + continue; - if (!(td = getData(hsa, spft->u.tag.tag))) { + if (!(td = getData(hsa, stag->tag))) { continue; } -- 2.7.4