00001 #include <string.h>
00002 #include <stdlib.h>
00003 #include <grass/gis.h>
00004
00005 struct Key_Value *
00006 G_create_key_value()
00007 {
00008 struct Key_Value *kv;
00009
00010 kv = (struct Key_Value *) G_malloc (sizeof(struct Key_Value));
00011 if (kv == NULL)
00012 return NULL;
00013
00014 kv->nitems = 0;
00015 kv->nalloc = 0;
00016 kv->key = (char **) NULL;
00017 kv->value = (char **) NULL;
00018
00019 return kv;
00020 }
00021
00022
00023
00024
00025
00026
00027
00028 int G_set_key_value (
00029 const char *key, const char *value,
00030 struct Key_Value *kv)
00031 {
00032 int n;
00033 int size;
00034
00035 if (key == NULL || key == 0)
00036 return 1;
00037
00038 for (n = 0; n < kv->nitems; n++)
00039 if (strcmp(key, kv->key[n]) == 0)
00040 break;
00041
00042 if (n == kv->nitems)
00043 {
00044 if (n >= kv->nalloc)
00045 {
00046 if (kv->nalloc <= 0)
00047 {
00048 kv->nalloc = 8;
00049 size = kv->nalloc * sizeof (char *);
00050 kv->key = (char **) G_malloc (size);
00051 kv->value = (char **) G_malloc (size);
00052 }
00053 else
00054 {
00055 kv->nalloc *= 2;
00056 size = kv->nalloc * sizeof (char *);
00057 kv->key = (char **) G_realloc (kv->key, size);
00058 kv->value = (char **) G_realloc (kv->value, size);
00059 }
00060
00061 if (kv->key == NULL || kv->value == NULL)
00062 {
00063 if (kv->key)
00064 {
00065 G_free (kv->key);
00066 kv->key = NULL;
00067 }
00068 if (kv->value)
00069 {
00070 G_free (kv->value);
00071 kv->value = NULL;
00072 }
00073 kv->nitems = kv->nalloc = 0;
00074 return 0;
00075 }
00076 }
00077 kv->value[n] = NULL;
00078 kv->key[n] = G_malloc (strlen(key)+1);
00079 if (kv->key[n] == NULL)
00080 return 0;
00081 strcpy (kv->key[n], key);
00082 kv->nitems++;
00083 }
00084 if (value == NULL)
00085 size = 0;
00086 else
00087 size = strlen(value);
00088 if (kv->value[n] != NULL)
00089 G_free (kv->value[n]);
00090 if (size > 0)
00091 {
00092 kv->value[n] = G_malloc (size+1);
00093 if (kv->value[n] == NULL)
00094 return 0;
00095 strcpy (kv->value[n], value);
00096 }
00097 else
00098 kv->value[n] = NULL;
00099 return 2;
00100 }
00101
00102 char *G_find_key_value (char *key, struct Key_Value *kv)
00103 {
00104 int n;
00105
00106 for (n = 0; n < kv->nitems; n++)
00107 if (strcmp (key, kv->key[n]) == 0)
00108 return kv->value[n][0] ? kv->value[n] : NULL;
00109 return NULL;
00110 }
00111
00112 int G_free_key_value(struct Key_Value *kv)
00113 {
00114 int n;
00115
00116 for (n = 0; n < kv->nitems; n++)
00117 {
00118 G_free (kv->key[n]);
00119 G_free (kv->value[n]);
00120 }
00121 G_free (kv->key);
00122 G_free (kv->value);
00123 kv->nitems = 0;
00124 kv->nalloc = 0;
00125 G_free (kv);
00126
00127 return 0;
00128 }