Loading...
Searching...
No Matches
key_value1.c
Go to the documentation of this file.
/*!
\file lib/gis/key_value1.c
\brief Subroutines for Key/Value management.
(C) 2001-2008, 2012 by the GRASS Development Team
This program is free software under the GNU General Public License
(>=v2). Read the file COPYING that comes with GRASS for details.
\author CERL
*/
#include <string.h>
#include <stdlib.h>
#include <grass/gis.h>
/*!
\brief Allocate and initialize Key_Value structure
\return pointer to allocated Key_Value structure
*/
struct Key_Value *G_create_key_value(void)
{
struct Key_Value *kv = G_malloc(sizeof(struct Key_Value));
G_zero(kv, sizeof(struct Key_Value));
return kv;
}
/*!
\brief Set value for given key
\param key key to be set up
\param value value for given key
\param[in,out] kv Key_value structure to be modified
*/
void G_set_key_value(const char *key, const char *value, struct Key_Value *kv)
{
int n;
if (!key)
return;
for (n = 0; n < kv->nitems; n++)
if (strcmp(key, kv->key[n]) == 0)
break;
if (n == kv->nitems) {
if (n >= kv->nalloc) {
size_t size;
if (kv->nalloc <= 0)
kv->nalloc = 8;
else
kv->nalloc *= 2;
size = kv->nalloc * sizeof(char *);
kv->key = G_realloc(kv->key, size);
kv->value = G_realloc(kv->value, size);
}
kv->key[n] = G_store(key);
kv->value[n] = G_store(value);
kv->nitems++;
return;
}
if (kv->value[n])
G_free(kv->value[n]);
kv->value[n] = value ? G_store(value) : NULL;
}
/*!
\brief Find given key (case sensitive)
\param key key to be found
\param kv pointer to Key_value structure
\return pointer to value of key
\return NULL if no key found
*/
const char *G_find_key_value(const char *key, const struct Key_Value *kv)
{
int n;
if (!kv)
return NULL;
for (n = 0; n < kv->nitems; n++)
if (strcmp(key, kv->key[n]) == 0)
return kv->value[n][0] ? kv->value[n] : NULL;
return NULL;
}
/*!
\brief Free allocated Key_Value structure
\param[in] kv Key_Value structure to be freed
*/
void G_free_key_value(struct Key_Value *kv)
{
int n;
if (!kv)
return;
for (n = 0; n < kv->nitems; n++) {
G_free(kv->key[n]);
G_free(kv->value[n]);
}
G_free(kv->key);
G_free(kv->value);
kv->nitems = 0; /* just for safe measure */
kv->nalloc = 0;
G_free(kv);
}
G_free
void G_free(void *buf)
Free allocated memory.
Definition alloc.c:147
NULL
#define NULL
Definition ccmath.h:32
G_free_key_value
void G_free_key_value(struct Key_Value *kv)
Free allocated Key_Value structure.
Definition key_value1.c:104
G_set_key_value
void G_set_key_value(const char *key, const char *value, struct Key_Value *kv)
Set value for given key.
Definition key_value1.c:39
G_find_key_value
const char * G_find_key_value(const char *key, const struct Key_Value *kv)
Find given key (case sensitive).
Definition key_value1.c:85
G_create_key_value
struct Key_Value * G_create_key_value(void)
Allocate and initialize Key_Value structure.
Definition key_value1.c:23
G_store
char * G_store(const char *s)
Copy string to allocated memory.
Definition strings.c:87
G_zero
void G_zero(void *buf, int i)
Zero out a buffer, buf, of length i.
Definition zero.c:23