diff options
author | David Sommerseth <dazo@users.sourceforge.net> | 2008-11-30 23:15:41 +0100 |
---|---|---|
committer | David Sommerseth <dazo@users.sourceforge.net> | 2008-11-30 23:15:41 +0100 |
commit | d8d51bd786e1a333c07a7d5ab125d4eb73c98b73 (patch) | |
tree | f346fd1a3c7c7809a19e85921a9ef279b1c5ccc8 /common | |
parent | f415e9a4709b35a0d9662a2877f597af6a36796f (diff) | |
download | eurephia-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.c | 81 |
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); -} |