summaryrefslogtreecommitdiffstats
path: root/eurephia_values.c
blob: 0b473743b50e8853024501d384dcc1581f72f27c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/* eurephia_values.c  --  Generic interface for processing key->value pairs
 *
 *  GPLv2 - Copyright (C) 2008  David Sommerseth <dazo@users.sourceforge.net>
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  as published by the Free Software Foundation; version 2
 *  of the License.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <eurephia_nullsafe.h>
#include <eurephia_struct.h>
#include <eurephia_log.h>


eurephiaVALUES *eGet_valuestruct(eurephiaVALUES *vls, const char *key) {
        eurephiaVALUES *ptr = NULL;

        if( vls == NULL ) {
                return NULL;
        }

        ptr = vls;
        while( ptr != NULL ) {
                if( (key != NULL) && (ptr->key != NULL) && (strcmp(key, ptr->key) == 0) ) {
                        return ptr;
                }
                ptr = ptr->next;
        }
        return NULL;
}


char *eGet_value(eurephiaVALUES *vls, const char *key) 
{
        eurephiaVALUES *ptr = NULL;

        ptr = eGet_valuestruct(vls, key);
        return (ptr != NULL ? ptr->val : NULL);
}


eurephiaVALUES *eCreate_value_space(eurephiaCTX *ctx, int evgid) 
{
        eurephiaVALUES *ptr = NULL;

        DEBUG(ctx, 32, "Function call: eCreate_value_space(ctx, %i)", evgid);

        ptr = (eurephiaVALUES *) malloc(sizeof(eurephiaVALUES) + 2);
        if( ptr == NULL ) {
                eurephia_log(ctx, LOG_PANIC, 0, "Could not allocate memory for a new eurephiaVALUE struct");
                return NULL;
        }
        memset(ptr, 0, sizeof(eurephiaVALUES) + 2);
        ptr->evgid = evgid;
        return ptr;
}


void eAdd_value(eurephiaCTX *ctx, eurephiaVALUES *vls, const char *key, const char *val) 
{
        eurephiaVALUES *ptr = NULL, *ptr2 = NULL;
        int vid = 0;
        
        DEBUG(ctx, 31, "Function call: eAdd_value(ctx, vls(%i), '%s', '%s')",
              (vls != NULL ? vls->evid : -1), key, val);

        // Allocate buffer and safe values
        ptr = eCreate_value_space(ctx, vls->evid);
        if( ptr == NULL ) {
                eurephia_log(ctx, LOG_FATAL, 0, "Could not add the new value");
                return;
        }
        ptr->key = strdup_nullsafe(key);
        ptr->val = strdup_nullsafe(val);
        ptr->evgid = vls->evgid;

        // Add values to the value chain, loop to the end and append it
        ptr2 = vls;
        while( ptr2->next != NULL ) {
                vid = ptr2->evid;
                ptr2 = ptr2->next;
        }
        ptr->evid = vid+1; // Increase the value counter
        ptr2->next = ptr;
}


void do_free_vals(eurephiaVALUES *vls) {
        if( vls->next != NULL ) {
                do_free_vals(vls->next);
        }
        free_nullsafe(vls->key);
        free_nullsafe(vls->val);
        free_nullsafe(vls);
}

void eFree_values_func(eurephiaCTX *ctx, eurephiaVALUES *vls) {
        DEBUG(ctx, 31, "Function call: eFree_values(ctx, vls(%i))",
              (vls != NULL ? vls->evid : -1));
        
        if( (vls == NULL) ) {
                return;
        }
        do_free_vals(vls);
}