diff --git a/src/features.c b/src/features.c index 2bcc0f63..d0375888 100644 --- a/src/features.c +++ b/src/features.c @@ -11,16 +11,17 @@ void feature_array_add(cstring_array *features, size_t count, ...) { cstring_array_start_token(features); - for (size_t i = 0; i < count - 1; i++) { - char *arg = va_arg(args, char *); - char_array_append(features->str, arg); - char_array_append(features->str, FEATURE_SEPARATOR_CHAR); - } + bool strip_separator = true; + char_array_append_vjoined(features->str, FEATURE_SEPARATOR_CHAR, strip_separator, count, args); + va_end(args); +} - char *arg = va_arg(args, char *); - char_array_append(features->str, arg); - char_array_terminate(features->str); +void feature_array_add_printf(cstring_array *features, char *format, ...) { + va_list args; + va_start(args, format); + cstring_array_start_token(features); + char_array_cat_vprintf(features->str, format, args); va_end(args); } diff --git a/src/features.h b/src/features.h index 0b89ff81..d67d9ce5 100644 --- a/src/features.h +++ b/src/features.h @@ -12,6 +12,9 @@ void feature_array_add(cstring_array *features, size_t count, ...); +// Add feature using printf format +void feature_array_add_printf(cstring_array *features, char *format, ...); + // Add feature count to dictionary bool feature_counts_update(khash_t(str_uint32) *features, char *feature, int count); diff --git a/src/string_utils.c b/src/string_utils.c index 3dd2a26f..bb5fb85e 100644 --- a/src/string_utils.c +++ b/src/string_utils.c @@ -542,7 +542,7 @@ inline void char_array_add_len(char_array *array, char *str, size_t len) { } -static void vchar_array_append_joined(char_array *array, char *separator, bool strip_separator, int count, va_list args) { +void char_array_append_vjoined(char_array *array, char *separator, bool strip_separator, int count, va_list args) { if (count <= 0) { return; } @@ -552,7 +552,6 @@ static void vchar_array_append_joined(char_array *array, char *separator, bool s for (size_t i = 0; i < count - 1; i++) { char *arg = va_arg(args, char *); size_t len = strlen(arg); - if (len == 0) continue; if (strip_separator && ((separator_len == 1 && arg[len-1] == separator[0]) || @@ -573,7 +572,7 @@ static void vchar_array_append_joined(char_array *array, char *separator, bool s 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); + char_array_append_vjoined(array, separator, strip_separator, count, args); va_end(args); } @@ -581,15 +580,11 @@ inline void char_array_cat_joined(char_array *array, char *separator, bool strip char_array_strip_nul_byte(array); va_list args; va_start(args, count); - vchar_array_append_joined(array, separator, strip_separator, count, args); + char_array_append_vjoined(array, separator, strip_separator, count, args); va_end(args); } -// Based on antirez's sdscatvprintf implementation -void char_array_cat_printf(char_array *array, char *format, ...) { - va_list args; - va_start(args, format); - +void char_array_cat_vprintf(char_array *array, char *format, va_list args) { char_array_strip_nul_byte(array); va_list cpy; @@ -605,10 +600,10 @@ void char_array_cat_printf(char_array *array, char *format, ...) { buf = array->a + last_n; buflen = size - last_n; if (buf == NULL) return; - array->a[size-2] = '\0'; + array->a[size - 2] = '\0'; va_copy(cpy, args); vsnprintf(buf, buflen, format, cpy); - if (array->a[size-2] != '\0') { + if (array->a[size - 2] != '\0') { size *= 2; continue; } else { @@ -616,7 +611,12 @@ void char_array_cat_printf(char_array *array, char *format, ...) { } break; } +} +void char_array_cat_printf(char_array *array, char *format, ...) { + va_list args; + va_start(args, format); + char_array_cat_vprintf(array, format, args); va_end(args); } diff --git a/src/string_utils.h b/src/string_utils.h index f89cd0f4..3607c77e 100644 --- a/src/string_utils.h +++ b/src/string_utils.h @@ -115,9 +115,11 @@ void char_array_cat_reversed(char_array *array, char *str); void char_array_cat_reversed_len(char_array *array, char *str, size_t len); // Similar to cat methods but with printf args +void char_array_cat_vprintf(char_array *array, char *format, va_list args); void char_array_cat_printf(char_array *array, char *format, ...); // Mainly for paths or delimited strings +void char_array_append_vjoined(char_array *array, char *separator, bool strip_separator, int count, va_list args); void char_array_add_joined(char_array *array, char *separator, bool strip_separator, int count, ...); void char_array_cat_joined(char_array *array, char *separator, bool strip_separator, int count, ...);