From 89f6611c4e78dd23b800df2565bd3e446aefbeb3 Mon Sep 17 00:00:00 2001 From: Al Date: Mon, 28 Nov 2016 15:06:07 -0800 Subject: [PATCH] [strings] string_trim makes a copy rather than modifying the pointer --- src/normalize.c | 5 ++++- src/string_utils.c | 23 +++++++++-------------- src/string_utils.h | 4 +--- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/normalize.c b/src/normalize.c index 1d10fecc..f8f241e3 100644 --- a/src/normalize.c +++ b/src/normalize.c @@ -11,7 +11,10 @@ char *normalize_string_utf8(char *str, uint64_t options) { bool have_utf8proc_options = false; if (options & NORMALIZE_STRING_TRIM) { - string_trim(str); + char *trimmed = string_trim(str); + if (trimmed != NULL) { + str = trimmed; + } } if (options & NORMALIZE_STRING_DECOMPOSE) { diff --git a/src/string_utils.c b/src/string_utils.c index d777a6a3..12f483bf 100644 --- a/src/string_utils.c +++ b/src/string_utils.c @@ -411,7 +411,7 @@ inline bool string_contains_hyphen(char *str) { return string_next_hyphen_index(str, strlen(str)) >= 0; } -size_t string_rtrim(char *str) { +size_t string_right_spaces(char *str) { size_t spaces = 0; uint8_t *ptr = (uint8_t *)str; @@ -433,14 +433,11 @@ size_t string_rtrim(char *str) { spaces++; } - if (spaces > 0) { - *(str + index) = '\0'; - } - return spaces; + } -size_t string_ltrim(char *str) { +size_t string_left_spaces(char *str) { size_t spaces = 0; uint8_t *ptr = (uint8_t *)str; @@ -462,17 +459,15 @@ size_t string_ltrim(char *str) { spaces++; } - if (spaces > 0) { - memmove(str, str + index, len + 1 - index); - } - return spaces; } -inline size_t string_trim(char *str) { - size_t spaces = string_ltrim(str); - spaces += string_rtrim(str); - return spaces; +char *string_trim(char *str) { + size_t left_spaces = string_left_spaces(str); + size_t right_spaces = string_right_spaces(str); + size_t len = strlen(str); + char *ret = strndup(str + left_spaces, len - left_spaces - right_spaces); + return ret; } char_array *char_array_from_string(char *str) { diff --git a/src/string_utils.h b/src/string_utils.h index 324bb260..2295316c 100644 --- a/src/string_utils.h +++ b/src/string_utils.h @@ -90,9 +90,7 @@ ssize_t string_next_hyphen_index(char *str, size_t len); bool string_contains_hyphen(char *str); bool string_contains_hyphen_len(char *str, size_t len); -size_t string_ltrim(char *str); -size_t string_rtrim(char *str); -size_t string_trim(char *str); +char *string_trim(char *str); /* char_array is a dynamic character array defined in collections.h but has a few additional methods related to string manipulation.