src/stringpair.c
author vb
Wed, 11 Mar 2015 15:17:26 +0100
changeset 104 709edbd8f9c1
parent 98 9e3d28932e7b
child 107 fbef1c59da96
permissions -rw-r--r--
chaning to iterative implelementation of find
vb@98
     1
#include <stdlib.h>
vb@98
     2
#include <assert.h>
vb@98
     3
#include <string.h>
vb@98
     4
vb@98
     5
#include "stringpair.h"
vb@98
     6
vb@98
     7
DYNAMIC_API stringpair_t * new_stringpair(const char *key, const char *value)
vb@98
     8
{
vb@98
     9
    stringpair_t *pair = NULL;
vb@98
    10
vb@98
    11
    assert(key);
vb@98
    12
    assert(value),
vb@98
    13
vb@98
    14
    pair = calloc(1, sizeof(stringpair_t));
vb@98
    15
    assert(pair);
vb@98
    16
    if (pair == NULL)
vb@98
    17
        goto enomem;
vb@98
    18
vb@98
    19
    pair->key = strdup(key);
vb@98
    20
    assert(pair->key);
vb@98
    21
    if (pair->key == NULL)
vb@98
    22
        goto enomem;
vb@98
    23
vb@98
    24
    pair->value = strdup(value);
vb@98
    25
    assert(pair->value);
vb@98
    26
    if (pair->value == NULL)
vb@98
    27
        goto enomem;
vb@98
    28
vb@98
    29
    return pair;
vb@98
    30
vb@98
    31
enomem:
vb@98
    32
    free_stringpair(pair);
vb@98
    33
    return NULL;
vb@98
    34
}
vb@98
    35
vb@98
    36
DYNAMIC_API void free_stringpair(stringpair_t * pair)
vb@98
    37
{
vb@98
    38
    if (pair) {
vb@98
    39
        free(pair->key);
vb@98
    40
        free(pair->value);
vb@98
    41
        free(pair);
vb@98
    42
    }
vb@98
    43
}
vb@98
    44
vb@98
    45
DYNAMIC_API stringpair_t * stringpair_dup(const stringpair_t *src)
vb@98
    46
{
vb@98
    47
    assert(src);
vb@98
    48
    return new_stringpair(src->key, src->value);
vb@98
    49
}
vb@98
    50
vb@98
    51
DYNAMIC_API stringpair_list_t *new_stringpair_list(const stringpair_t *value)
vb@98
    52
{
vb@98
    53
    stringpair_list_t *result = (stringpair_list_t *) calloc(1,
vb@98
    54
            sizeof(stringpair_list_t));
vb@98
    55
    if (result && value) {
vb@98
    56
        result->value = stringpair_dup(value);
vb@98
    57
        if (result->value == 0) {
vb@98
    58
            free(result);
vb@98
    59
            return NULL;
vb@98
    60
        }
vb@98
    61
    }
vb@98
    62
    return result;
vb@98
    63
}
vb@98
    64
vb@98
    65
DYNAMIC_API stringpair_list_t *stringpair_list_dup(
vb@98
    66
        const stringpair_list_t *src
vb@98
    67
    )
vb@98
    68
{
vb@98
    69
    assert(src);
vb@98
    70
    if (src == NULL)
vb@98
    71
        return NULL;
vb@98
    72
vb@98
    73
    stringpair_list_t *dst = new_stringpair_list(src->value);
vb@98
    74
    if (dst == NULL)
vb@98
    75
        return NULL;
vb@98
    76
vb@98
    77
    if (src->next) {
vb@98
    78
        dst->next = stringpair_list_dup(src->next);
vb@98
    79
        if (dst->next == NULL) {
vb@98
    80
            free_stringpair_list(dst);
vb@98
    81
            return NULL;
vb@98
    82
        }
vb@98
    83
    }
vb@98
    84
vb@98
    85
    return dst;
vb@98
    86
}
vb@98
    87
vb@98
    88
