#include "includes.h"
#include "system/locale.h"
+#include "lib/util/tsort.h"
#undef strcasecmp
*/
_PUBLIC_ char **str_list_make_empty(TALLOC_CTX *mem_ctx)
{
- int num_elements = 0;
char **ret = NULL;
ret = talloc_array(mem_ctx, char *, 1);
*/
_PUBLIC_ char **str_list_make_single(TALLOC_CTX *mem_ctx, const char *entry)
{
- int num_elements = 0;
char **ret = NULL;
ret = talloc_array(mem_ctx, char *, 2);
continue;
}
- ret2 = talloc_realloc(mem_ctx, ret, char *, num_elements+2);
+ ret2 = talloc_realloc(mem_ctx, ret, char *,
+ num_elements+2);
if (ret2 == NULL) {
talloc_free(ret);
return NULL;
/**
* build a null terminated list of strings from an argv-like input string
- * Entries are seperated by spaces and can be enclosed by quotes.
+ * Entries are separated by spaces and can be enclosed by quotes.
* Does NOT support escaping
*/
-_PUBLIC_ const char **str_list_make_shell(TALLOC_CTX *mem_ctx, const char *string, const char *sep)
+_PUBLIC_ char **str_list_make_shell(TALLOC_CTX *mem_ctx, const char *string, const char *sep)
{
int num_elements = 0;
- const char **ret = NULL;
+ char **ret = NULL;
- ret = talloc_array(mem_ctx, const char *, 1);
+ ret = talloc_array(mem_ctx, char *, 1);
if (ret == NULL) {
return NULL;
}
while (string && *string) {
size_t len = strcspn(string, sep);
char *element;
- const char **ret2;
+ char **ret2;
if (len == 0) {
string += strspn(string, sep);
return NULL;
}
- ret2 = talloc_realloc(mem_ctx, ret, const char *, num_elements+2);
+ ret2 = talloc_realloc(mem_ctx, ret, char *, num_elements+2);
if (ret2 == NULL) {
talloc_free(ret);
return NULL;
/**
* join a list back to one string
*/
-_PUBLIC_ char *str_list_join(TALLOC_CTX *mem_ctx, const char **list, char seperator)
+_PUBLIC_ char *str_list_join(TALLOC_CTX *mem_ctx, const char **list, char separator)
{
char *ret = NULL;
int i;
ret = talloc_strdup(mem_ctx, list[0]);
for (i = 1; list[i]; i++) {
- ret = talloc_asprintf_append_buffer(ret, "%c%s", seperator, list[i]);
+ ret = talloc_asprintf_append_buffer(ret, "%c%s", separator, list[i]);
}
return ret;
}
/** join a list back to one (shell-like) string; entries
- * seperated by spaces, using quotes where necessary */
+ * separated by spaces, using quotes where necessary */
_PUBLIC_ char *str_list_join_shell(TALLOC_CTX *mem_ctx, const char **list, char sep)
{
char *ret = NULL;
/**
Return true if all the elements of the list match exactly.
*/
-_PUBLIC_ bool str_list_equal(const char **list1, const char **list2)
+_PUBLIC_ bool str_list_equal(const char * const *list1,
+ const char * const *list2)
{
int i;
{
int i;
- for (i=0;list[i];i++) {
+ for (i=0; list != NULL && list[i] != NULL; i++) {
if (strcmp(list[i], s) == 0) return true;
}
return false;
{
int i;
- for (i=0;list[i];i++) {
+ for (i=0; list != NULL && list[i] != NULL; i++) {
if (strcasecmp(list[i], s) == 0) return true;
}
return false;
/**
append one list to another - expanding list1
*/
-_PUBLIC_ char **str_list_append(const char **list1, const char * const *list2)
+_PUBLIC_ const char **str_list_append(const char **list1,
+ const char * const *list2)
{
size_t len1 = str_list_length(list1);
size_t len2 = str_list_length(list2);
- char **ret;
+ const char **ret;
int i;
- ret = talloc_realloc(NULL, list1, char *, len1+len2+1);
+ ret = talloc_realloc(NULL, list1, const char *, len1+len2+1);
if (ret == NULL) return NULL;
for (i=len1;i<len1+len2;i++) {
}
list2 = (const char **)talloc_memdup(list, list,
sizeof(list[0])*(len+1));
- qsort(list2, len, sizeof(list2[0]), QSORT_CAST list_cmp);
+ TYPESAFE_QSORT(list2, len, list_cmp);
list[0] = list2[0];
for (i=j=1;i<len;i++) {
if (strcmp(list2[i], list[j-1]) != 0) {
}
}
list[j] = NULL;
- list = talloc_realloc(NULL, list, const char *, j);
+ list = talloc_realloc(NULL, list, const char *, j + 1);
talloc_free(list2);
return list;
}
return ret;
}
+/**
+ * Add a string to an array of strings.
+ *
+ * num should be a pointer to an integer that holds the current
+ * number of elements in strings. It will be updated by this function.
+ */
+_PUBLIC_ bool add_string_to_array(TALLOC_CTX *mem_ctx,
+ const char *str, const char ***strings, size_t *num)
+{
+ char *dup_str = talloc_strdup(mem_ctx, str);
+
+ *strings = talloc_realloc(mem_ctx,
+ *strings,
+ const char *, ((*num)+1));
+
+ if ((*strings == NULL) || (dup_str == NULL)) {
+ *num = 0;
+ return false;
+ }
+
+ (*strings)[*num] = dup_str;
+ *num += 1;
+
+ return true;
+}
+
/**
add an entry to a string list
this assumes s will not change
ret[i] = NULL;
return ret;
}
+
+/**
+ * Needed for making an "unconst" list "const"
+ */
+_PUBLIC_ const char **const_str_list(char **list)
+{
+ return discard_const_p(const char *, list);
+}
+
+/**
+ * str_list_make, v3 version. The v4 version does not
+ * look at quoted strings with embedded blanks, so
+ * do NOT merge this function please!
+ */
+#define S_LIST_ABS 16 /* List Allocation Block Size */
+
+char **str_list_make_v3(TALLOC_CTX *mem_ctx, const char *string,
+ const char *sep)
+{
+ char **list;
+ const char *str;
+ char *s, *tok;
+ int num, lsize;
+
+ if (!string || !*string)
+ return NULL;
+
+ list = talloc_array(mem_ctx, char *, S_LIST_ABS+1);
+ if (list == NULL) {
+ return NULL;
+ }
+ lsize = S_LIST_ABS;
+
+ s = talloc_strdup(list, string);
+ if (s == NULL) {
+ DEBUG(0,("str_list_make: Unable to allocate memory"));
+ TALLOC_FREE(list);
+ return NULL;
+ }
+ if (!sep) sep = LIST_SEP;
+
+ num = 0;
+ str = s;
+
+ while (next_token_talloc(list, &str, &tok, sep)) {
+
+ if (num == lsize) {
+ char **tmp;
+
+ lsize += S_LIST_ABS;
+
+ tmp = talloc_realloc(mem_ctx, list, char *,
+ lsize + 1);
+ if (tmp == NULL) {
+ DEBUG(0,("str_list_make: "
+ "Unable to allocate memory"));
+ TALLOC_FREE(list);
+ return NULL;
+ }
+
+ list = tmp;
+
+ memset (&list[num], 0,
+ ((sizeof(char*)) * (S_LIST_ABS +1)));
+ }
+
+ list[num] = tok;
+ num += 1;
+ }
+
+ list[num] = NULL;
+
+ TALLOC_FREE(s);
+ return list;
+}
+
+const char **str_list_make_v3_const(TALLOC_CTX *mem_ctx,
+ const char *string,
+ const char *sep)
+{
+ return const_str_list(str_list_make_v3(mem_ctx, string, sep));
+}