summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorDavid Sommerseth <dazo@users.sourceforge.net>2008-11-30 23:15:41 +0100
committerDavid Sommerseth <dazo@users.sourceforge.net>2008-11-30 23:15:41 +0100
commitd8d51bd786e1a333c07a7d5ab125d4eb73c98b73 (patch)
treef346fd1a3c7c7809a19e85921a9ef279b1c5ccc8 /common
parentf415e9a4709b35a0d9662a2877f597af6a36796f (diff)
downloadeurephia-d8d51bd786e1a333c07a7d5ab125d4eb73c98b73.tar.gz
eurephia-d8d51bd786e1a333c07a7d5ab125d4eb73c98b73.tar.xz
eurephia-d8d51bd786e1a333c07a7d5ab125d4eb73c98b73.zip
BUGFIX: Fixed several errors in eurephia_values.c
- DEBUG logging now shows proper evgid value - evid is correctly incremented for each record - Rewrote eAdd_valuestruct(...) function to avoid empty pointer head.
Diffstat (limited to 'common')
-rw-r--r--common/eurephia_values.c81
1 files changed, 47 insertions, 34 deletions
diff --git a/common/eurephia_values.c b/common/eurephia_values.c
index fad9eb6..f281dc7 100644
--- a/common/eurephia_values.c
+++ b/common/eurephia_values.c
@@ -20,23 +20,43 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <assert.h>
#include <eurephia_nullsafe.h>
#include <eurephia_context.h>
#include <eurephia_log.h>
+void do_free_vals(eurephiaVALUES *vls) {
+ if( vls->next != NULL ) {
+ do_free_vals(vls->next);
+ }
+ free_nullsafe(vls->key);
+ free_nullsafe(vls->val);
+ free_nullsafe(vls);
+}
+
+void eFree_values_func(eurephiaCTX *ctx, eurephiaVALUES *vls) {
+ DEBUG(ctx, 31, "Function call: eFree_values(ctx, vls(%i))",
+ (vls != NULL ? vls->evid : -1));
+
+ if( (vls == NULL) ) {
+ return;
+ }
+ do_free_vals(vls);
+}
+
eurephiaVALUES *eGet_valuestruct(eurephiaVALUES *vls, const char *key)
{
eurephiaVALUES *ptr = NULL;
- if( vls == NULL ) {
+ if( (vls == NULL) || (key == NULL) ) {
return NULL;
}
ptr = vls;
while( ptr != NULL ) {
- if( (key != NULL) && (ptr->key != NULL) && (strcmp(key, ptr->key) == 0) ) {
+ if( (ptr->key != NULL) && (strcmp(key, ptr->key) == 0) ) {
return ptr;
}
ptr = ptr->next;
@@ -76,17 +96,28 @@ void eAdd_valuestruct(eurephiaCTX *ctx, eurephiaVALUES *vls, eurephiaVALUES *new
int vid = 0;
DEBUG(ctx, 31, "Function call: eAdd_valuestruct(ctx, vls(%i), '%s', '%s')",
- (vls != NULL ? vls->evid : -1), newval->key, newval->val);
-
- // Add values to the value chain, loop to the end and append it
- ptr = vls;
- while( ptr->next != NULL ) {
- vid = ptr->evid;
- ptr = ptr->next;
+ (vls != NULL ? vls->evgid : -1), newval->key, newval->val);
+
+ assert(vls != NULL);
+
+ if( (vls->key == NULL) && (vls->val == NULL) && (vls->next == NULL) && (vls->evid == 0)) {
+ // Update header record if it is empty, by copying newval record. Free newval afterwards
+ vls->key = strdup(newval->key);
+ vls->val = strdup(newval->val);
+ vls->evid = 0;
+ vls->next = NULL;
+ do_free_vals(newval);
+ } else {
+ // Add values to the value chain, loop to the end and append it
+ ptr = vls;
+ while( ptr->next != NULL ) {
+ ptr = ptr->next;
+ vid = (vid > ptr->evid ? vid : ptr->evid);
+ }
+ newval->evid = vid+1; // Increase the value counter
+ newval->evgid = ptr->evgid;
+ ptr->next = newval;
}
- newval->evid = vid+1; // Increase the value counter
- newval->evid = ptr->evid;
- ptr->next = newval;
}
void eAdd_value(eurephiaCTX *ctx, eurephiaVALUES *vls, const char *key, const char *val)
@@ -94,9 +125,11 @@ void eAdd_value(eurephiaCTX *ctx, eurephiaVALUES *vls, const char *key, const ch
eurephiaVALUES *ptr = NULL;
DEBUG(ctx, 31, "Function call: eAdd_value(ctx, vls(%i), '%s', '%s')",
- (vls != NULL ? vls->evid : -1), key, val);
+ (vls != NULL ? vls->evgid : -1), key, val);
+
+ assert(vls != NULL);
- // Allocate buffer and safe values
+ // Allocate buffer and save values
ptr = eCreate_value_space(ctx, vls->evid);
if( ptr == NULL ) {
eurephia_log(ctx, LOG_FATAL, 0, "Could not add the new value");
@@ -109,23 +142,3 @@ void eAdd_value(eurephiaCTX *ctx, eurephiaVALUES *vls, const char *key, const ch
// Add value struct to the chain
eAdd_valuestruct(ctx, vls, ptr);
}
-
-
-void do_free_vals(eurephiaVALUES *vls) {
- if( vls->next != NULL ) {
- do_free_vals(vls->next);
- }
- free_nullsafe(vls->key);
- free_nullsafe(vls->val);
- free_nullsafe(vls);
-}
-
-void eFree_values_func(eurephiaCTX *ctx, eurephiaVALUES *vls) {
- DEBUG(ctx, 31, "Function call: eFree_values(ctx, vls(%i))",
- (vls != NULL ? vls->evid : -1));
-
- if( (vls == NULL) ) {
- return;
- }
- do_free_vals(vls);
-}