GRASS 8 Programmer's Manual 8.6.0dev(2026)-1878fdfec5
Loading...
Searching...
No Matches
key_value1.c
Go to the documentation of this file.
1/*!
2 \file lib/gis/key_value1.c
3
4 \brief Subroutines for Key/Value management.
5
6 SPDX-FileCopyrightText: 2001-2008, 2012 GRASS Development Team
7 SPDX-License-Identifier: GPL-2.0-or-later
8
9 \author CERL
10 */
11
12#include <string.h>
13#include <stdlib.h>
14#include <grass/gis.h>
15
16/*!
17 \brief Allocate and initialize Key_Value structure
18
19 \return pointer to allocated Key_Value structure
20 */
22{
23 struct Key_Value *kv = G_malloc(sizeof(struct Key_Value));
24
25 G_zero(kv, sizeof(struct Key_Value));
26
27 return kv;
28}
29
30/*!
31 \brief Set value for given key
32
33 \param key key to be set up
34 \param value value for given key
35 \param[in,out] kv Key_value structure to be modified
36 */
37void G_set_key_value(const char *key, const char *value, struct Key_Value *kv)
38{
39 int n;
40
41 if (!key)
42 return;
43
44 for (n = 0; n < kv->nitems; n++)
45 if (strcmp(key, kv->key[n]) == 0)
46 break;
47
48 if (n == kv->nitems) {
49 if (n >= kv->nalloc) {
50 size_t size;
51
52 if (kv->nalloc <= 0)
53 kv->nalloc = 8;
54 else
55 kv->nalloc *= 2;
56
57 size = kv->nalloc * sizeof(char *);
58 kv->key = G_realloc(kv->key, size);
59 kv->value = G_realloc(kv->value, size);
60 }
61
62 kv->key[n] = G_store(key);
63 kv->value[n] = G_store(value);
64 kv->nitems++;
65 return;
66 }
67
68 if (kv->value[n])
69 G_free(kv->value[n]);
70
71 kv->value[n] = value ? G_store(value) : NULL;
72}
73
74/*!
75 \brief Find given key (case sensitive)
76
77 \param key key to be found
78 \param kv pointer to Key_value structure
79
80 \return pointer to value of key
81 \return NULL if no key found
82 */
83const char *G_find_key_value(const char *key, const struct Key_Value *kv)
84{
85 int n;
86
87 if (!kv)
88 return NULL;
89
90 for (n = 0; n < kv->nitems; n++)
91 if (strcmp(key, kv->key[n]) == 0)
92 return kv->value[n][0] ? kv->value[n] : NULL;
93
94 return NULL;
95}
96
97/*!
98 \brief Free allocated Key_Value structure
99
100 \param[in] kv Key_Value structure to be freed
101 */
103{
104 int n;
105
106 if (!kv)
107 return;
108
109 for (n = 0; n < kv->nitems; n++) {
110 G_free(kv->key[n]);
111 G_free(kv->value[n]);
112 }
113 G_free(kv->key);
114 G_free(kv->value);
115 kv->nitems = 0; /* just for safe measure */
116 kv->nalloc = 0;
117 G_free(kv);
118}
#define NULL
Definition ccmath.h:32
void G_zero(void *, int)
Zero out a buffer, buf, of length i.
Definition gis/zero.c:21
void G_free(void *)
Free allocated memory.
Definition gis/alloc.c:145
#define G_realloc(p, n)
Definition defs/gis.h:138
#define G_malloc(n)
Definition defs/gis.h:136
char * G_store(const char *)
Copy string to allocated memory.
Definition strings.c:85
void G_free_key_value(struct Key_Value *kv)
Free allocated Key_Value structure.
Definition key_value1.c:102
void G_set_key_value(const char *key, const char *value, struct Key_Value *kv)
Set value for given key.
Definition key_value1.c:37
const char * G_find_key_value(const char *key, const struct Key_Value *kv)
Find given key (case sensitive)
Definition key_value1.c:83
struct Key_Value * G_create_key_value(void)
Allocate and initialize Key_Value structure.
Definition key_value1.c:21
char ** value
Definition gis.h:535
char ** key
Definition gis.h:534