summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-19 10:12:47 +0200
committerPaul Buetow <paul@buetow.org>2026-03-19 10:12:47 +0200
commit59ddf9fbf4b4cfa379ec57e6479a24b8b3400aea (patch)
tree5cbb58deb21049a84eab1a9547a211727573acd0
parent3ad5fbe368771a5023bf36fecd45586bcbb94b93 (diff)
fix: ignore trailing newlines in capture tokenization
-rw-r--r--ioriot/src/utils/utils.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/ioriot/src/utils/utils.c b/ioriot/src/utils/utils.c
index 1f90ddf..3429131 100644
--- a/ioriot/src/utils/utils.c
+++ b/ioriot/src/utils/utils.c
@@ -93,6 +93,9 @@ char* strtok2_r(char *str, char *delim, char **saveptr)
str = *saveptr;
}
+ while (str[0] == '\n' || str[0] == '\r')
+ str++;
+
if (str[0] == '\0') {
*saveptr = NULL;
return NULL;
@@ -103,10 +106,24 @@ char* strtok2_r(char *str, char *delim, char **saveptr)
next[0] = '\0';
for (int i = 0; i < len; ++i)
next++;
+ while (next[0] == '\n' || next[0] == '\r')
+ next++;
*saveptr = next;
return str;
}
+ int str_len = strlen(str);
+ while (str_len > 0 &&
+ (str[str_len-1] == '\n' || str[str_len-1] == '\r')) {
+ str[str_len-1] = '\0';
+ str_len--;
+ }
+
+ if (str[0] == '\0') {
+ *saveptr = NULL;
+ return NULL;
+ }
+
*saveptr = NULL;
return str;
}
@@ -229,6 +246,20 @@ void utils_test(void)
assert(Eq("c=2", strtok2_r(NULL, ";:,", &saveptr)));
assert(NULL == strtok2_r(NULL, ";:,", &saveptr));
+ char tokens_without_trailer_newline[] = "t=1;:,c=2\n";
+ saveptr = NULL;
+ assert(Eq("t=1", strtok2_r(tokens_without_trailer_newline, ";:,",
+ &saveptr)));
+ assert(Eq("c=2", strtok2_r(NULL, ";:,", &saveptr)));
+ assert(NULL == strtok2_r(NULL, ";:,", &saveptr));
+
+ char tokens_with_trailer_newline[] = "t=1;:,c=2;:,\n";
+ saveptr = NULL;
+ assert(Eq("t=1", strtok2_r(tokens_with_trailer_newline, ";:,",
+ &saveptr)));
+ assert(Eq("c=2", strtok2_r(NULL, ";:,", &saveptr)));
+ assert(NULL == strtok2_r(NULL, ";:,", &saveptr));
+
assert(_limit_target(100, 50) == 50);
assert(_limit_target(100, RLIM_INFINITY) == 100);
assert(NULL == _lookup_user_or_null("ioriot-definitely-missing-user"));