Go to the documentation of this file.00001
00016 #include <string.h>
00017 #include <stdlib.h>
00018 #include <grass/gis.h>
00019
00025 struct Key_Value *G_create_key_value(void)
00026 {
00027 struct Key_Value *kv;
00028
00029 kv = (struct Key_Value *)G_malloc(sizeof(struct Key_Value));
00030 if (kv == NULL)
00031 return NULL;
00032
00033 kv->nitems = 0;
00034 kv->nalloc = 0;
00035 kv->key = (char **)NULL;
00036 kv->value = (char **)NULL;
00037
00038 return kv;
00039 }
00040
00055 int G_set_key_value(const char *key, const char *value, struct Key_Value *kv)
00056 {
00057 int n;
00058 int size;
00059
00060 if (key == NULL || key == 0)
00061 return 1;
00062
00063 for (n = 0; n < kv->nitems; n++)
00064 if (strcmp(key, kv->key[n]) == 0)
00065 break;
00066
00067 if (n == kv->nitems) {
00068 if (n >= kv->nalloc) {
00069 if (kv->nalloc <= 0) {
00070 kv->nalloc = 8;
00071 size = kv->nalloc * sizeof(char *);
00072 kv->key = (char **)G_malloc(size);
00073 kv->value = (char **)G_malloc(size);
00074 }
00075 else {
00076 kv->nalloc *= 2;
00077 size = kv->nalloc * sizeof(char *);
00078 kv->key = (char **)G_realloc(kv->key, size);
00079 kv->value = (char **)G_realloc(kv->value, size);
00080 }
00081
00082 if (kv->key == NULL || kv->value == NULL) {
00083 if (kv->key) {
00084 G_free(kv->key);
00085 kv->key = NULL;
00086 }
00087 if (kv->value) {
00088 G_free(kv->value);
00089 kv->value = NULL;
00090 }
00091 kv->nitems = kv->nalloc = 0;
00092 return 0;
00093 }
00094 }
00095 kv->value[n] = NULL;
00096 kv->key[n] = G_malloc(strlen(key) + 1);
00097 if (kv->key[n] == NULL)
00098 return 0;
00099 strcpy(kv->key[n], key);
00100 kv->nitems++;
00101 }
00102 if (value == NULL)
00103 size = 0;
00104 else
00105 size = strlen(value);
00106 if (kv->value[n] != NULL)
00107 G_free(kv->value[n]);
00108 if (size > 0) {
00109 kv->value[n] = G_malloc(size + 1);
00110 if (kv->value[n] == NULL)
00111 return 0;
00112 strcpy(kv->value[n], value);
00113 }
00114 else
00115 kv->value[n] = NULL;
00116 return 2;
00117 }
00118
00128 char *G_find_key_value(const char *key, const struct Key_Value *kv)
00129 {
00130 int n;
00131
00132 for (n = 0; n < kv->nitems; n++)
00133 if (strcmp(key, kv->key[n]) == 0)
00134 return kv->value[n][0] ? kv->value[n] : NULL;
00135 return NULL;
00136 }
00137
00145 int G_free_key_value(struct Key_Value *kv)
00146 {
00147 int n;
00148
00149 if (!kv)
00150 return 0;
00151
00152 for (n = 0; n < kv->nitems; n++) {
00153 G_free(kv->key[n]);
00154 G_free(kv->value[n]);
00155 }
00156 G_free(kv->key);
00157 G_free(kv->value);
00158 kv->nitems = 0;
00159 kv->nalloc = 0;
00160 G_free(kv);
00161
00162 return 0;
00163 }