key_value1.c

Go to the documentation of this file.
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 /* if key has spaces in it, this will break the logic 
00023  * so rule is: NO SPACES IN key
00024  * returns 0 - no memory
00025  *         1 - ok, but key was NULL or "" so ignored
00026  *         2 - ok
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; /* just for safe measure */
00124     kv->nalloc = 0;
00125     G_free (kv);
00126 
00127     return 0;
00128 }

Generated on Wed Dec 19 14:59:06 2007 for GRASS by  doxygen 1.5.4