src/stringpair.c
author Volker Birk <vb@pep.foundation>
Mon, 17 Oct 2016 15:37:25 +0200
changeset 1286 278339f8066c
parent 1285 e9015701a9b4
child 1513 e7f7e42385b5
permissions -rw-r--r--
compatible solution
vb@125
     1
#include "pEp_internal.h"
vb@125
     2
vb@98
     3
#include <stdlib.h>
vb@98
     4
#include <assert.h>
vb@98
     5
#include <string.h>
vb@98
     6
vb@98
     7
#include "stringpair.h"
vb@98
     8
vb@98
     9
DYNAMIC_API stringpair_t * new_stringpair(const char *key, const char *value)
vb@98
    10
{
vb@98
    11
    stringpair_t *pair = NULL;
vb@98
    12
vb@1285
    13
    // key and value should not be NULL, that's bad style (while legal)
vb@1285
    14
vb@98
    15
    assert(key);
krista@1283
    16
    assert(value);
vb@98
    17
vb@98
    18
    pair = calloc(1, sizeof(stringpair_t));
vb@98
    19
    assert(pair);
vb@98
    20
    if (pair == NULL)
vb@98
    21
        goto enomem;
vb@98
    22
vb@1286
    23
    pair->key = key ? strdup(key) : strdup("");
vb@1286
    24
    assert(pair->key);
vb@1286
    25
    if (pair->key == NULL)
vb@1286
    26
        goto enomem;
vb@98
    27
vb@1286
    28
    pair->value = value ? strdup(value) : strdup("");
vb@1286
    29
    assert(pair->value);
vb@1286
    30
    if (pair->value == NULL)
vb@1286
    31
        goto enomem;
vb@98
    32
vb@98
    33
    return pair;
vb@98
    34
vb@98
    35
enomem:
vb@98
    36
    free_stringpair(pair);
vb@98
    37
    return NULL;
vb@98
    38
}
vb@98
    39
vb@98
    40
DYNAMIC_API void free_stringpair(stringpair_t * pair)
vb@98
    41
{
vb@98
    42
    if (pair) {
vb@98
    43
        free(pair->key);
vb@98
    44
        free(pair->value);
vb@98
    45
        free(pair);
vb@98
    46
    }
vb@98
    47
}
vb@98
    48
vb@98
    49
DYNAMIC_API stringpair_t * stringpair_dup(const stringpair_t *src)
vb@98
    50
{
vb@98
    51
    assert(src);
krista@843
    52
    if (src == NULL)
krista@843
    53
        return NULL;
krista@843
    54
    
vb@98
    55
    return new_stringpair(src->key, src->value);
vb@98
    56
}
vb@98
    57
vb@281
    58
DYNAMIC_API stringpair_list_t *new_stringpair_list(stringpair_t *value)
vb@98
    59
{
vb@107
    60
    stringpair_list_t *result = calloc(1, sizeof(stringpair_list_t));
vb@109
    61
    assert(result);
vb@109
    62
vb@281
    63
    if (result && value)
vb@281
    64
        result->value = value;
krista@831
    65
    
vb@98
    66
    return result;
vb@98
    67
}
vb@98
    68
vb@98
    69
DYNAMIC_API stringpair_list_t *stringpair_list_dup(
vb@98
    70
        const stringpair_list_t *src
vb@98
    71
    )
vb@98
    72
{
vb@98
    73
    assert(src);
vb@98
    74
    if (src == NULL)
vb@98
    75
        return NULL;
vb@98
    76
krista@832
    77
    stringpair_t* copy_pair = stringpair_dup(src->value);
krista@832
    78
    
krista@832
    79
    stringpair_list_t *dst = new_stringpair_list(copy_pair);
vb@98
    80
    if (dst == NULL)
vb@98
    81
        return NULL;
vb@98
    82
krista@831
    83
    stringpair_list_t* src_curr = src->next;
krista@831
    84
    stringpair_list_t** dst_curr_ptr = &dst->next;
krista@831
    85
krista@831
    86
    while (src_curr) {
krista@832
    87
        copy_pair = stringpair_dup(src_curr->value);
krista@895
    88
        if (copy_pair == NULL) {
krista@895
    89
            free_stringpair_list(dst);
krista@895
    90
            return NULL;
krista@895
    91
        }
krista@832
    92
        *dst_curr_ptr = new_stringpair_list(copy_pair);
krista@895
    93
        if (*dst_curr_ptr == NULL) {
krista@895
    94
            free_stringpair(copy_pair);
krista@895
    95
            free_stringpair_list(dst);
krista@895
    96
            return NULL;
krista@895
    97
        }
krista@831
    98
        src_curr = src_curr->next;
krista@831
    99
        dst_curr_ptr = &((*dst_curr_ptr)->next);
vb@98
   100
    }
vb@98
   101
vb@98
   102
    return dst;
krista@831
   103
    
vb@98
   104
}
vb@98
   105
