diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-19 10:12:47 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-19 10:12:47 +0200 |
| commit | 59ddf9fbf4b4cfa379ec57e6479a24b8b3400aea (patch) | |
| tree | 5cbb58deb21049a84eab1a9547a211727573acd0 | |
| parent | 3ad5fbe368771a5023bf36fecd45586bcbb94b93 (diff) | |
fix: ignore trailing newlines in capture tokenization
| -rw-r--r-- | ioriot/src/utils/utils.c | 31 |
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")); |
