fix #104: fixed incorrect/confusing behaviour in stringlist_add/append stringpair_list_add/append.
1 #include "pEp_internal.h"
7 #include "stringpair.h"
9 DYNAMIC_API stringpair_t * new_stringpair(const char *key, const char *value)
11 stringpair_t *pair = NULL;
16 pair = calloc(1, sizeof(stringpair_t));
21 pair->key = strdup(key);
23 if (pair->key == NULL)
26 pair->value = strdup(value);
28 if (pair->value == NULL)
34 free_stringpair(pair);
38 DYNAMIC_API void free_stringpair(stringpair_t * pair)
47 DYNAMIC_API stringpair_t * stringpair_dup(const stringpair_t *src)
53 return new_stringpair(src->key, src->value);
56 DYNAMIC_API stringpair_list_t *new_stringpair_list(stringpair_t *value)
58 stringpair_list_t *result = calloc(1, sizeof(stringpair_list_t));
62 result->value = value;
69 DYNAMIC_API stringpair_list_t *stringpair_list_dup(
70 const stringpair_list_t *src
77 stringpair_t* copy_pair = stringpair_dup(src->value);
79 stringpair_list_t *dst = new_stringpair_list(copy_pair);
83 stringpair_list_t* src_curr = src->next;
84 stringpair_list_t** dst_curr_ptr = &dst->next;
87 copy_pair = stringpair_dup(src_curr->value);
88 *dst_curr_ptr = new_stringpair_list(copy_pair);
89 src_curr = src_curr->next;
90 dst_curr_ptr = &((*dst_curr_ptr)->next);
97 DYNAMIC_API stringpair_list_t *stringpair_list_add(
98 stringpair_list_t *stringpair_list,
104 // empty list (no nodes)
105 if (stringpair_list == NULL)
106 return new_stringpair_list(value);
108 // empty list (one node, no value)
109 if (stringpair_list->value == NULL) {
110 if (stringpair_list->next)
111 return NULL; // invalid list
113 stringpair_list->value = value;
114 assert(stringpair_list->value);
116 if (stringpair_list->value == NULL)
119 return stringpair_list;
122 stringpair_list_t* list_curr = stringpair_list;
124 while (list_curr->next)
125 list_curr = list_curr->next;
127 list_curr->next = new_stringpair_list(value);
129 assert(list_curr->next);
130 if (list_curr->next == NULL)
133 return list_curr->next;
137 DYNAMIC_API stringpair_list_t *stringpair_list_append(
138 stringpair_list_t *stringpair_list,
139 stringpair_list_t *second
142 assert(stringpair_list);
143 if (stringpair_list == NULL)
146 // second list is empty
147 if (second == NULL || second->value == NULL)
148 return stringpair_list;
150 stringpair_list_t *_s = stringpair_list;
151 stringpair_list_t *_s2;
152 for (_s2 = second; _s2 != NULL; _s2 = _s2->next) {
153 stringpair_t *_sp = stringpair_dup(_s2->value);
156 _s = stringpair_list_add(_s, _sp);
158 free_stringpair(_sp);
165 DYNAMIC_API int stringpair_list_length(
166 const stringpair_list_t *stringpair_list
171 const stringpair_list_t *_sl;
172 for (_sl = stringpair_list; _sl && _sl->value; _sl = _sl->next)
178 DYNAMIC_API void free_stringpair_list(stringpair_list_t *stringpair_list)
180 if (stringpair_list) {
181 free_stringpair_list(stringpair_list->next);
182 free_stringpair(stringpair_list->value);
183 free(stringpair_list);
187 DYNAMIC_API stringpair_list_t *stringpair_list_find(
188 stringpair_list_t *stringpair_list,
194 stringpair_list_t *_l;
195 for (_l = stringpair_list; _l; _l = _l->next) {
196 if (strcoll(key, _l->value->key) == 0)