vb@98
   106
DYNAMIC_API stringpair_list_t *stringpair_list_add(
vb@98
   107
        stringpair_list_t *stringpair_list,
vb@281
   108
        stringpair_t *value
vb@98
   109
    )
vb@98
   110
{
vb@98
   111
    assert(value);
vb@98
   112
krista@843
   113
    // empty list (no nodes)
vb@98
   114
    if (stringpair_list == NULL)
vb@98
   115
        return new_stringpair_list(value);
vb@98
   116
krista@843
   117
    // empty list (one node, no value)
krista@843
   118
    if (stringpair_list->value == NULL) {
krista@843
   119
        if (stringpair_list->next)
krista@843
   120
            return NULL; // invalid list
krista@843
   121
            
krista@843
   122
        stringpair_list->value = value;
krista@843
   123
        assert(stringpair_list->value);
krista@843
   124
        
krista@843
   125
        if (stringpair_list->value == NULL)
krista@843
   126
            return NULL;
krista@843
   127
        
krista@843
   128
        return stringpair_list;
krista@843
   129
    }
krista@843
   130
    
krista@835
   131
    stringpair_list_t* list_curr = stringpair_list;
krista@835
   132
    
krista@835
   133
    while (list_curr->next)
krista@835
   134
        list_curr = list_curr->next;
krista@843
   135
     
krista@835
   136
    list_curr->next = new_stringpair_list(value);
vb@281
   137
krista@835
   138
    assert(list_curr->next);
krista@835
   139
    if (list_curr->next == NULL)
vb@98
   140
        return NULL;
vb@98
   141
krista@835
   142
    return list_curr->next;
krista@835
   143
    
vb@98
   144
}
vb@98
   145
vb@98
   146
DYNAMIC_API stringpair_list_t *stringpair_list_append(
vb@98
   147
        stringpair_list_t *stringpair_list,
vb@98
   148
        stringpair_list_t *second
vb@98
   149
    )
vb@98
   150
{
vb@98
   151
    assert(stringpair_list);
krista@836
   152
    if (stringpair_list == NULL)
krista@836
   153
        return NULL;
vb@98
   154
krista@843
   155
    // second list is empty
vb@98
   156
    if (second == NULL || second->value == NULL)
vb@98
   157
        return stringpair_list;
vb@98
   158
vb@98
   159
    stringpair_list_t *_s = stringpair_list;
vb@98
   160
    stringpair_list_t *_s2;
vb@98
   161
    for (_s2 = second; _s2 != NULL; _s2 = _s2->next) {
Edouard@812
   162
        stringpair_t *_sp = stringpair_dup(_s2->value);
Edouard@812
   163
        if (_sp == NULL)
vb@98
   164
            return NULL;
Edouard@812
   165
        _s = stringpair_list_add(_s, _sp);
Edouard@812
   166
        if (_s == NULL){
Edouard@812
   167
            free_stringpair(_sp);
Edouard@812
   168
            return NULL;
Edouard@812
   169
        }
vb@98
   170
    }
vb@98
   171
    return _s;
vb@98
   172
}
vb@98
   173
vb@98
   174
DYNAMIC_API int stringpair_list_length(
vb@98
   175
        const stringpair_list_t *stringpair_list
vb@98
   176
    )
vb@98
   177
{
vb@301
   178
    int len = 0;
vb@98
   179
vb@302
   180
    const stringpair_list_t *_sl;
vb@301
   181
    for (_sl = stringpair_list; _sl && _sl->value; _sl = _sl->next)
vb@301
   182
        len++;
vb@98
   183
vb@98
   184
    return len;
vb@98
   185
}
vb@98
   186
vb@98
   187
DYNAMIC_API void free_stringpair_list(stringpair_list_t *stringpair_list)
vb@98
   188
{
vb@98
   189
    if (stringpair_list) {
vb@98
   190
        free_stringpair_list(stringpair_list->next);
vb@98
   191
        free_stringpair(stringpair_list->value);
vb@98
   192
        free(stringpair_list);
vb@98
   193
    }
vb@98
   194
}
vb@98
   195
vb@104
   196
DYNAMIC_API stringpair_list_t *stringpair_list_find(
vb@98
   197
        stringpair_list_t *stringpair_list,
vb@98
   198
        const char *key
vb@98
   199
    )
vb@98
   200
{
vb@98
   201
    assert(key);
vb@98
   202
vb@104
   203
    stringpair_list_t *_l;
vb@104
   204
    for (_l = stringpair_list; _l; _l = _l->next) {
vb@104
   205
        if (strcoll(key, _l->value->key) == 0)
vb@104
   206
            return _l;
vb@104
   207
    }
vb@98
   208
vb@104
   209
    return NULL;
vb@98
   210
}
vb@98
   211