2 Unix SMB/CIFS implementation.
4 Copyright (C) Andrew Tridgell 2005
5 Copyright (C) Jelmer Vernooij 2005
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "system/locale.h"
26 * @brief String list manipulation
30 build a null terminated list of strings from a input string and a
31 separator list. The separator list must contain characters less than
32 or equal to 0x2f for this to work correctly on multi-byte strings
34 _PUBLIC_ const char **str_list_make(TALLOC_CTX *mem_ctx, const char *string, const char *sep)
37 const char **ret = NULL;
43 ret = talloc_array(mem_ctx, const char *, 1);
48 while (string && *string) {
49 size_t len = strcspn(string, sep);
53 string += strspn(string, sep);
57 ret2 = talloc_realloc(mem_ctx, ret, const char *, num_elements+2);
64 ret[num_elements] = talloc_strndup(ret, string, len);
65 if (ret[num_elements] == NULL) {
74 ret[num_elements] = NULL;
80 * build a null terminated list of strings from an argv-like input string
81 * Entries are seperated by spaces and can be enclosed by quotes.
82 * Does NOT support escaping
84 _PUBLIC_ const char **str_list_make_shell(TALLOC_CTX *mem_ctx, const char *string, const char *sep)
87 const char **ret = NULL;
89 ret = talloc_array(mem_ctx, const char *, 1);
97 while (string && *string) {
98 size_t len = strcspn(string, sep);
103 string += strspn(string, sep);
107 if (*string == '\"') {
109 len = strcspn(string, "\"");
110 element = talloc_strndup(ret, string, len);
113 element = talloc_strndup(ret, string, len);
117 if (element == NULL) {
122 ret2 = talloc_realloc(mem_ctx, ret, const char *, num_elements+2);
129 ret[num_elements] = element;
134 ret[num_elements] = NULL;
141 * join a list back to one string
143 _PUBLIC_ char *str_list_join(TALLOC_CTX *mem_ctx, const char **list, char seperator)
149 return talloc_strdup(mem_ctx, "");
151 ret = talloc_strdup(mem_ctx, list[0]);
153 for (i = 1; list[i]; i++) {
154 ret = talloc_asprintf_append_buffer(ret, "%c%s", seperator, list[i]);
160 /** join a list back to one (shell-like) string; entries
161 * seperated by spaces, using quotes where necessary */
162 _PUBLIC_ char *str_list_join_shell(TALLOC_CTX *mem_ctx, const char **list, char sep)
168 return talloc_strdup(mem_ctx, "");
170 if (strchr(list[0], ' ') || strlen(list[0]) == 0)
171 ret = talloc_asprintf(mem_ctx, "\"%s\"", list[0]);
173 ret = talloc_strdup(mem_ctx, list[0]);
175 for (i = 1; list[i]; i++) {
176 if (strchr(list[i], ' ') || strlen(list[i]) == 0)
177 ret = talloc_asprintf_append_buffer(ret, "%c\"%s\"", sep, list[i]);
179 ret = talloc_asprintf_append_buffer(ret, "%c%s", sep, list[i]);
186 return the number of elements in a string list
188 _PUBLIC_ size_t str_list_length(const char **list)
191 for (ret=0;list && list[ret];ret++) /* noop */ ;
199 _PUBLIC_ const char **str_list_copy(TALLOC_CTX *mem_ctx, const char **list)
207 ret = talloc_array(mem_ctx, const char *, str_list_length(list)+1);
211 for (i=0;list && list[i];i++) {
212 ret[i] = talloc_strdup(ret, list[i]);
213 if (ret[i] == NULL) {
223 Return true if all the elements of the list match exactly.
225 _PUBLIC_ bool str_list_equal(const char **list1, const char **list2)
229 if (list1 == NULL || list2 == NULL) {
230 return (list1 == list2);
233 for (i=0;list1[i] && list2[i];i++) {
234 if (strcmp(list1[i], list2[i]) != 0) {
238 if (list1[i] || list2[i]) {
246 add an entry to a string list
248 _PUBLIC_ const char **str_list_add(const char **list, const char *s)
250 size_t len = str_list_length(list);
253 ret = talloc_realloc(NULL, list, const char *, len+2);
254 if (ret == NULL) return NULL;
256 ret[len] = talloc_strdup(ret, s);
257 if (ret[len] == NULL) return NULL;
265 remove an entry from a string list
267 _PUBLIC_ void str_list_remove(const char **list, const char *s)
271 for (i=0;list[i];i++) {
272 if (strcmp(list[i], s) == 0) break;
274 if (!list[i]) return;
283 return true if a string is in a list
285 _PUBLIC_ bool str_list_check(const char **list, const char *s)
289 for (i=0;list[i];i++) {
290 if (strcmp(list[i], s) == 0) return true;
296 return true if a string is in a list, case insensitively
298 _PUBLIC_ bool str_list_check_ci(const char **list, const char *s)
302 for (i=0;list[i];i++) {
303 if (strcasecmp(list[i], s) == 0) return true;