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