81 lines
2.5 KiB
Diff
81 lines
2.5 KiB
Diff
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.
|
|
|
|
Index: rpmdb/header.c
|
|
===================================================================
|
|
--- rpmdb/header.c.orig
|
|
+++ rpmdb/header.c
|
|
@@ -2984,8 +2984,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;
|
|
@@ -3226,6 +3230,7 @@ static char * singleSprintf(headerSprint
|
|
int_32 type;
|
|
int_32 count;
|
|
sprintfToken spft;
|
|
+ sprintfTag stag;
|
|
int condNumFormats;
|
|
size_t need;
|
|
|
|
@@ -3257,6 +3262,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;
|
|
@@ -3278,19 +3295,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@*/
|
|
}
|