aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2026-05-04 19:43:56 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2026-05-04 19:43:56 -0400
commit0a399462c53aac5d786c448f4a93c168ed124126 (patch)
tree2171224fa6790d7d7501bf6504031071eaeb8a5b /src
parentf8dd0f1abcf88767e0c71b28110e370cd5e9c173 (diff)
downloadstasis-0a399462c53aac5d786c448f4a93c168ed124126.tar.gz
Rewrite collapse_whitespace
* Remove count_blanks()
Diffstat (limited to 'src')
-rw-r--r--src/lib/core/utils.c39
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;
}