diff --git a/src/string_utils.c b/src/string_utils.c index 4739a8fc..a09f1318 100644 --- a/src/string_utils.c +++ b/src/string_utils.c @@ -160,46 +160,80 @@ char *stripped = string_strip_whitespace(str); free(str); */ -char *string_strip_whitespace(char *str) { - char *end; +size_t string_rstrip(char *str) { + size_t spaces = 0; - size_t initial_spaces = 0; - - char *ptr = str; - - while (isspace(*ptr++)) { - initial_spaces++; + char *end = str + strlen(str) - 1; + while (end > str && isspace(*end)) { + spaces++; + end--; } - if (*ptr == '\0') - return str; - - - end = str + strlen(str) - 1; - while (end > str && isspace(*end)) end--; - *(end+1) = '\0'; - return ptr; + return spaces; +} + +size_t string_lstrip(char *str) { + char *end; + + size_t spaces = 0; + + size_t len = strlen(str) - 1; + char *ptr = str; + + while (isspace(*ptr++)) { + spaces++; + } + + if (spaces > 0) { + memmove(str, str + spaces, len + 1 - spaces); + } + + return spaces; +} + +size_t string_strip(char *str) { + size_t spaces = string_lstrip(str); + spaces += string_rstrip(str); + return spaces; } char_array *char_array_from_string(char *str) { char_array *array = char_array_new(); array->a = str; array->m = array->n = strlen(str); + return array; } -char *char_array_to_string(char_array *array, bool free_array) { - if (free_array) free(array); +inline char *char_array_get_string(char_array *array) { return array->a; } +inline char *char_array_to_string(char_array *array) { + if (array->n == 0 || array->a[array->n - 1] != '\0') { + char_array_terminate(array); + } + char *a = array->a; + free(array); + return a; +} + + static inline void char_array_strip_nul_byte(char_array *array) { if (array->n > 0 && array->a[array->n - 1] == '\0') { array->n--; } } +size_t char_array_len(char_array *array) { + if (array->n > 0 && array->a[array->n - 1] == '\0') { + return array->n - 1; + } else { + return array->n; + } +} + void char_array_append(char_array *array, char *str) { while(*str) { char_array_push(array, *str++); @@ -417,4 +451,3 @@ cstring_array *cstring_array_split(char *str, const char *separator, size_t sepa return cstring_array_from_char_array(array); } - diff --git a/src/string_utils.h b/src/string_utils.h index 70a008f7..c7274862 100644 --- a/src/string_utils.h +++ b/src/string_utils.h @@ -10,7 +10,6 @@ extern "C" { #include #include #include "collections.h" -#include "sds/sds.h" #include "utf8proc/utf8proc.h" #include "vector.h" @@ -31,7 +30,9 @@ char *utf8_reversed_string(const char *s); // returns a copy, caller frees ssize_t utf8proc_iterate_reversed(const uint8_t *str, const uint8_t *start, int32_t *dst); bool utf8_is_letter(int32_t ch); -char *string_strip_whitespace(char *str); +size_t string_lstrip(char *str); +size_t string_rstrip(char *str); +size_t string_strip(char *str); /* Caller has to free the original string, also keep in mind that after operating on a char array, @@ -40,7 +41,12 @@ char *string_strip_whitespace(char *str); Consider a macro which does this consistently */ char_array *char_array_from_string(char *str); -char *char_array_to_string(char_array *array, bool free_array); +char *char_array_get_string(char_array *array); + +// Frees the char_array and returns a standard NUL-terminated string +char *char_array_to_string(char_array *array); + +size_t char_array_len(char_array *array); void char_array_append(char_array *array, char *str); void char_array_append_len(char_array *array, char *str, size_t len); @@ -95,6 +101,7 @@ char *cstring_array_get_token(cstring_array *self, uint32_t i); void cstring_array_destroy(cstring_array *self); + #ifdef __cplusplus } #endif