diff options
| author | frosty <gabriel@bwaaa.monster> | 2026-08-08 00:20:42 -0400 |
|---|---|---|
| committer | frosty <gabriel@bwaaa.monster> | 2026-08-08 00:20:42 -0400 |
| commit | 539447047caa6cc3046a1e5814c0bfa563e476df (patch) | |
| tree | a53e45c3911e98f187f1ab0b9f9dc5ecb61d736a /src/template.c | |
| parent | cc04a6cada199649acb3c32fed9c99cb0134c57f (diff) | |
| download | beaker-539447047caa6cc3046a1e5814c0bfa563e476df.tar.gz | |
fix: deduplicate condition comparison lookup
Diffstat (limited to 'src/template.c')
| -rw-r--r-- | src/template.c | 63 |
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: |
