diff options
author | Panu Matilainen <pmatilai@redhat.com> | 2019-08-15 09:36:10 +0300 |
---|---|---|
committer | Panu Matilainen <pmatilai@redhat.com> | 2019-08-28 12:16:52 +0300 |
commit | 5818867774a52c90d89a01eb75bbb07d65abf73d (patch) | |
tree | d27905c8774b7fd666def805e5ceb2c112599773 | |
parent | dc9d45b931e03365e620721a64a1ccc32f072de5 (diff) | |
download | rpm-5818867774a52c90d89a01eb75bbb07d65abf73d.tar.gz |
Resurrect parseExpressionString()
This essentially reverts commit 398df91274be4e6a9fae0cbbc59f95f6e490ed0f,
with a few changes to account for other changes that happened in the
meanwhile and establish a single point of return.
(cherry picked from commit 8936960d7f15e728b60fa1ea73b0d8a6eff97ad6)
-rw-r--r-- | build/expression.c | 44 | ||||
-rw-r--r-- | build/rpmbuild_internal.h | 9 |
2 files changed, 53 insertions, 0 deletions
diff --git a/build/expression.c b/build/expression.c index f0d4dcf5c..4e2e79e46 100644 --- a/build/expression.c +++ b/build/expression.c @@ -714,3 +714,47 @@ exit: valueFree(v); return result; } + +char * parseExpressionString(const char *expr) +{ + struct _parseState state; + char *result = NULL; + Value v; + + DEBUG(printf("parseExprString(?, '%s')\n", expr)); + + /* Initialize the expression parser state. */ + state.p = state.str = xstrdup(expr); + state.nextToken = 0; + state.tokenValue = NULL; + (void) rdToken(&state); + + /* Parse the expression. */ + v = doLogical(&state); + if (!v) + goto exit; + + /* If the next token is not TOK_EOF, we have a syntax error. */ + if (state.nextToken != TOK_EOF) { + rpmlog(RPMLOG_ERR, _("syntax error in expression\n")); + goto exit; + } + + DEBUG(valueDump("parseExprString:", v, stdout)); + + switch (v->type) { + case VALUE_TYPE_INTEGER: { + rasprintf(&result, "%d", v->data.i); + } break; + case VALUE_TYPE_STRING: + result = xstrdup(v->data.s); + break; + default: + break; + } + +exit: + state.str = _free(state.str); + valueFree(v); + return result; +} diff --git a/build/rpmbuild_internal.h b/build/rpmbuild_internal.h index f3c8b5658..04901596a 100644 --- a/build/rpmbuild_internal.h +++ b/build/rpmbuild_internal.h @@ -410,6 +410,15 @@ RPM_GNUC_INTERNAL int parseExpressionBoolean(const char * expr); /** \ingroup rpmbuild + * Evaluate string expression. + * @param expr expression to parse + * @return + */ +RPM_GNUC_INTERNAL +char * parseExpressionString(const char * expr); + + +/** \ingroup rpmbuild * Run a build script, assembled from spec file scriptlet section. * * @param spec spec file control structure |