From 50b56f783939d286b2a821381c07d25b248fbd96 Mon Sep 17 00:00:00 2001
From: Mark Puha
Date: Fri, 13 Jun 2025 23:03:10 +0200
Subject: [PATCH] feat: improve whitespace removal
---
src/config.c | 36 +++++++++++++++++++++++++++++++++---
1 file changed, 33 insertions(+), 3 deletions(-)
diff --git a/src/config.c b/src/config.c
index 176dc15..d6b3248 100644
--- a/src/config.c
+++ b/src/config.c
@@ -653,6 +653,9 @@ bool config_read_line(struct config_ctx *ctx, const char *input)
size_t len, cleaned_len = 0;
char *line, *comment;
bool ret = true;
+ bool found_equals = false;
+ bool found_value_start = false;
+ size_t value_end = 0;
/* This is what strchrnul is for, but that isn't portable. */
comment = strchr(input, COMMENT_CHAR);
@@ -668,10 +671,37 @@ bool config_read_line(struct config_ctx *ctx, const char *input)
goto out;
}
- for (size_t i = 0; i < len; ++i) {
- if (!char_is_space(input[i]))
- line[cleaned_len++] = input[i];
+ /* Remove preceding and trailing whitespaces before value
+ First pass: find the actual end of the value (trim trailing spaces) */
+ for (size_t i = len; i > 0; --i) {
+ if (!char_is_space(input[i - 1])) {
+ value_end = i;
+ break;
+ }
}
+
+ /* Second pass: clean according to KEY = VALUE rules */
+ for (size_t i = 0; i < value_end; ++i) {
+ if (!found_equals) {
+ /* Before '=': remove all whitespace */
+ if (input[i] == '=') {
+ line[cleaned_len++] = input[i];
+ found_equals = true;
+ } else if (!char_is_space(input[i])) {
+ line[cleaned_len++] = input[i];
+ }
+ } else if (!found_value_start) {
+ /* After '=' but before value: skip whitespace until first non-space */
+ if (!char_is_space(input[i])) {
+ line[cleaned_len++] = input[i];
+ found_value_start = true;
+ }
+ } else {
+ /* Within value: preserve all characters including spaces */
+ line[cleaned_len++] = input[i];
+ }
+ }
+
if (!cleaned_len)
goto out;
ret = process_line(ctx, line);