GRASS Programmer's Manual
6.4.1(2011)
|
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 }