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 120 121 122 123 124 125 126 127 128
|
#include <string.h>
#include <stdlib.h>
#include "gis.h"
struct Key_Value *
G_create_key_value()
{
struct Key_Value *kv;
kv = (struct Key_Value *) malloc (sizeof(struct Key_Value));
if (kv == NULL)
return NULL;
kv->nitems = 0;
kv->nalloc = 0;
kv->key = (char **) NULL;
kv->value = (char **) NULL;
return kv;
}
/* if key has spaces in it, this will break the logic
* so rule is: NO SPACES IN key
* returns 0 - no memory
* 1 - ok, but key was NULL or "" so ignored
* 2 - ok
*/
int G_set_key_value (
char *key,char *value,
struct Key_Value *kv)
{
int n;
int size;
if (key == NULL || key == 0)
return 1;
for (n = 0; n < kv->nitems; n++)
if (strcmp(key, kv->key[n]) == 0)
break;
if (n == kv->nitems)
{
if (n >= kv->nalloc)
{
if (kv->nalloc <= 0)
{
kv->nalloc = 8;
size = kv->nalloc * sizeof (char *);
kv->key = (char **) malloc (size);
kv->value = (char **) malloc (size);
}
else
{
kv->nalloc *= 2;
size = kv->nalloc * sizeof (char *);
kv->key = (char **) realloc (kv->key, size);
kv->value = (char **) realloc (kv->value, size);
}
if (kv->key == NULL || kv->value == NULL)
{
if (kv->key)
{
free (kv->key);
kv->key = NULL;
}
if (kv->value)
{
free (kv->value);
kv->value = NULL;
}
kv->nitems = kv->nalloc = 0;
return 0;
}
}
kv->value[n] = NULL;
kv->key[n] = malloc(strlen(key)+1);
if (kv->key[n] == NULL)
return 0;
strcpy (kv->key[n], key);
kv->nitems++;
}
if (value == NULL)
size = 0;
else
size = strlen(value);
if (kv->value[n] != NULL)
free(kv->value[n]);
if (size > 0)
{
kv->value[n] = malloc (size+1);
if (kv->value[n] == NULL)
return 0;
strcpy (kv->value[n], value);
}
else
kv->value[n] = NULL;
return 2;
}
char *G_find_key_value (char *key, struct Key_Value *kv)
{
int n;
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;
}
int G_free_key_value(struct Key_Value *kv)
{
int n;
for (n = 0; n < kv->nitems; n++)
{
free (kv->key[n]);
free (kv->value[n]);
}
free (kv->key);
free (kv->value);
kv->nitems = 0; /* just for safe measure */
kv->nalloc = 0;
free (kv);
return 0;
}
|