DYNAMIC_API stringpair_list_t *stringpair_list_add(
vb@98
    89
        stringpair_list_t *stringpair_list,
vb@98
    90
        const stringpair_t *value
vb@98
    91
    )
vb@98
    92
{
vb@98
    93
    assert(value);
vb@98
    94
vb@98
    95
    if (stringpair_list == NULL)
vb@98
    96
        return new_stringpair_list(value);
vb@98
    97
vb@98
    98
    if (stringpair_list->next != NULL)
vb@98
    99
        return stringpair_list_add(stringpair_list->next, value);
vb@98
   100
    if (stringpair_list->value == NULL) {
vb@98
   101
        stringpair_list->value = stringpair_dup(value);
vb@98
   102
        if (stringpair_list->value == NULL)
vb@98
   103
            return NULL;
vb@98
   104
        return stringpair_list;
vb@98
   105
    }
vb@98
   106
vb@98
   107
    stringpair_list->next = new_stringpair_list(value);
vb@98
   108
    if (stringpair_list->next == NULL)
vb@98
   109
        return NULL;
vb@98
   110
vb@98
   111
    return stringpair_list->next;
vb@98
   112
}
vb@98
   113
vb@98
   114
DYNAMIC_API stringpair_list_t *stringpair_list_append(
vb@98
   115
        stringpair_list_t *stringpair_list,
vb@98
   116
        stringpair_list_t *second
vb@98
   117
    )
vb@98
   118
{
vb@98
   119
    assert(stringpair_list);
vb@98
   120
vb@98
   121
    if (second == NULL || second->value == NULL)
vb@98
   122
        return stringpair_list;
vb@98
   123
vb@98
   124
    stringpair_list_t *_s = stringpair_list;
vb@98
   125
    stringpair_list_t *_s2;
vb@98
   126
    for (_s2 = second; _s2 != NULL; _s2 = _s2->next) {
vb@98
   127
        _s = stringpair_list_add(_s, _s2->value);
vb@98
   128
        if (_s == NULL)
vb@98
   129
            return NULL;
vb@98
   130
    }
vb@98
   131
    return _s;
vb@98
   132
}
vb@98
   133
vb@98
   134
DYNAMIC_API int stringpair_list_length(
vb@98
   135
        const stringpair_list_t *stringpair_list
vb@98
   136
    )
vb@98
   137
{
vb@98
   138
    int len = 1;
vb@98
   139
    stringpair_list_t *_stringpair_list;
vb@98
   140
vb@98
   141
    assert(stringpair_list);
vb@98
   142
vb@98
   143
    if (stringpair_list->value == NULL)
vb@98
   144
        return 0;
vb@98
   145
vb@98
   146
    for (_stringpair_list=stringpair_list->next; _stringpair_list!=NULL;
vb@98
   147
            _stringpair_list=_stringpair_list->next)
vb@98
   148
        len += 1;
vb@98
   149
vb@98
   150
    return len;
vb@98
   151
}
vb@98
   152
vb@98
   153
DYNAMIC_API void free_stringpair_list(stringpair_list_t *stringpair_list)
vb@98
   154
{
vb@98
   155
    if (stringpair_list) {
vb@98
   156
        free_stringpair_list(stringpair_list->next);
vb@98
   157
        free_stringpair(stringpair_list->value);
vb@98
   158
        free(stringpair_list);
vb@98
   159
    }
vb@98
   160
}
vb@98
   161
vb@104
   162
DYNAMIC_API stringpair_list_t *stringpair_list_find(
vb@98
   163
        stringpair_list_t *stringpair_list,
vb@98
   164
        const char *key
vb@98
   165
    )
vb@98
   166
{
vb@98
   167
    assert(key);
vb@98
   168
vb@104
   169
    stringpair_list_t *_l;
vb@104
   170
    for (_l = stringpair_list; _l; _l = _l->next) {
vb@104
   171
        if (strcoll(key, _l->value->key) == 0)
vb@104
   172
            return _l;
vb@104
   173
    }
vb@98
   174
vb@104
   175
    return NULL;
vb@98
   176
}
vb@98
   177