author | Volker Birk <vb@pep-project.org> |
Wed, 29 Apr 2015 14:51:33 +0200 | |
changeset 229 | 313d152239bf |
parent 125 | 5119178815d8 |
child 301 | d8b44dc4b0c8 |
permissions | -rw-r--r-- |
vb@125 | 1 |
#include "pEp_internal.h" |
vb@125 | 2 |
|
vb@98 | 3 |
#include <stdlib.h> |
vb@98 | 4 |
#include <string.h> |
vb@98 | 5 |
#include <assert.h> |
vb@98 | 6 |
|
vb@98 | 7 |
#include "stringlist.h" |
vb@98 | 8 |
|
vb@98 | 9 |
|
vb@98 | 10 |
DYNAMIC_API stringlist_t *new_stringlist(const char *value) |
vb@98 | 11 |
{ |
vb@107 | 12 |
stringlist_t *result = calloc(1, sizeof(stringlist_t)); |
vb@109 | 13 |
assert(result); |
vb@109 | 14 |
|
vb@98 | 15 |
if (result && value) { |
vb@98 | 16 |
result->value = strdup(value); |
vb@98 | 17 |
assert(result->value); |
vb@98 | 18 |
if (result->value == 0) { |
vb@98 | 19 |
free(result); |
vb@98 | 20 |
return NULL; |
vb@98 | 21 |
} |
vb@98 | 22 |
} |
vb@109 | 23 |
|
vb@98 | 24 |
return result; |
vb@98 | 25 |
} |
vb@98 | 26 |
|
vb@98 | 27 |
DYNAMIC_API stringlist_t *stringlist_dup(const stringlist_t *src) |
vb@98 | 28 |
{ |
vb@98 | 29 |
assert(src); |
vb@98 | 30 |
if (src == NULL) |
vb@98 | 31 |
return NULL; |
vb@98 | 32 |
|
vb@98 | 33 |
stringlist_t *dst = new_stringlist(src->value); |
vb@98 | 34 |
if (dst == NULL) |
vb@98 | 35 |
return NULL; |
vb@98 | 36 |
|
vb@98 | 37 |
if (src->next) { |
vb@98 | 38 |
dst->next = stringlist_dup(src->next); |
vb@98 | 39 |
if (dst->next == NULL) { |
vb@98 | 40 |
free_stringlist(dst); |
vb@98 | 41 |
return NULL; |
vb@98 | 42 |
} |
vb@98 | 43 |
} |
vb@98 | 44 |
|
vb@98 | 45 |
return dst; |
vb@98 | 46 |
} |
vb@98 | 47 |
|
vb@113 | 48 |
DYNAMIC_API stringlist_t *stringlist_add( |
vb@113 | 49 |
stringlist_t *stringlist, |
vb@113 | 50 |
const char *value |
vb@113 | 51 |
) |
vb@98 | 52 |
{ |
vb@98 | 53 |
assert(value); |
vb@98 | 54 |
|
vb@98 | 55 |
if (stringlist == NULL) |
vb@98 | 56 |
return new_stringlist(value); |
vb@98 | 57 |
|
vb@98 | 58 |
if (stringlist->next != NULL) |
vb@98 | 59 |
return stringlist_add(stringlist->next, value); |
vb@98 | 60 |
if (stringlist->value == NULL) { |
vb@98 | 61 |
stringlist->value = strdup(value); |
vb@98 | 62 |
assert(stringlist->value); |
vb@98 | 63 |
if (stringlist->value == NULL) |
vb@98 | 64 |
return NULL; |
vb@98 | 65 |
return stringlist; |
vb@98 | 66 |
} |
vb@98 | 67 |
|
vb@98 | 68 |
stringlist->next = new_stringlist(value); |
vb@98 | 69 |
assert(stringlist->next); |
vb@98 | 70 |
if (stringlist->next == NULL) |
vb@98 | 71 |
return NULL; |
vb@98 | 72 |
|
vb@98 | 73 |
return stringlist->next; |
vb@98 | 74 |
} |
vb@98 | 75 |
|
vb@113 | 76 |
DYNAMIC_API stringlist_t *stringlist_append( |
vb@113 | 77 |
stringlist_t *stringlist, |
vb@113 | 78 |
stringlist_t *second |
vb@113 | 79 |
) |
vb@98 | 80 |
{ |
vb@98 | 81 |
assert(stringlist); |
vb@98 | 82 |
|
vb@98 | 83 |
if (second == NULL || second->value == NULL) |
vb@98 | 84 |
return stringlist; |
vb@98 | 85 |
|
vb@98 | 86 |
stringlist_t *_s = stringlist; |
vb@98 | 87 |
stringlist_t *_s2; |
vb@98 | 88 |
for (_s2 = second; _s2 != NULL; _s2 = _s2->next) { |
vb@98 | 89 |
_s = stringlist_add(_s, _s2->value); |
vb@98 | 90 |
if (_s == NULL) |
vb@98 | 91 |
return NULL; |
vb@98 | 92 |
} |
vb@98 | 93 |
return _s; |
vb@98 | 94 |
} |
vb@98 | 95 |
|
vb@98 | 96 |
DYNAMIC_API int stringlist_length(const stringlist_t *stringlist) |
vb@98 | 97 |
{ |
vb@98 | 98 |
int len = 1; |
vb@98 | 99 |
stringlist_t *_stringlist; |
vb@98 | 100 |
|
vb@98 | 101 |
assert(stringlist); |
vb@98 | 102 |
|
vb@98 | 103 |
if (stringlist->value == NULL) |
vb@98 | 104 |
return 0; |
vb@98 | 105 |
|
vb@113 | 106 |
for (_stringlist=stringlist->next; _stringlist!=NULL; |
vb@113 | 107 |
_stringlist=_stringlist->next) |
vb@98 | 108 |
len += 1; |
vb@98 | 109 |
|
vb@98 | 110 |
return len; |
vb@98 | 111 |
} |
vb@98 | 112 |
|
vb@98 | 113 |
DYNAMIC_API void free_stringlist(stringlist_t *stringlist) |
vb@98 | 114 |
{ |
vb@98 | 115 |
if (stringlist) { |
vb@98 | 116 |
free_stringlist(stringlist->next); |
vb@98 | 117 |
free(stringlist->value); |
vb@98 | 118 |
free(stringlist); |
vb@98 | 119 |
} |
vb@98 | 120 |
} |
vb@98 | 121 |