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