GRASS Programmer's Manual 6.4.1(2011)
key_value1.c
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;             /* just for safe measure */
00159     kv->nalloc = 0;
00160     G_free(kv);
00161 
00162     return 0;
00163 }
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines