src/stringpair.c
changeset 98 9e3d28932e7b
child 104 709edbd8f9c1
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/stringpair.c	Wed Mar 11 11:52:14 2015 +0100
     1.3 @@ -0,0 +1,177 @@
     1.4 +#include <stdlib.h>
     1.5 +#include <assert.h>
     1.6 +#include <string.h>
     1.7 +
     1.8 +#include "stringpair.h"
     1.9 +
    1.10 +DYNAMIC_API stringpair_t * new_stringpair(const char *key, const char *value)
    1.11 +{
    1.12 +    stringpair_t *pair = NULL;
    1.13 +
    1.14 +    assert(key);
    1.15 +    assert(value),
    1.16 +
    1.17 +    pair = calloc(1, sizeof(stringpair_t));
    1.18 +    assert(pair);
    1.19 +    if (pair == NULL)
    1.20 +        goto enomem;
    1.21 +
    1.22 +    pair->key = strdup(key);
    1.23 +    assert(pair->key);
    1.24 +    if (pair->key == NULL)
    1.25 +        goto enomem;
    1.26 +
    1.27 +    pair->value = strdup(value);
    1.28 +    assert(pair->value);
    1.29 +    if (pair->value == NULL)
    1.30 +        goto enomem;
    1.31 +
    1.32 +    return pair;
    1.33 +
    1.34 +enomem:
    1.35 +    free_stringpair(pair);
    1.36 +    return NULL;
    1.37 +}
    1.38 +
    1.39 +DYNAMIC_API void free_stringpair(stringpair_t * pair)
    1.40 +{
    1.41 +    if (pair) {
    1.42 +        free(pair->key);
    1.43 +        free(pair->value);
    1.44 +        free(pair);
    1.45 +    }
    1.46 +}
    1.47 +
    1.48 +DYNAMIC_API stringpair_t * stringpair_dup(const stringpair_t *src)
    1.49 +{
    1.50 +    assert(src);
    1.51 +    return new_stringpair(src->key, src->value);
    1.52 +}
    1.53 +
    1.54 +DYNAMIC_API stringpair_list_t *new_stringpair_list(const stringpair_t *value)
    1.55 +{
    1.56 +    stringpair_list_t *result = (stringpair_list_t *) calloc(1,
    1.57 +            sizeof(stringpair_list_t));
    1.58 +    if (result && value) {
    1.59 +        result->value = stringpair_dup(value);
    1.60 +        if (result->value == 0) {
    1.61 +            free(result);
    1.62 +            return NULL;
    1.63 +        }
    1.64 +    }
    1.65 +    return result;
    1.66 +}
    1.67 +
    1.68 +DYNAMIC_API stringpair_list_t *stringpair_list_dup(
    1.69 +        const stringpair_list_t *src
    1.70 +    )
    1.71 +{
    1.72 +    assert(src);
    1.73 +    if (src == NULL)
    1.74 +        return NULL;
    1.75 +
    1.76 +    stringpair_list_t *dst = new_stringpair_list(src->value);
    1.77 +    if (dst == NULL)
    1.78 +        return NULL;
    1.79 +
    1.80 +    if (src->next) {
    1.81 +        dst->next = stringpair_list_dup(src->next);
    1.82 +        if (dst->next == NULL) {
    1.83 +            free_stringpair_list(dst);
    1.84 +            return NULL;
    1.85 +        }
    1.86 +    }
    1.87 +
    1.88 +    return dst;
    1.89 +}
    1.90 +
    1.91 +DYNAMIC_API stringpair_list_t *stringpair_list_add(
    1.92 +        stringpair_list_t *stringpair_list,
    1.93 +        const stringpair_t *value
    1.94 +    )
    1.95 +{
    1.96 +    assert(value);
    1.97 +
    1.98 +    if (stringpair_list == NULL)
    1.99 +        return new_stringpair_list(value);
   1.100 +
   1.101 +    if (stringpair_list->next != NULL)
   1.102 +        return stringpair_list_add(stringpair_list->next, value);
   1.103 +    if (stringpair_list->value == NULL) {
   1.104 +        stringpair_list->value = stringpair_dup(value);
   1.105 +        if (stringpair_list->value == NULL)
   1.106 +            return NULL;
   1.107 +        return stringpair_list;
   1.108 +    }
   1.109 +
   1.110 +    stringpair_list->next = new_stringpair_list(value);
   1.111 +    if (stringpair_list->next == NULL)
   1.112 +        return NULL;
   1.113 +
   1.114 +    return stringpair_list->next;
   1.115 +}
   1.116 +
   1.117 +DYNAMIC_API stringpair_list_t *stringpair_list_append(
   1.118 +        stringpair_list_t *stringpair_list,
   1.119 +        stringpair_list_t *second
   1.120 +    )
   1.121 +{
   1.122 +    assert(stringpair_list);
   1.123 +
   1.124 +    if (second == NULL || second->value == NULL)
   1.125 +        return stringpair_list;
   1.126 +
   1.127 +    stringpair_list_t *_s = stringpair_list;
   1.128 +    stringpair_list_t *_s2;
   1.129 +    for (_s2 = second; _s2 != NULL; _s2 = _s2->next) {
   1.130 +        _s = stringpair_list_add(_s, _s2->value);
   1.131 +        if (_s == NULL)
   1.132 +            return NULL;
   1.133 +    }
   1.134 +    return _s;
   1.135 +}
   1.136 +
   1.137 +DYNAMIC_API int stringpair_list_length(
   1.138 +        const stringpair_list_t *stringpair_list
   1.139 +    )
   1.140 +{
   1.141 +    int len = 1;
   1.142 +    stringpair_list_t *_stringpair_list;
   1.143 +
   1.144 +    assert(stringpair_list);
   1.145 +
   1.146 +    if (stringpair_list->value == NULL)
   1.147 +        return 0;
   1.148 +
   1.149 +    for (_stringpair_list=stringpair_list->next; _stringpair_list!=NULL;
   1.150 +            _stringpair_list=_stringpair_list->next)
   1.151 +        len += 1;
   1.152 +
   1.153 +    return len;
   1.154 +}
   1.155 +
   1.156 +DYNAMIC_API void free_stringpair_list(stringpair_list_t *stringpair_list)
   1.157 +{
   1.158 +    if (stringpair_list) {
   1.159 +        free_stringpair_list(stringpair_list->next);
   1.160 +        free_stringpair(stringpair_list->value);
   1.161 +        free(stringpair_list);
   1.162 +    }
   1.163 +}
   1.164 +
   1.165 +DYNAMIC_API stringpair_t *stringpair_list_find(
   1.166 +        stringpair_list_t *stringpair_list,
   1.167 +        const char *key
   1.168 +    )
   1.169 +{
   1.170 +    assert(key);
   1.171 +
   1.172 +    if (stringpair_list == NULL)
   1.173 +        return NULL;
   1.174 +
   1.175 +    if (strcoll(stringpair_list->value->key, key) == 0)
   1.176 +        return stringpair_list->value;
   1.177 +    else
   1.178 +        return stringpair_list_find(stringpair_list->next, key);
   1.179 +}
   1.180 +