From 0a399462c53aac5d786c448f4a93c168ed124126 Mon Sep 17 00:00:00 2001 From: Joseph Hunkeler Date: Mon, 4 May 2026 19:43:56 -0400 Subject: Rewrite collapse_whitespace * Remove count_blanks() --- src/lib/core/utils.c | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) (limited to 'src/lib') diff --git a/src/lib/core/utils.c b/src/lib/core/utils.c index 90dac1d..e6a8315 100644 --- a/src/lib/core/utils.c +++ b/src/lib/core/utils.c @@ -742,29 +742,32 @@ int fix_tox_conf(const char *filename, char **result, size_t maxlen) { return 0; } -static size_t count_blanks(char *s) { - // return the number of leading blanks (tab/space) in a string - size_t blank = 0; - for (size_t i = 0; i < strlen(s); i++) { - if (isblank(s[i])) { - blank++; +/** + * Collapse all whitespace in a string (to single spaces) + * @param s address of string to modify + * @return + */ +char *collapse_whitespace(char **s) { + char *dest = NULL; + char *src = NULL; + int in_ws = 1; + + for (src = dest = *s; *src != '\0'; ++src) { + if (isspace(*src)) { + if (!in_ws) { + *dest++ = ' '; + in_ws = 1; + } } else { - break; + *dest++ = *src; + in_ws = 0; } } - return blank; -} -char *collapse_whitespace(char **s) { - char *x = (*s); - size_t len = strlen(x); - for (size_t i = 0; i < len; i++) { - size_t blank = count_blanks(&x[i]); - if (blank > 1) { - memmove(&x[i], &x[i] + blank, strlen(&x[i])); - } + if (dest > *s && *(dest - 1) == ' ') { + --dest; } - + *dest = '\0'; return *s; } -- cgit