[utils] char_array_cat_printf was forcing a doubling of the size of the buffer, which is bad if calling many times. Now only initiates a realloc if the char_array is almost full. Also adding cstring_array_from_strings which takes a list of char *s

This commit is contained in:
Al
2016-01-06 22:56:01 -05:00
parent 8c019998d7
commit 0d5cf0d6d7

View File

@@ -464,7 +464,7 @@ inline char *char_array_to_string(char_array *array) {
}
static inline void char_array_strip_nul_byte(char_array *array) {
inline void char_array_strip_nul_byte(char_array *array) {
if (array->n > 0 && array->a[array->n - 1] == '\0') {
array->a[array->n - 1] = '\0';
array->n--;
@@ -605,7 +605,7 @@ void char_array_cat_vprintf(char_array *array, char *format, va_list args) {
size_t buflen;
size_t last_n = array->n;
size_t size = array->m < 8 ? 16 : array->m * 2;
size_t size = array->m - array->n <= 2 ? array->m * 2 : array->m;
while(1) {
char_array_resize(array, size);
@@ -685,6 +685,15 @@ cstring_array *cstring_array_from_char_array(char_array *str) {
return array;
}
cstring_array *cstring_array_from_strings(char **strings, size_t n) {
cstring_array *array = cstring_array_new();
for (size_t i = 0; i < n; i++) {
cstring_array_start_token(array);
cstring_array_add_string(array, strings[i]);
}
return array;
}
inline size_t cstring_array_capacity(cstring_array *self) {
return self->str->m;
}