diff options
Diffstat (limited to 'recipes/rpm/files/extcond.patch')
-rw-r--r-- | recipes/rpm/files/extcond.patch | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/recipes/rpm/files/extcond.patch b/recipes/rpm/files/extcond.patch new file mode 100644 index 0000000000..6963b8606c --- /dev/null +++ b/recipes/rpm/files/extcond.patch @@ -0,0 +1,78 @@ +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. + +--- ./rpmdb/header.c.orig 2005-06-06 23:33:54.000000000 +0000 ++++ ./rpmdb/header.c 2006-03-17 18:08:02.000000000 +0000 +@@ -2980,8 +2980,12 @@ static int parseExpression(headerSprintf + + *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; +@@ -3239,6 +3243,7 @@ static char * singleSprintf(headerSprint + int_32 type; + int_32 count; + sprintfToken spft; ++ sprintfTag stag; + int condNumFormats; + size_t need; + +@@ -3270,6 +3275,18 @@ static char * singleSprintf(headerSprint + if (token->u.cond.tag.ext || 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; +@@ -3291,19 +3308,22 @@ static char * singleSprintf(headerSprint + spft = token->u.array.format; + for (i = 0; i < token->u.array.numTokens; i++, spft++) + { +- if (spft->type != PTOK_TAG || +- spft->u.tag.arrayCount || +- 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->arrayCount || stag->justOne) ++ continue; + +- if (spft->u.tag.ext) { ++ if (stag->ext) { + /*@-boundswrite@*/ +- if (getExtension(hsa, spft->u.tag.ext, &type, NULL, &count, +- hsa->ec + spft->u.tag.extNum)) ++ if (getExtension(hsa, stag->ext, &type, NULL, &count, ++ hsa->ec + stag->extNum)) + continue; + /*@=boundswrite@*/ + } else { + /*@-boundswrite@*/ +- if (!headerGetEntry(hsa->h, spft->u.tag.tag, &type, NULL, &count)) ++ if (!headerGetEntry(hsa->h, stag->tag, &type, NULL, &count)) + continue; + /*@=boundswrite@*/ + } |