File: key_value1.c

package info (click to toggle)
grass 6.0.2-6
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 40,044 kB
  • ctags: 31,303
  • sloc: ansic: 321,125; tcl: 25,676; sh: 11,176; cpp: 10,098; makefile: 5,025; fortran: 1,846; yacc: 493; lex: 462; perl: 133; sed: 1
file content (128 lines) | stat: -rw-r--r-- 2,382 bytes parent folder | download | duplicates (2)
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;
}