[utils] add to feature array with printf syntax

This commit is contained in:
Al
2015-09-10 10:24:51 -07:00
parent b3f89a207a
commit 0ddf50cb5f
4 changed files with 25 additions and 19 deletions

View File

@@ -11,16 +11,17 @@ void feature_array_add(cstring_array *features, size_t count, ...) {
cstring_array_start_token(features); cstring_array_start_token(features);
for (size_t i = 0; i < count - 1; i++) { bool strip_separator = true;
char *arg = va_arg(args, char *); char_array_append_vjoined(features->str, FEATURE_SEPARATOR_CHAR, strip_separator, count, args);
char_array_append(features->str, arg); va_end(args);
char_array_append(features->str, FEATURE_SEPARATOR_CHAR); }
}
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); va_end(args);
} }

View File

@@ -12,6 +12,9 @@
void feature_array_add(cstring_array *features, size_t count, ...); 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 // Add feature count to dictionary
bool feature_counts_update(khash_t(str_uint32) *features, char *feature, int count); bool feature_counts_update(khash_t(str_uint32) *features, char *feature, int count);

View File

@@ -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) { if (count <= 0) {
return; 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++) { for (size_t i = 0; i < count - 1; i++) {
char *arg = va_arg(args, char *); char *arg = va_arg(args, char *);
size_t len = strlen(arg); size_t len = strlen(arg);
if (len == 0) continue;
if (strip_separator && if (strip_separator &&
((separator_len == 1 && arg[len-1] == separator[0]) || ((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, ...) { inline void char_array_add_joined(char_array *array, char *separator, bool strip_separator, int count, ...) {
va_list args; va_list args;
va_start(args, count); 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); 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); char_array_strip_nul_byte(array);
va_list args; va_list args;
va_start(args, count); 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); va_end(args);
} }
// Based on antirez's sdscatvprintf implementation void char_array_cat_vprintf(char_array *array, char *format, va_list args) {
void char_array_cat_printf(char_array *array, char *format, ...) {
va_list args;
va_start(args, format);
char_array_strip_nul_byte(array); char_array_strip_nul_byte(array);
va_list cpy; va_list cpy;
@@ -605,10 +600,10 @@ void char_array_cat_printf(char_array *array, char *format, ...) {
buf = array->a + last_n; buf = array->a + last_n;
buflen = size - last_n; buflen = size - last_n;
if (buf == NULL) return; if (buf == NULL) return;
array->a[size-2] = '\0'; array->a[size - 2] = '\0';
va_copy(cpy, args); va_copy(cpy, args);
vsnprintf(buf, buflen, format, cpy); vsnprintf(buf, buflen, format, cpy);
if (array->a[size-2] != '\0') { if (array->a[size - 2] != '\0') {
size *= 2; size *= 2;
continue; continue;
} else { } else {
@@ -616,7 +611,12 @@ void char_array_cat_printf(char_array *array, char *format, ...) {
} }
break; 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); va_end(args);
} }

View File

@@ -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); void char_array_cat_reversed_len(char_array *array, char *str, size_t len);
// Similar to cat methods but with printf args // 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, ...); void char_array_cat_printf(char_array *array, char *format, ...);
// Mainly for paths or delimited strings // 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_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, ...); void char_array_cat_joined(char_array *array, char *separator, bool strip_separator, int count, ...);