summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPanu Matilainen <pmatilai@redhat.com>2019-08-15 09:36:10 +0300
committerPanu Matilainen <pmatilai@redhat.com>2019-08-28 12:16:52 +0300
commit5818867774a52c90d89a01eb75bbb07d65abf73d (patch)
treed27905c8774b7fd666def805e5ceb2c112599773
parentdc9d45b931e03365e620721a64a1ccc32f072de5 (diff)
downloadrpm-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.c44
-rw-r--r--build/rpmbuild_internal.h9
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