]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added p_strarray_dup().
authorTimo Sirainen <tss@iki.fi>
Fri, 11 Dec 2009 23:36:04 +0000 (18:36 -0500)
committerTimo Sirainen <tss@iki.fi>
Fri, 11 Dec 2009 23:36:04 +0000 (18:36 -0500)
--HG--
branch : HEAD

src/lib/Makefile.am
src/lib/strfuncs.c
src/lib/strfuncs.h
src/lib/test-lib.c
src/lib/test-lib.h
src/lib/test-strfuncs.c [new file with mode: 0644]

index 29246dd99f00c3d1e45895bbf3d6a8efa3e499e2..6c86278a45e8009c2a44ffdd4c3cb383eb456897 100644 (file)
@@ -232,6 +232,7 @@ test_lib_SOURCES = \
        test-priorityq.c \
        test-seq-range-array.c \
        test-strescape.c \
+       test-strfuncs.c \
        test-str-find.c \
        test-str-sanitize.c \
        test-time-util.c \
index b9f310b469461d34aa52c9c55b9cc508b7535395..e198f223446cd2abbaa7b351e7ab587597b7847c 100644 (file)
@@ -559,6 +559,28 @@ bool str_array_icase_find(const char *const *arr, const char *value)
        return FALSE;
 }
 
+const char **p_strarray_dup(pool_t pool, const char *const *arr)
+{
+       unsigned int i;
+       const char **ret;
+       char *p;
+       size_t len, size = sizeof(const char *);
+
+       for (i = 0; arr[i] != NULL; i++)
+               size += sizeof(const char *) + strlen(arr[i]) + 1;
+
+       ret = p_malloc(pool, size);
+       p = PTR_OFFSET(ret, sizeof(const char *) * (i + 1));
+       for (i = 0; arr[i] != NULL; i++) {
+               len = strlen(arr[i]) + 1;
+               memcpy(p, arr[i], len);
+               ret[i] = p;
+               p += len;
+       }
+       i_assert(PTR_OFFSET(ret, size) == (void *)p);
+       return ret;
+}
+
 const char *dec2str(uintmax_t number)
 {
        char *buffer;
index f6ed85c1ff35dbb6dfc58268c834ad1a39255a1c..e35bb80ae0836e62a0d658c9bcf5f3226e03aeb1 100644 (file)
@@ -84,6 +84,9 @@ bool str_array_remove(const char **arr, const char *value);
 bool str_array_find(const char *const *arr, const char *value);
 /* Like str_array_find(), but use strcasecmp(). */
 bool str_array_icase_find(const char *const *arr, const char *value);
+/* Duplicate array of strings. The memory can be freed by freeing the
+   return value. */
+const char **p_strarray_dup(pool_t pool, const char *const *arr);
 
 /* INTERNAL */
 char *t_noalloc_strdup_vprintf(const char *format, va_list args,
index e782a16059bb7f90e34a4a231000f9ea2b11a5de..fadcded6860446d7042fa50098be6f0e92481daf 100644 (file)
@@ -22,6 +22,7 @@ int main(void)
                test_priorityq,
                test_seq_range_array,
                test_strescape,
+               test_strfuncs,
                test_str_find,
                test_str_sanitize,
                test_time_util,
index 1529857d988fc8feb40d2a3f6e0578752a11beed..429d01602cc4477432539e76cbd530c6cbce69b0 100644 (file)
@@ -21,6 +21,7 @@ void test_primes(void);
 void test_priorityq(void);
 void test_seq_range_array(void);
 void test_strescape(void);
+void test_strfuncs(void);
 void test_str_find(void);
 void test_str_sanitize(void);
 void test_time_util(void);
diff --git a/src/lib/test-strfuncs.c b/src/lib/test-strfuncs.c
new file mode 100644 (file)
index 0000000..da03c91
--- /dev/null
@@ -0,0 +1,33 @@
+/* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
+
+#include "test-lib.h"
+
+static void test_p_strarray_dup(void)
+{
+       const char *input[][3] = {
+               { NULL },
+               { "a", NULL },
+               { "foobar", NULL },
+               { "a", "foo", NULL }
+       };
+       const char **ret;
+       unsigned int i, j;
+
+       test_begin("p_strarray_dup");
+
+       for (i = 0; i < N_ELEMENTS(input); i++) {
+               ret = p_strarray_dup(default_pool, input[i]);
+               for (j = 0; input[i][j] != NULL; j++) {
+                       test_assert(strcmp(input[i][j], ret[j]) == 0);
+                       test_assert(input[i][j] != ret[j]);
+               }
+               test_assert(ret[j] == NULL);
+               i_free(ret);
+       }
+       test_end();
+}
+
+void test_strfuncs(void)
+{
+       test_p_strarray_dup();
+}