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