From 539447047caa6cc3046a1e5814c0bfa563e476df Mon Sep 17 00:00:00 2001 From: frosty Date: Sat, 8 Aug 2026 00:20:42 -0400 Subject: fix: deduplicate condition comparison lookup --- src/template.c | 63 +++++++++++++++++++++++++--------------------------------- 1 file changed, 27 insertions(+), 36 deletions(-) (limited to 'src') 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: -- cgit v1.3