From: Timo Sirainen Date: Fri, 11 Dec 2009 23:36:04 +0000 (-0500) Subject: Added p_strarray_dup(). X-Git-Tag: 2.0.beta1~22 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=12ff27eadb44c6877298d3e214c7039342669669;p=thirdparty%2Fdovecot%2Fcore.git Added p_strarray_dup(). --HG-- branch : HEAD --- diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index 29246dd99f..6c86278a45 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -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 \ diff --git a/src/lib/strfuncs.c b/src/lib/strfuncs.c index b9f310b469..e198f22344 100644 --- a/src/lib/strfuncs.c +++ b/src/lib/strfuncs.c @@ -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; diff --git a/src/lib/strfuncs.h b/src/lib/strfuncs.h index f6ed85c1ff..e35bb80ae0 100644 --- a/src/lib/strfuncs.h +++ b/src/lib/strfuncs.h @@ -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, diff --git a/src/lib/test-lib.c b/src/lib/test-lib.c index e782a16059..fadcded686 100644 --- a/src/lib/test-lib.c +++ b/src/lib/test-lib.c @@ -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, diff --git a/src/lib/test-lib.h b/src/lib/test-lib.h index 1529857d98..429d01602c 100644 --- a/src/lib/test-lib.h +++ b/src/lib/test-lib.h @@ -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 index 0000000000..da03c913f2 --- /dev/null +++ b/src/lib/test-strfuncs.c @@ -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(); +}