r15940 - gnucash/trunk/src - Fix crasher in variable handling in SX editor. Be more consistent about alloc'ed memory ownership. Some formatting cleanups.

Josh Sled jsled at cvs.gnucash.org
Fri Apr 20 11:34:59 EDT 2007


Author: jsled
Date: 2007-04-20 11:34:58 -0400 (Fri, 20 Apr 2007)
New Revision: 15940
Trac: http://svn.gnucash.org/trac/changeset/15940

Modified:
   gnucash/trunk/src/app-utils/gnc-sx-instance-model.c
   gnucash/trunk/src/gnome/dialog-sx-editor.c
Log:
Fix crasher in variable handling in SX editor.  Be more consistent about alloc'ed memory ownership.  Some formatting cleanups.


Modified: gnucash/trunk/src/app-utils/gnc-sx-instance-model.c
===================================================================
--- gnucash/trunk/src/app-utils/gnc-sx-instance-model.c	2007-04-19 12:58:50 UTC (rev 15939)
+++ gnucash/trunk/src/app-utils/gnc-sx-instance-model.c	2007-04-20 15:34:58 UTC (rev 15940)
@@ -63,7 +63,7 @@
 static void
 _sx_var_to_raw_numeric(gchar *name, GncSxVariable *var, GHashTable *parser_var_hash)
 {
-    g_hash_table_insert(parser_var_hash, name, &var->value);
+    g_hash_table_insert(parser_var_hash, g_strdup(name), &var->value);
 }
 
 static void
@@ -73,7 +73,7 @@
     if (!g_hash_table_lookup_extended(sx_var_hash, name, NULL, &p_var))
     {
         p_var = (gpointer)gnc_sx_variable_new(name);
-        g_hash_table_insert(sx_var_hash, name, p_var);
+        g_hash_table_insert(sx_var_hash, g_strdup(name), p_var);
     }
     ((GncSxVariable*)p_var)->value = *num;
 }
@@ -209,7 +209,7 @@
                             gnc_commodity_get_mnemonic(split_cmdty),
                             gnc_commodity_get_mnemonic(first_cmdty));
             var = gnc_sx_variable_new(g_strdup(var_name->str));
-            g_hash_table_insert(var_hash, var->name, var);
+            g_hash_table_insert(var_hash, g_strdup(var->name), var);
             g_string_free(var_name, TRUE);
         }
 
@@ -285,7 +285,7 @@
     GHashTable *to = (GHashTable*)user_data;
     GncSxVariable *to_copy = (GncSxVariable*)value;
     GncSxVariable *var = gnc_sx_variable_new_copy(to_copy);
-    g_hash_table_insert(to, key, var);
+    g_hash_table_insert(to, g_strdup(key), var);
 }
 
 static GncSxInstance*
@@ -301,15 +301,13 @@
 
     if (! parent->variable_names_parsed)
     {
-        parent->variable_names = g_hash_table_new_full(
-            g_str_hash, g_str_equal, g_free, (GDestroyNotify)gnc_sx_variable_free);
+        parent->variable_names = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)gnc_sx_variable_free);
         gnc_sx_get_variables(parent->sx, parent->variable_names);
         g_hash_table_foreach(parent->variable_names, (GHFunc)_wipe_parsed_sx_var, NULL);
         parent->variable_names_parsed = TRUE;
     }
 
-    rtn->variable_bindings = g_hash_table_new_full(
-        g_str_hash, g_str_equal, NULL, (GDestroyNotify)gnc_sx_variable_free);
+    rtn->variable_bindings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)gnc_sx_variable_free);
     g_hash_table_foreach(parent->variable_names, _clone_sx_var_hash_entry, rtn->variable_bindings);
 
     {
@@ -321,7 +319,7 @@
         i_num = gnc_numeric_create(instance_i_value, 1);
         as_var = gnc_sx_variable_new_full("i", i_num, FALSE);
 
-        g_hash_table_insert(rtn->variable_bindings, "i", as_var);
+        g_hash_table_insert(rtn->variable_bindings, g_strdup("i"), as_var);
     }
 
     return rtn;
@@ -926,7 +924,7 @@
 }
 
 static void
-_get_sx_formula(GncSxInstance *instance, Split *template_split, gnc_numeric *numeric, GList **creation_errors, const char *formula_key)
+_get_sx_formula_value(GncSxInstance *instance, Split *template_split, gnc_numeric *numeric, GList **creation_errors, const char *formula_key)
 {
     kvp_frame *split_kvpf;
     kvp_value *kvp_val;
@@ -955,7 +953,7 @@
                             gnc_exp_parser_error_string());
             *creation_errors = g_list_append(*creation_errors, err);
         }
