From ef6c6ab4c6cee26ea84c2e2a0041ad62f428ad01 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 7 Apr 2009 16:33:26 +1000 Subject: added a str_list_append() function --- lib/util/util_strlist.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'lib/util/util_strlist.c') diff --git a/lib/util/util_strlist.c b/lib/util/util_strlist.c index b069a11e38..c53fee8f82 100644 --- a/lib/util/util_strlist.c +++ b/lib/util/util_strlist.c @@ -308,3 +308,26 @@ _PUBLIC_ bool str_list_check_ci(const char **list, const char *s) } +/** + append one list to another - expanding list1 +*/ +_PUBLIC_ const char **str_list_append(const char **list1, const char **list2) +{ + size_t len1 = str_list_length(list1); + size_t len2 = str_list_length(list2); + const char **ret; + int i; + + ret = talloc_realloc(NULL, list1, const char *, len1+len2+1); + if (ret == NULL) return NULL; + + for (i=len1;i Date: Wed, 8 Apr 2009 23:18:13 +1000 Subject: Rework util_strlist prototypes to use a bit more and less const Hopefully this produces less warnings, but it might produce more... Andrew Bartlett --- lib/util/util_strlist.c | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) (limited to 'lib/util/util_strlist.c') diff --git a/lib/util/util_strlist.c b/lib/util/util_strlist.c index c53fee8f82..86956289b4 100644 --- a/lib/util/util_strlist.c +++ b/lib/util/util_strlist.c @@ -198,7 +198,7 @@ _PUBLIC_ size_t str_list_length(const char * const*list) /** copy a string list */ -_PUBLIC_ char **str_list_copy(TALLOC_CTX *mem_ctx, const char **list) +_PUBLIC_ char **str_list_copy(TALLOC_CTX *mem_ctx, const char * const *list) { int i; char **ret; @@ -245,13 +245,19 @@ _PUBLIC_ bool str_list_equal(const char **list1, const char **list2) /** - add an entry to a string list + add an entry to a string list if not already in there */ -_PUBLIC_ const char **str_list_add(const char **list, const char *s) +_PUBLIC_ char **str_list_add_unique(char **list, const char *s) { - size_t len = str_list_length(list); + int i; + size_t len; const char **ret; + for (i=0;list[i];i++) { + if (strcmp(list[i], s) == 0) return list; + } + + len = i; ret = talloc_realloc(NULL, list, const char *, len+2); if (ret == NULL) return NULL; @@ -263,6 +269,25 @@ _PUBLIC_ const char **str_list_add(const char **list, const char *s) return ret; } +/** + add an entry to a string list +*/ +_PUBLIC_ char **str_list_add(char **list, const char *s) +{ + size_t len = str_list_length(list); + char **ret; + + ret = talloc_realloc(NULL, list, char *, len+2); + if (ret == NULL) return NULL; + + ret[len] = talloc_strdup(ret, s); + if (ret[len] == NULL) return NULL; + + ret[len+1] = NULL; + + return ret; +} + /** remove an entry from a string list */ @@ -311,14 +336,14 @@ _PUBLIC_ bool str_list_check_ci(const char **list, const char *s) /** append one list to another - expanding list1 */ -_PUBLIC_ const char **str_list_append(const char **list1, const char **list2) +_PUBLIC_ char **str_list_append(char **list1, const char * const *list2) { size_t len1 = str_list_length(list1); size_t len2 = str_list_length(list2); - const char **ret; + char **ret; int i; - ret = talloc_realloc(NULL, list1, const char *, len1+len2+1); + ret = talloc_realloc(NULL, list1, char *, len1+len2+1); if (ret == NULL) return NULL; for (i=len1;i Date: Thu, 9 Apr 2009 13:44:27 +1000 Subject: added str_list_unique() and str_list_show() I also undid some of the const changes from Andrew, as they didn't in fact resolve the const warnings. --- lib/util/util_strlist.c | 77 +++++++++++++++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 28 deletions(-) (limited to 'lib/util/util_strlist.c') diff --git a/lib/util/util_strlist.c b/lib/util/util_strlist.c index 86956289b4..29556b14d0 100644 --- a/lib/util/util_strlist.c +++ b/lib/util/util_strlist.c @@ -187,7 +187,7 @@ _PUBLIC_ char *str_list_join_shell(TALLOC_CTX *mem_ctx, const char **list, char /** return the number of elements in a string list */ -_PUBLIC_ size_t str_list_length(const char * const*list) +_PUBLIC_ size_t str_list_length(const char **list) { size_t ret; for (ret=0;list && list[ret];ret++) /* noop */ ; @@ -198,7 +198,7 @@ _PUBLIC_ size_t str_list_length(const char * const*list) /** copy a string list */ -_PUBLIC_ char **str_list_copy(TALLOC_CTX *mem_ctx, const char * const *list) +_PUBLIC_ char **str_list_copy(TALLOC_CTX *mem_ctx, const char **list) { int i; char **ret; @@ -244,31 +244,6 @@ _PUBLIC_ bool str_list_equal(const char **list1, const char **list2) } -/** - add an entry to a string list if not already in there -*/ -_PUBLIC_ char **str_list_add_unique(char **list, const char *s) -{ - int i; - size_t len; - const char **ret; - - for (i=0;list[i];i++) { - if (strcmp(list[i], s) == 0) return list; - } - - len = i; - ret = talloc_realloc(NULL, list, const char *, len+2); - if (ret == NULL) return NULL; - - ret[len] = talloc_strdup(ret, s); - if (ret[len] == NULL) return NULL; - - ret[len+1] = NULL; - - return ret; -} - /** add an entry to a string list */ @@ -336,7 +311,7 @@ _PUBLIC_ bool str_list_check_ci(const char **list, const char *s) /** append one list to another - expanding list1 */ -_PUBLIC_ char **str_list_append(char **list1, const char * const *list2) +_PUBLIC_ char **str_list_append(char **list1, const char **list2) { size_t len1 = str_list_length(list1); size_t len2 = str_list_length(list2); @@ -356,3 +331,49 @@ _PUBLIC_ char **str_list_append(char **list1, const char * const *list2) return ret; } + +static int list_cmp(const char **el1, const char **el2) +{ + return strcmp(*el1, *el2); +} + +/* + return a list that only contains the unique elements of a list, + removing any duplicates + */ +_PUBLIC_ char **str_list_unique(char **list) +{ + size_t len = str_list_length(list); + char **list2; + int i, j; + if (len < 2) { + return list; + } + list2 = (char **)talloc_memdup(list, list, sizeof(list[0])*(len+1)); + qsort(list2, len, sizeof(list2[0]), QSORT_CAST list_cmp); + list[0] = list2[0]; + for (i=j=1;i Date: Thu, 9 Apr 2009 14:28:38 +1000 Subject: added _const versions of some of the str_list_*() functions These const versions don't copy the strings themselves, which is useful when those strings point at known constant data (into the schema in this case) --- lib/util/util_strlist.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'lib/util/util_strlist.c') diff --git a/lib/util/util_strlist.c b/lib/util/util_strlist.c index 29556b14d0..bd7bd00888 100644 --- a/lib/util/util_strlist.c +++ b/lib/util/util_strlist.c @@ -377,3 +377,67 @@ _PUBLIC_ void str_list_show(const char **list) DEBUG(0,("}\n")); } + + +/** + append one list to another - expanding list1 + this assumes the elements of list2 are const pointers, so we can re-use them +*/ +_PUBLIC_ char **str_list_append_const(char **list1, const char **list2) +{ + size_t len1 = str_list_length(list1); + size_t len2 = str_list_length(list2); + char **ret; + int i; + + ret = talloc_realloc(NULL, list1, char *, len1+len2+1); + if (ret == NULL) return NULL; + + for (i=len1;i