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;