-
+        
         if (parser_vars != NULL)
         {
             g_hash_table_destroy(parser_vars);
@@ -964,15 +962,15 @@
 }
 
 static void
-_get_credit_formula(GncSxInstance *instance, Split *template_split, gnc_numeric *credit_num, GList **creation_errors)
+_get_credit_formula_value(GncSxInstance *instance, Split *template_split, gnc_numeric *credit_num, GList **creation_errors)
 {
-    _get_sx_formula(instance, template_split, credit_num, creation_errors, GNC_SX_CREDIT_FORMULA);
+    _get_sx_formula_value(instance, template_split, credit_num, creation_errors, GNC_SX_CREDIT_FORMULA);
 }
 
 static void
-_get_debit_formula(GncSxInstance *instance, Split *template_split, gnc_numeric *debit_num, GList **creation_errors)
+_get_debit_formula_value(GncSxInstance *instance, Split *template_split, gnc_numeric *debit_num, GList **creation_errors)
 {
-    _get_sx_formula(instance, template_split, debit_num, creation_errors, GNC_SX_DEBIT_FORMULA);
+    _get_sx_formula_value(instance, template_split, debit_num, creation_errors, GNC_SX_DEBIT_FORMULA);
 }
 
 static gboolean
@@ -1054,8 +1052,8 @@
             credit_num = gnc_numeric_zero();
             debit_num = gnc_numeric_zero();
 
-            _get_credit_formula(creation_data->instance, template_split, &credit_num, creation_data->creation_errors);
-            _get_debit_formula(creation_data->instance, template_split, &debit_num, creation_data->creation_errors);
+            _get_credit_formula_value(creation_data->instance, template_split, &credit_num, creation_data->creation_errors);
+            _get_debit_formula_value(creation_data->instance, template_split, &debit_num, creation_data->creation_errors);
                        
             final = gnc_numeric_sub_fixed( debit_num, credit_num );
                         

Modified: gnucash/trunk/src/gnome/dialog-sx-editor.c
===================================================================
--- gnucash/trunk/src/gnome/dialog-sx-editor.c	2007-04-19 12:58:50 UTC (rev 15939)
+++ gnucash/trunk/src/gnome/dialog-sx-editor.c	2007-04-20 15:34:58 UTC (rev 15940)
@@ -231,15 +231,13 @@
                                      sxed );
 }
 
-static
-void
+static void
 editor_help_button_clicked(GtkButton *b, GncSxEditorDialog *sxed)
 {
     gnc_gnome_help(HF_HELP, HL_SXEDITOR);
 }
 
-static
-void
+static void
 editor_ok_button_clicked( GtkButton *b, GncSxEditorDialog *sxed )
 {
     GNCBook *book;
@@ -457,16 +455,6 @@
     tcds->debitSum  = gnc_numeric_zero();
 }
 
-static
-void
-free_sums( gpointer key,
-           gpointer val,
-           gpointer ud )
-{
-    txnCreditDebitSums *tcds = (txnCreditDebitSums*)val;
-    g_free( tcds );
-}
-
 static void
 check_credit_debit_balance( gpointer key,
                             gpointer val,
@@ -503,8 +491,7 @@
  * Checks to make sure that the SX is in a reasonable state to save.
  * @return true if checks out okay, false otherwise.
  **/
-static
-gboolean
+static gboolean
 gnc_sxed_check_consistent( GncSxEditorDialog *sxed )
 {
     gboolean multi_commodity = FALSE;
@@ -549,8 +536,8 @@
         gpointer unusedKey, unusedValue;
 
         unbalanceable = FALSE; /* innocent until proven guilty */
-        vars = g_hash_table_new( g_str_hash, g_str_equal );
-        txns = g_hash_table_new( g_direct_hash, g_direct_equal );
+        vars = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)gnc_sx_variable_free);
+        txns = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free);
         numIters = NUM_ITERS_NO_VARS;
         /**
          * Plan:
@@ -693,12 +680,9 @@
             ttVarCount -= 1;
         }
 
-        g_hash_table_foreach(vars, (GHFunc)gnc_sx_variable_free, NULL);
         g_hash_table_destroy(vars);
+        g_hash_table_destroy(txns);
 
-        g_hash_table_foreach( txns, free_sums, NULL );
-        g_hash_table_destroy( txns );
-
         if ( unbalanceable
              && !gnc_verify_dialog( sxed->dialog, FALSE,
                                     "%s",
@@ -868,8 +852,7 @@
  * Saves the contents of the SX.  This assumes that gnc_sxed_check_consistent
  * has returned true.
  **/
-static
-void
+static void
 gnc_sxed_save_sx( GncSxEditorDialog *sxed )
 {
     /* name */



More information about the gnucash-changes mailing list