From 064b6b5898d3b62b202cb7bff9c2c22b39b5b86f Mon Sep 17 00:00:00 2001 From: Al Date: Mon, 10 Aug 2015 16:10:05 -0400 Subject: [PATCH] [utils] char_array_append_reversed for adding reversed strings without a malloc --- src/string_utils.c | 61 ++++++++++++++++++++++++++++++++++++---------- src/string_utils.h | 8 +++--- 2 files changed, 52 insertions(+), 17 deletions(-) diff --git a/src/string_utils.c b/src/string_utils.c index 2599c56b..4f905b80 100644 --- a/src/string_utils.c +++ b/src/string_utils.c @@ -365,7 +365,7 @@ size_t string_rtrim(char *str) { ssize_t index = len; while (1) { - ssize_t char_len = utf8proc_iterate_reversed(ptr, len, &ch); + ssize_t char_len = utf8proc_iterate_reversed(ptr, index, &ch); if (ch <= 0) break; @@ -375,7 +375,6 @@ size_t string_rtrim(char *str) { } index -= char_len; - ptr -= char_len; spaces++; } @@ -453,7 +452,7 @@ static inline void char_array_strip_nul_byte(char_array *array) { } } -size_t char_array_len(char_array *array) { +inline size_t char_array_len(char_array *array) { if (array->n > 0 && array->a[array->n - 1] == '\0') { return array->n - 1; } else { @@ -461,47 +460,83 @@ size_t char_array_len(char_array *array) { } } -void char_array_append(char_array *array, char *str) { +inline void char_array_append(char_array *array, char *str) { while(*str) { char_array_push(array, *str++); } } -void char_array_append_len(char_array *array, char *str, size_t len) { +inline void char_array_append_len(char_array *array, char *str, size_t len) { for (size_t i = 0; i < len; i++) { char_array_push(array, *str++); } } -void char_array_terminate(char_array *array) { +inline void char_array_append_reversed_len(char_array *array, char *str, size_t len) { + int32_t unich; + ssize_t char_len; + + size_t idx = len; + uint8_t *ptr = (uint8_t *)str; + + while(idx > 0) { + char_len = utf8proc_iterate_reversed(ptr, idx, &unich); + if (char_len <= 0 || unich == 0) break; + if (!(utf8proc_codepoint_valid(unich))) break; + + idx -= char_len; + char_array_append_len(array, str + idx, char_len); + } +} + +inline void char_array_append_reversed(char_array *array, char *str) { + size_t len = strlen(str); + char_array_append_reversed_len(array, str, len); +} + +inline void char_array_terminate(char_array *array) { char_array_push(array, '\0'); } -char_array *char_array_copy(char_array *array) { +inline char_array *char_array_copy(char_array *array) { char_array *copy = char_array_new_size(array->m); memcpy(copy->a, array->a, array->n); copy->n = array->n; return copy; } -void char_array_cat(char_array *array, char *str) { +inline void char_array_cat(char_array *array, char *str) { char_array_strip_nul_byte(array); char_array_append(array, str); char_array_terminate(array); } -void char_array_cat_len(char_array *array, char *str, size_t len) { +inline void char_array_cat_len(char_array *array, char *str, size_t len) { char_array_strip_nul_byte(array); char_array_append_len(array, str, len); char_array_terminate(array); } -void char_array_add(char_array *array, char *str) { + +inline void char_array_cat_reversed(char_array *array, char *str) { + char_array_strip_nul_byte(array); + char_array_append_reversed(array, str); + char_array_terminate(array); +} + + +inline void char_array_cat_reversed_len(char_array *array, char *str, size_t len) { + char_array_strip_nul_byte(array); + char_array_append_reversed_len(array, str, len); + char_array_terminate(array); +} + +inline void char_array_add(char_array *array, char *str) { char_array_append(array, str); char_array_terminate(array); } -void char_array_add_len(char_array *array, char *str, size_t len) { +inline void char_array_add_len(char_array *array, char *str, size_t len) { char_array_append_len(array, str, len); char_array_terminate(array); } @@ -535,14 +570,14 @@ static void vchar_array_append_joined(char_array *array, char *separator, bool s } -void char_array_add_joined(char_array *array, char *separator, bool strip_separator, int count, ...) { +inline void char_array_add_joined(char_array *array, char *separator, bool strip_separator, int count, ...) { va_list args; va_start(args, count); vchar_array_append_joined(array, separator, strip_separator, count, args); va_end(args); } -void char_array_cat_joined(char_array *array, char *separator, bool strip_separator, int count, ...) { +inline void char_array_cat_joined(char_array *array, char *separator, bool strip_separator, int count, ...) { char_array_strip_nul_byte(array); va_list args; va_start(args, count); diff --git a/src/string_utils.h b/src/string_utils.h index 614d2f00..95ad2bb9 100644 --- a/src/string_utils.h +++ b/src/string_utils.h @@ -92,6 +92,8 @@ 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); +void char_array_append_reversed(char_array *array, char *str); +void char_array_append_reversed_len(char_array *array, char *str, size_t len); void char_array_terminate(char_array *array); char_array *char_array_copy(char_array *array); @@ -99,10 +101,8 @@ char_array *char_array_copy(char_array *array); // Similar to strcat, strips NUL-byte and guarantees 0-terminated void char_array_cat(char_array *array, char *str); void char_array_cat_len(char_array *array, char *str, size_t len); - -// Strips NUL-byte but does not NUL-terminate -void char_array_cat_unterminated(char_array *array, char *str); -void char_array_cat_unterminated_len(char_array *array, char *str, size_t len); +void char_array_cat_reversed(char_array *array, char *str); +void char_array_cat_reversed_len(char_array *array, char *str, size_t len); // Cat with printf args void char_array_cat_printf(char_array *array, char *format, ...);