Mercurial > dovecot > core-2.2
changeset 19790:8d3736bf4a90
lib: Move code from t_strarray_join() into a more generic p_strarray_join_n()
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Sun, 21 Feb 2016 18:32:03 +0200 |
parents | 39b6a7059871 |
children | 5c4e9921b65f |
files | src/lib/strfuncs.c |
diffstat | 1 files changed, 17 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/strfuncs.c Sun Feb 21 18:31:12 2016 +0200 +++ b/src/lib/strfuncs.c Sun Feb 21 18:32:03 2016 +0200 @@ -611,17 +611,21 @@ return count; } -const char *t_strarray_join(const char *const *arr, const char *separator) +static char * +p_strarray_join_n(pool_t pool, const char *const *arr, unsigned int arr_len, + const char *separator) { size_t alloc_len, sep_len, len, pos, needed_space; + unsigned int i; char *str; sep_len = strlen(separator); alloc_len = 64; - str = t_buffer_get(alloc_len); + str = t_buffer_get(alloc_len); + pos = 0; - for (pos = 0; *arr != NULL; arr++) { - len = strlen(*arr); + for (i = 0; i < arr_len; i++) { + len = strlen(arr[i]); needed_space = pos + len + sep_len + 1; if (needed_space > alloc_len) { alloc_len = nearest_power(needed_space); @@ -633,14 +637,22 @@ pos += sep_len; } - memcpy(str + pos, *arr, len); + memcpy(str + pos, arr[i], len); pos += len; } str[pos] = '\0'; + if (!pool->datastack_pool) + return p_memdup(pool, str, pos + 1); t_buffer_alloc(pos + 1); return str; } +const char *t_strarray_join(const char *const *arr, const char *separator) +{ + return p_strarray_join_n(unsafe_data_stack_pool, arr, + str_array_length(arr), separator); +} + bool str_array_remove(const char **arr, const char *value) { const char **dest;