aboutsummaryrefslogtreecommitdiff
path: root/src/template.c
diff options
context:
space:
mode:
authorfrosty <gabriel@bwaaa.monster>2026-08-08 00:20:42 -0400
committerfrosty <gabriel@bwaaa.monster>2026-08-08 00:20:42 -0400
commit539447047caa6cc3046a1e5814c0bfa563e476df (patch)
treea53e45c3911e98f187f1ab0b9f9dc5ecb61d736a /src/template.c
parentcc04a6cada199649acb3c32fed9c99cb0134c57f (diff)
downloadbeaker-539447047caa6cc3046a1e5814c0bfa563e476df.tar.gz
fix: deduplicate condition comparison lookup
Diffstat (limited to 'src/template.c')
-rw-r--r--src/template.c63
1 files changed, 27 insertions, 36 deletions
diff --git a/src/template.c b/src/template.c
index 1c5f655..8365166 100644
--- a/src/template.c
+++ b/src/template.c
@@ -533,6 +533,28 @@ typedef struct {
bool negate;
} Condition;
+static const char *resolve_compare_value(const Condition *cond,
+ TemplateContext *ctx,
+ char compare_buf[MAX_VALUE_LEN]) {
+ const char *compare_value = cond->compare_value;
+ ContextVar *compare_var = find_context_var(ctx, cond->compare_value);
+
+ if (cond->compare_index >= 0) {
+ if (compare_var != NULL &&
+ compare_var->type == CONTEXT_TYPE_STRING_ARRAY &&
+ cond->compare_index < compare_var->value.string_array_data.count) {
+ compare_value =
+ compare_var->value.string_array_data.values[cond->compare_index];
+ }
+ } else if (compare_var != NULL && compare_var->type == CONTEXT_TYPE_STRING) {
+ strncpy(compare_buf, compare_var->value.string_val, MAX_VALUE_LEN - 1);
+ compare_buf[MAX_VALUE_LEN - 1] = '\0';
+ compare_value = compare_buf;
+ }
+
+ return compare_value;
+}
+
static bool evaluate_condition(const Condition *cond, TemplateContext *ctx) {
if (cond == NULL || cond->type == CONDITION_NONE) {
return false;
@@ -571,44 +593,13 @@ static bool evaluate_condition(const Condition *cond, TemplateContext *ctx) {
return cond->negate ? !exists : exists;
}
- case CONDITION_EQUAL: {
- const char *compare_value = cond->compare_value;
- char compare_buf[MAX_VALUE_LEN];
- ContextVar *compare_var = find_context_var(ctx, cond->compare_value);
- if (cond->compare_index >= 0) {
- if (compare_var != NULL &&
- compare_var->type == CONTEXT_TYPE_STRING_ARRAY &&
- cond->compare_index >= 0 &&
- cond->compare_index < compare_var->value.string_array_data.count) {
- compare_value = compare_var->value.string_array_data
- .values[cond->compare_index];
- }
- } else if (compare_var != NULL && compare_var->type == CONTEXT_TYPE_STRING) {
- strncpy(compare_buf, compare_var->value.string_val, MAX_VALUE_LEN - 1);
- compare_buf[MAX_VALUE_LEN - 1] = '\0';
- compare_value = compare_buf;
- }
- return (strcmp(var_value, compare_value) == 0);
- }
-
+ case CONDITION_EQUAL:
case CONDITION_NOT_EQUAL: {
- const char *compare_value = cond->compare_value;
char compare_buf[MAX_VALUE_LEN];
- ContextVar *compare_var = find_context_var(ctx, cond->compare_value);
- if (cond->compare_index >= 0) {
- if (compare_var != NULL &&
- compare_var->type == CONTEXT_TYPE_STRING_ARRAY &&
- cond->compare_index >= 0 &&
- cond->compare_index < compare_var->value.string_array_data.count) {
- compare_value = compare_var->value.string_array_data
- .values[cond->compare_index];
- }
- } else if (compare_var != NULL && compare_var->type == CONTEXT_TYPE_STRING) {
- strncpy(compare_buf, compare_var->value.string_val, MAX_VALUE_LEN - 1);
- compare_buf[MAX_VALUE_LEN - 1] = '\0';
- compare_value = compare_buf;
- }
- return (strcmp(var_value, compare_value) != 0);
+ const char *compare_value =
+ resolve_compare_value(cond, ctx, compare_buf);
+ bool values_equal = strcmp(var_value, compare_value) == 0;
+ return cond->type == CONDITION_EQUAL ? values_equal : !values_equal;
}
default: