1 // This file is under GNU General Public License 3.0
4 #include "pEp_internal.h"
10 #include "stringlist.h"
13 DYNAMIC_API stringlist_t *new_stringlist(const char *value)
15 stringlist_t *result = calloc(1, sizeof(stringlist_t));
18 if (result && value) {
19 result->value = strdup(value);
20 assert(result->value);
21 if (result->value == 0) {
30 DYNAMIC_API stringlist_t *stringlist_dup(const stringlist_t *src)
36 stringlist_t *dst = new_stringlist(src->value);
40 stringlist_t* src_curr = src->next;
41 stringlist_t** dst_curr_ptr = &dst->next;
44 *dst_curr_ptr = new_stringlist(src_curr->value);
45 if (*dst_curr_ptr == NULL) {
49 src_curr = src_curr->next;
50 dst_curr_ptr = &((*dst_curr_ptr)->next);
56 static bool _stringlist_add_first(
57 stringlist_t *stringlist,
58 stringlist_t **result,
62 // empty list (no nodes)
63 if (stringlist == NULL) {
64 *result = new_stringlist(value);
68 // empty list (one node, no value)
69 if (stringlist->value == NULL) {
70 if (stringlist->next) {
71 *result = NULL; // invalid list
75 stringlist->value = strdup(value);
76 assert(stringlist->value);
78 if (stringlist->value == NULL) {
89 DYNAMIC_API stringlist_t *stringlist_add(
90 stringlist_t *stringlist,
98 stringlist_t *result = NULL;
99 if(_stringlist_add_first(stringlist, &result, value))
102 stringlist_t* list_curr = stringlist;
104 while (list_curr->next)
105 list_curr = list_curr->next;
107 list_curr->next = new_stringlist(value);
109 assert(list_curr->next);
110 if (list_curr->next == NULL)
113 return list_curr->next;
116 DYNAMIC_API stringlist_t *stringlist_add_unique(
117 stringlist_t *stringlist,
125 stringlist_t *result = NULL;
126 if(_stringlist_add_first(stringlist, &result, value))
129 stringlist_t* list_curr = stringlist;
132 while (list_curr->next) {
133 if(strcmp(list_curr->value,value)==0)
135 list_curr = list_curr->next;
139 list_curr->next = new_stringlist(value);
141 assert(list_curr->next);
142 if (list_curr->next == NULL)
145 return list_curr->next;
152 DYNAMIC_API stringlist_t *stringlist_append(
153 stringlist_t *stringlist,
158 if (stringlist == NULL)
161 // Second list is empty
162 if (second == NULL || second->value == NULL)
165 stringlist_t *_s = stringlist;
167 for (_s2 = second; _s2 != NULL; _s2 = _s2->next) {
168 _s = stringlist_add(_s, _s2->value);
175 DYNAMIC_API int stringlist_length(const stringlist_t *stringlist)
179 const stringlist_t *_sl;
180 for (_sl = stringlist; _sl && _sl->value; _sl = _sl->next)
186 DYNAMIC_API stringlist_t *stringlist_delete(
187 stringlist_t *stringlist,
194 if (stringlist->value == NULL) {
195 free_stringlist(stringlist);
203 stringlist_t *last = NULL;
204 for (_sl = stringlist; _sl && _sl->value; _sl = _sl->next) {
205 if (strcmp(_sl->value, value) == 0) {
207 stringlist = stringlist->next;
209 last->next = _sl->next;
211 free_stringlist(_sl);
219 DYNAMIC_API void free_stringlist(stringlist_t *stringlist)
221 stringlist_t *curr = stringlist;
224 stringlist_t *next = curr->next;