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