summaryrefslogtreecommitdiffstats
path: root/eurephia_values.c
blob: 4a7186a0a2eb8d701cbfdf1750d0d837d77c51f9 (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
/* eurephia_values.c  --  Generic interface for processing key->value pairs

 */

#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;

        eurephia_log(ctx, LOG_DEBUG, 12, "Function call: eDBcreate_value_space(ctx)");

        ptr = (eurephiaVALUES *) malloc(sizeof(eurephiaVALUES) + 2);
        if( ptr == NULL ) {
                eurephia_log(ctx, LOG_FATAL, 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;
        
        eurephia_log(ctx, LOG_DEBUG, 12, "Function call: eDBadd_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 eFree_values_func(eurephiaCTX *ctx, eurephiaVALUES *vls) {
        eurephiaVALUES *ptr = NULL, *tmp = NULL;
        
        if( (vls == NULL) ) {
                return;
        }

        ptr = vls;
        while( ptr != NULL ) {
                free_nullsafe(ptr->key);
                free_nullsafe(ptr->val);
                tmp = ptr->next;
                free_nullsafe(ptr);
                ptr = tmp;
        }
}