diff options
| author | Joseph Hunkeler <jhunkeler@gmail.com> | 2026-05-04 19:43:56 -0400 |
|---|---|---|
| committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2026-05-04 19:43:56 -0400 |
| commit | 0a399462c53aac5d786c448f4a93c168ed124126 (patch) | |
| tree | 2171224fa6790d7d7501bf6504031071eaeb8a5b /src | |
| parent | f8dd0f1abcf88767e0c71b28110e370cd5e9c173 (diff) | |
| download | stasis-0a399462c53aac5d786c448f4a93c168ed124126.tar.gz | |
Rewrite collapse_whitespace
* Remove count_blanks()
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/core/utils.c | 39 |
1 files changed, 21 insertions, 18 deletions
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; } |
