gnucash maint: Multiple changes pushed

Christopher Lam clam at code.gnucash.org
Wed Feb 24 07:34:24 EST 2021


Updated	 via  https://github.com/Gnucash/gnucash/commit/686f842c (commit)
	 via  https://github.com/Gnucash/gnucash/commit/422c151a (commit)
	 via  https://github.com/Gnucash/gnucash/commit/f743f24e (commit)
	 via  https://github.com/Gnucash/gnucash/commit/b767d160 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/e79db92d (commit)
	 via  https://github.com/Gnucash/gnucash/commit/0a22f688 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/b2b87921 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/b73cacd5 (commit)
	from  https://github.com/Gnucash/gnucash/commit/910da534 (commit)



commit 686f842c3d6d14a9e7c17222c16a22e00ce435c6
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Wed Feb 24 20:25:30 2021 +0800

    Bug 798135 - GtkEntry text with search list: shows selected entry again for no reason
    
    Because setting the GtkEntry to inline completion gtk_entry_completion_set_inline_completion (completion, TRUE)

diff --git a/gnucash/gnome-search/gnc-general-search.c b/gnucash/gnome-search/gnc-general-search.c
index deed45287..8e4ab873a 100644
--- a/gnucash/gnome-search/gnc-general-search.c
+++ b/gnucash/gnome-search/gnc-general-search.c
@@ -398,7 +398,6 @@ create_children (GNCGeneralSearch *gsl,
     completion = gtk_entry_completion_new();
     gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(list_store));
     gtk_entry_completion_set_text_column(completion, 0);
-    gtk_entry_completion_set_inline_completion(completion, TRUE);
     gtk_entry_set_completion(GTK_ENTRY(gsl->entry), completion);
 
     g_signal_connect (G_OBJECT (completion), "match_selected",
diff --git a/gnucash/gnome-utils/gnc-gtk-utils.c b/gnucash/gnome-utils/gnc-gtk-utils.c
index f8bcaea1c..2dca606f5 100644
--- a/gnucash/gnome-utils/gnc-gtk-utils.c
+++ b/gnucash/gnome-utils/gnc-gtk-utils.c
@@ -178,7 +178,6 @@ gnc_cbwe_add_completion (GtkComboBox *cbwe)
     model = gtk_combo_box_get_model(GTK_COMBO_BOX(cbwe));
     gtk_entry_completion_set_model(completion, model);
     gtk_entry_completion_set_text_column(completion, 0);
-    gtk_entry_completion_set_inline_completion(completion, TRUE);
     gtk_entry_set_completion(entry, completion);
     g_object_unref(completion);
 }

commit 422c151a0378537bae8603fc846b9c33bb0c8576
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Feb 22 20:50:48 2021 +0800

    [window-main-summarybar.c] use g_list_free_full

diff --git a/gnucash/gnome-utils/window-main-summarybar.c b/gnucash/gnome-utils/window-main-summarybar.c
index a1f39da52..4765ea62a 100644
--- a/gnucash/gnome-utils/window-main-summarybar.c
+++ b/gnucash/gnome-utils/window-main-summarybar.c
@@ -432,14 +432,7 @@ gnc_main_window_summary_refresh (GNCMainSummary * summary)
         gtk_combo_box_set_active(GTK_COMBO_BOX(summary->totals_combo), 0);
     }
 
-    /* Free the list we created for this */
-    for (current = g_list_first(currency_list);
-            current;
-            current = g_list_next(current))
-    {
-        g_free(current->data);
-    }
-    g_list_free(currency_list);
+    g_list_free_full (currency_list, g_free);
 }
 
 static gchar*

commit f743f24e7ed4b5bbc7916d9c301e06ca4177a7dd
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Feb 22 19:00:11 2021 +0800

    [gnc-tree-model-split-reg.c] don't call g_list_length
    
    use model->number_of_trans_in_full_tlist instead which has already
    stored the length.

diff --git a/gnucash/gnome-utils/gnc-tree-model-split-reg.c b/gnucash/gnome-utils/gnc-tree-model-split-reg.c
index 32167941f..943a43c9c 100644
--- a/gnucash/gnome-utils/gnc-tree-model-split-reg.c
+++ b/gnucash/gnome-utils/gnc-tree-model-split-reg.c
@@ -638,7 +638,7 @@ gnc_tree_model_split_reg_load (GncTreeModelSplitReg *model, GList *slist, Accoun
 
     model->number_of_trans_in_full_tlist = g_list_length (priv->full_tlist);
 
-    if (g_list_length (priv->full_tlist) < NUM_OF_TRANS*3)
+    if (model->number_of_trans_in_full_tlist < NUM_OF_TRANS*3)
     {
         // Copy the full_tlist to tlist
         priv->tlist = g_list_copy (priv->full_tlist);
@@ -647,8 +647,11 @@ gnc_tree_model_split_reg_load (GncTreeModelSplitReg *model, GList *slist, Accoun
     {
         if (model->position_of_trans_in_full_tlist < (NUM_OF_TRANS*3))
             gtm_sr_reg_load (model, VIEW_HOME, NUM_OF_TRANS*3);
-        else if (model->position_of_trans_in_full_tlist > g_list_length (priv->full_tlist) - (NUM_OF_TRANS*3))
+
+        else if (model->position_of_trans_in_full_tlist >
+                 model->number_of_trans_in_full_tlist - (NUM_OF_TRANS*3))
             gtm_sr_reg_load (model, VIEW_END, NUM_OF_TRANS*3);
+
         else
             gtm_sr_reg_load (model, VIEW_GOTO, model->position_of_trans_in_full_tlist);
     }

commit b767d16059d8f40f9cec6ab92bad8f961278bacc
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Feb 22 18:59:02 2021 +0800

    [gnc-tree-model-split-reg.c] use xaccSplitListGetUniqueTransactionsReversed
    
    which is then reversed if required. this removes the need for double
    reversal.

diff --git a/gnucash/gnome-utils/gnc-tree-model-split-reg.c b/gnucash/gnome-utils/gnc-tree-model-split-reg.c
index dbfa7d2ad..32167941f 100644
--- a/gnucash/gnome-utils/gnc-tree-model-split-reg.c
+++ b/gnucash/gnome-utils/gnc-tree-model-split-reg.c
@@ -624,25 +624,14 @@ gnc_tree_model_split_reg_load (GncTreeModelSplitReg *model, GList *slist, Accoun
     if (model->current_trans == NULL)
         model->current_trans = priv->btrans;
 
-    if (model->sort_direction == GTK_SORT_ASCENDING)
-    {
-        /* Get a list of Unique Transactions from an slist */
-        priv->full_tlist = xaccSplitListGetUniqueTransactions (slist);
-
-        /* Add the blank transaction to the full_tlist */
-        priv->full_tlist = g_list_append (priv->full_tlist, priv->btrans);
-    }
-    else
-    {
-        /* Get a list of Unique Transactions from an slist */
-        priv->full_tlist = xaccSplitListGetUniqueTransactions (slist);
+    /* Get a list of Unique Transactions from an slist */
+    priv->full_tlist = xaccSplitListGetUniqueTransactionsReversed (slist);
 
-        /* Add the blank transaction to the full_tlist */
-        priv->full_tlist = g_list_append (priv->full_tlist, priv->btrans);
+    /* Add the blank transaction to the full_tlist */
+    priv->full_tlist = g_list_prepend (priv->full_tlist, priv->btrans);
 
-        /* Reverse the full_tlist */
+    if (model->sort_direction == GTK_SORT_ASCENDING)
         priv->full_tlist = g_list_reverse (priv->full_tlist);
-    }
 
     // Update the scrollbar
     gnc_tree_model_split_reg_sync_scrollbar (model);

commit e79db92d8d1ec067e629247b32a8d674ffceb4e7
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Feb 22 18:17:02 2021 +0800

    [Split.c] xaccSplitListGetUniqueTransactionsReversed
    
    Same as xaccSplitListGetUniqueTransactions but doesn't reverse the
    list prior to returning. To be used by gnc-tree-model-split-reg.c
    
    Several optimizations
    
    * doesn't call g_list_find and g_list_append for every iteration
    * uses g_hash_table to cache list of txns already added instead of g_list_find
    * does not reverse the result, thereby returning a reversed list.

diff --git a/libgnucash/engine/Split.c b/libgnucash/engine/Split.c
index 4f74b3709..5b3ecd6a3 100644
--- a/libgnucash/engine/Split.c
+++ b/libgnucash/engine/Split.c
@@ -893,21 +893,32 @@ xaccSplitEqual(const Split *sa, const Split *sb,
  * xaccSplitListGetUniqueTransactions
  ********************************************************************/
 GList *
-xaccSplitListGetUniqueTransactions(const GList *splits)
+xaccSplitListGetUniqueTransactionsReversed (const GList *splits)
 {
-    const GList *snode;
+    GHashTable *txn_hash = g_hash_table_new (NULL, NULL);
     GList *transList = NULL;
+    const GList *snode;
 
-    for(snode = splits; snode; snode = snode->next)
+    for (snode = splits; snode; snode = snode->next)
     {
         Transaction *trans = xaccSplitGetParent((Split *)(snode->data));
 
-        GList *item = g_list_find (transList, trans);
-        if (item == NULL)
-            transList = g_list_append (transList, trans);
+        if (g_hash_table_contains (txn_hash, trans))
+            continue;
+
+        g_hash_table_insert (txn_hash, trans, NULL);
+        transList = g_list_prepend (transList, trans);
     }
+    g_hash_table_destroy (txn_hash);
     return transList;
 }
+
+GList *
+xaccSplitListGetUniqueTransactions(const GList *splits)
+{
+    return g_list_reverse (xaccSplitListGetUniqueTransactionsReversed (splits));
+}
+
 /*################## Added for Reg2 #################*/
 
 
diff --git a/libgnucash/engine/Split.h b/libgnucash/engine/Split.h
index 7f2e2025f..fffc8409c 100644
--- a/libgnucash/engine/Split.h
+++ b/libgnucash/engine/Split.h
@@ -359,6 +359,7 @@ Split      * xaccSplitLookup (const GncGUID *guid, QofBook *book);
 
 /*################## Added for Reg2 #################*/
 /* Get a GList of unique transactions containing the given list of Splits. */
+GList *xaccSplitListGetUniqueTransactionsReversed (const GList *splits);
 GList *xaccSplitListGetUniqueTransactions(const GList *splits);
 /*################## Added for Reg2 #################*/
 /** Add a peer split to this split's lot-split list.

commit 0a22f688a64271ec12c2937558d83a0f4b5c62fd
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Feb 22 18:16:16 2021 +0800

    plug memory leaks

diff --git a/gnucash/gnome/dialog-lot-viewer.c b/gnucash/gnome/dialog-lot-viewer.c
index f9e004fbc..8413b9c1f 100644
--- a/gnucash/gnome/dialog-lot-viewer.c
+++ b/gnucash/gnome/dialog-lot-viewer.c
@@ -234,6 +234,7 @@ lv_show_splits_free (GNCLotViewer *lv)
 
     /* display list */
     gnc_split_viewer_fill(lv, lv->split_free_store, g_list_reverse (filtered_list));
+    g_list_free (filtered_list);
 }
 
 /* ======================================================================== */
diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index 6a7390848..c801aa9f4 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -3785,6 +3785,7 @@ gnc_plugin_page_register_cmd_print_check (GtkAction* action,
             }
         }
         gnc_ui_print_check_dialog_create (window, splits);
+        g_list_free (splits);
     }
     else
     {
@@ -5368,6 +5369,7 @@ gppr_account_destroy_cb (Account* account)
         page = (GncPluginPageRegister*)item->data;
         gnc_main_window_close_page (GNC_PLUGIN_PAGE (page));
     }
+    g_list_free (kill);
 }
 
 /** This function is the handler for all event messages from the
diff --git a/gnucash/gnome/gnc-plugin-page-register2.c b/gnucash/gnome/gnc-plugin-page-register2.c
index 034a8a8d0..baca8c602 100644
--- a/gnucash/gnome/gnc-plugin-page-register2.c
+++ b/gnucash/gnome/gnc-plugin-page-register2.c
@@ -2677,6 +2677,7 @@ gnc_plugin_page_register2_cmd_print_check (GtkAction *action,
             }
         }
         gnc_ui_print_check_dialog_create (window, splits);
+        g_list_free (splits);
     }
     else
     {
@@ -4027,6 +4028,7 @@ gppr_account_destroy_cb (Account *account)
         page = (GncPluginPageRegister2 *)item->data;
         gnc_main_window_close_page(GNC_PLUGIN_PAGE(page));
     }
+    g_list_free (kill);
 }
 
 /** This function is the handler for all event messages from the

commit b2b87921107132c98ee2d69221d944195aa29008
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Feb 22 18:13:21 2021 +0800

    prepend-and-reverse instead of O(N^2) append

diff --git a/gnucash/gnome-utils/gnc-sx-instance-dense-cal-adapter.c b/gnucash/gnome-utils/gnc-sx-instance-dense-cal-adapter.c
index ea9fbcd24..c71c2a0a2 100644
--- a/gnucash/gnome-utils/gnc-sx-instance-dense-cal-adapter.c
+++ b/gnucash/gnome-utils/gnc-sx-instance-dense-cal-adapter.c
@@ -192,11 +192,10 @@ gsidca_get_contained(GncDenseCalModel *model)
     {
         GncSxInstances *sx_instances = (GncSxInstances*)sxes->data;
         if (xaccSchedXactionGetEnabled(sx_instances->sx))
-        {
-            list = g_list_append(list, GUINT_TO_POINTER(GPOINTER_TO_UINT(sx_instances->sx)));
-        }
+            list = g_list_prepend (list, GUINT_TO_POINTER
+                                   (GPOINTER_TO_UINT (sx_instances->sx)));
     }
-    return list;
+    return g_list_reverse (list);
 }
 
 static gchar*
diff --git a/gnucash/gnome-utils/gnc-tree-view-account.c b/gnucash/gnome-utils/gnc-tree-view-account.c
index 0da39e117..0c7a79f15 100644
--- a/gnucash/gnome-utils/gnc-tree-view-account.c
+++ b/gnucash/gnome-utils/gnc-tree-view-account.c
@@ -1557,7 +1557,7 @@ get_selected_accounts_helper (GtkTreeModel *s_model,
     /* Only selected if it passes the filter */
     if (gtvsi->priv->filter_fn == NULL || gtvsi->priv->filter_fn(account, gtvsi->priv->filter_data))
     {
-        gtvsi->return_list = g_list_append(gtvsi->return_list, account);
+        gtvsi->return_list = g_list_prepend (gtvsi->return_list, account);
     }
 }
 
@@ -1580,6 +1580,7 @@ gnc_tree_view_account_get_selected_accounts (GncTreeViewAccount *view)
     info.priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(view);
     selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view));
     gtk_tree_selection_selected_foreach(selection, get_selected_accounts_helper, &info);
+    info.return_list = g_list_reverse (info.return_list);
     return info.return_list;
 }
 
diff --git a/gnucash/gnome/assistant-loan.cpp b/gnucash/gnome/assistant-loan.cpp
index aed5ba46e..04d0e604d 100644
--- a/gnucash/gnome/assistant-loan.cpp
+++ b/gnucash/gnome/assistant-loan.cpp
@@ -3014,13 +3014,15 @@ loan_create_sxes( LoanAssistantData *ldd )
             g_string_free( gstr, TRUE );
             gstr = NULL;
 
-            repaySXes = g_list_append( repaySXes, tcSX );
+            repaySXes = g_list_prepend (repaySXes, tcSX);
 
         }
 
         /* repayment */
         ld_setup_repayment_sx( ldd, rod, paymentSX, tcSX );
     }
+
+    repaySXes = g_list_reverse (repaySXes);
     /* Create the SXes */
     {
         GList *l;
diff --git a/gnucash/gnome/dialog-imap-editor.c b/gnucash/gnome/dialog-imap-editor.c
index d97b6d69e..cd4a70bef 100644
--- a/gnucash/gnome/dialog-imap-editor.c
+++ b/gnucash/gnome/dialog-imap-editor.c
@@ -308,7 +308,7 @@ find_invalid_mappings (GtkTreeModel *model, GtkTreePath *path,
         if (((g_strcmp0 (head, "online_id") == 0) && (depth == 1)) || (depth == 2))
         {
              GtkTreeRowReference *rowref = gtk_tree_row_reference_new (model, path);
-             *rowref_list = g_list_append (*rowref_list, rowref);
+             *rowref_list = g_list_prepend (*rowref_list, rowref);
         }
     }
     g_free (head);
@@ -325,9 +325,6 @@ gnc_imap_remove_invalid_maps (ImapDialog *imap_dialog)
                             (GtkTreeModelForeachFunc)find_invalid_mappings,
                             &rr_list);
 
-    // reverse the reference list
-    rr_list = g_list_reverse (rr_list);
-
     // Suspend GUI refreshing
     gnc_suspend_gui_refresh();
 
diff --git a/gnucash/gnome/dialog-lot-viewer.c b/gnucash/gnome/dialog-lot-viewer.c
index 68fc900f2..f9e004fbc 100644
--- a/gnucash/gnome/dialog-lot-viewer.c
+++ b/gnucash/gnome/dialog-lot-viewer.c
@@ -228,12 +228,12 @@ lv_show_splits_free (GNCLotViewer *lv)
         Split *split = node->data;
         if (NULL == xaccSplitGetLot(split))
         {
-            filtered_list = g_list_append(filtered_list, split);
+            filtered_list = g_list_prepend (filtered_list, split);
         }
     }
 
     /* display list */
-    gnc_split_viewer_fill(lv, lv->split_free_store, filtered_list);
+    gnc_split_viewer_fill(lv, lv->split_free_store, g_list_reverse (filtered_list));
 }
 
 /* ======================================================================== */
diff --git a/gnucash/gnome/gnc-budget-view.c b/gnucash/gnome/gnc-budget-view.c
index ad4d5aae3..43faf78f8 100644
--- a/gnucash/gnome/gnc-budget-view.c
+++ b/gnucash/gnome/gnc-budget-view.c
@@ -1629,7 +1629,7 @@ gnc_budget_view_refresh (GncBudgetView *budget_view)
         if (col != NULL)
         {
             gtk_tree_view_append_column (priv->totals_tree_view, col);
-            totals_col_list = g_list_append (totals_col_list, col);
+            totals_col_list = g_list_prepend (totals_col_list, col);
         }
 
         num_periods_visible = g_list_length (col_list);
@@ -1639,7 +1639,7 @@ gnc_budget_view_refresh (GncBudgetView *budget_view)
     gdk_rgba_free (note_color_selected);
 
     priv->period_col_list = col_list;
-    priv->totals_col_list = totals_col_list;
+    priv->totals_col_list = g_list_reverse (totals_col_list);
 
     if (priv->total_col == NULL)
     {
diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index 100953f8d..6a7390848 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -3722,7 +3722,7 @@ gnc_plugin_page_register_cmd_print_check (GtkAction* action,
         {
             if (xaccSplitGetAccount (split) == account)
             {
-                splits = g_list_append (splits, split);
+                splits = g_list_prepend (splits, split);
                 gnc_ui_print_check_dialog_create (window, splits);
                 g_list_free (splits);
             }
@@ -3733,7 +3733,7 @@ gnc_plugin_page_register_cmd_print_check (GtkAction* action,
                 split = gnc_split_register_get_current_trans_split (reg, NULL);
                 if (split)
                 {
-                    splits = g_list_append (splits, split);
+                    splits = g_list_prepend (splits, split);
                     gnc_ui_print_check_dialog_create (window, splits);
                     g_list_free (splits);
                 }
@@ -5349,18 +5349,19 @@ gppr_account_destroy_cb (Account* account)
         ledger_type = gnc_ledger_display_type (priv->ledger);
         if (ledger_type == LD_GL)
         {
-            kill = g_list_append (kill, page);
+            kill = g_list_prepend (kill, page);
             /* kill it */
         }
         else if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
         {
             if (guid_compare (acct_guid, &priv->key) == 0)
             {
-                kill = g_list_append (kill, page);
+                kill = g_list_prepend (kill, page);
             }
         }
     }
 
+    kill = g_list_reverse (kill);
     /* Now kill them. */
     for (item = kill; item; item = g_list_next (item))
     {
diff --git a/gnucash/gnome/gnc-plugin-page-register2.c b/gnucash/gnome/gnc-plugin-page-register2.c
index da9cb4c29..034a8a8d0 100644
--- a/gnucash/gnome/gnc-plugin-page-register2.c
+++ b/gnucash/gnome/gnc-plugin-page-register2.c
@@ -2614,7 +2614,7 @@ gnc_plugin_page_register2_cmd_print_check (GtkAction *action,
         {
             if (xaccSplitGetAccount(split) == account)
             {
-                splits = g_list_append(splits, split);
+                splits = g_list_prepend (splits, split);
                 gnc_ui_print_check_dialog_create (window, splits);
                 g_list_free(splits);
             }
@@ -2625,7 +2625,7 @@ gnc_plugin_page_register2_cmd_print_check (GtkAction *action,
                 split = gnc_tree_model_split_reg_trans_get_split_equal_to_ancestor(trans, account);
                 if (split)
                 {
-                    splits = g_list_append(splits, split);
+                    splits = g_list_prepend (splits, split);
                     gnc_ui_print_check_dialog_create (window, splits);
                     g_list_free(splits);
                 }
@@ -4008,18 +4008,19 @@ gppr_account_destroy_cb (Account *account)
         ledger_type = gnc_ledger_display2_type (priv->ledger);
         if (ledger_type == LD2_GL)
         {
-            kill = g_list_append(kill, page);
+            kill = g_list_prepend (kill, page);
             /* kill it */
         }
         else if ((ledger_type == LD2_SINGLE) || (ledger_type == LD2_SUBACCOUNT))
         {
             if (guid_compare(acct_guid, &priv->key) == 0)
             {
-                kill = g_list_append(kill, page);
+                kill = g_list_prepend (kill, page);
             }
         }
     }
 
+    kill = g_list_reverse (kill);
     /* Now kill them. */
     for (item = kill; item; item = g_list_next(item))
     {
diff --git a/libgnucash/app-utils/gnc-sx-instance-model.c b/libgnucash/app-utils/gnc-sx-instance-model.c
index 465cf68df..f281f40b8 100644
--- a/libgnucash/app-utils/gnc-sx-instance-model.c
+++ b/libgnucash/app-utils/gnc-sx-instance-model.c
@@ -522,9 +522,10 @@ gnc_sx_get_instances(const GDate *range_end, gboolean include_disabled)
             SchedXaction *sx = (SchedXaction*)sx_iter->data;
             if (xaccSchedXactionGetEnabled(sx))
             {
-                enabled_sxes = g_list_append(enabled_sxes, sx);
+                enabled_sxes = g_list_prepend (enabled_sxes, sx);
             }
         }
+        enabled_sxes = g_list_reverse (enabled_sxes);
         instances->sx_instance_list = gnc_g_list_map(enabled_sxes, (GncGMapFunc)_gnc_sx_gen_instances, (gpointer)range_end);
         g_list_free(enabled_sxes);
     }
diff --git a/libgnucash/core-utils/gnc-glib-utils.c b/libgnucash/core-utils/gnc-glib-utils.c
index 836678ca1..b45292151 100644
--- a/libgnucash/core-utils/gnc-glib-utils.c
+++ b/libgnucash/core-utils/gnc-glib-utils.c
@@ -265,9 +265,9 @@ gnc_g_list_map(GList* list, GncGMapFunc fn, gpointer user_data)
     GList *rtn = NULL;
     for (; list != NULL; list = list->next)
     {
-        rtn = g_list_append(rtn, (*fn)(list->data, user_data));
+        rtn = g_list_prepend (rtn, (*fn)(list->data, user_data));
     }
-    return rtn;
+    return g_list_reverse (rtn);
 }
 
 void
diff --git a/libgnucash/engine/SX-book.c b/libgnucash/engine/SX-book.c
index b5465992d..e15cb57f0 100644
--- a/libgnucash/engine/SX-book.c
+++ b/libgnucash/engine/SX-book.c
@@ -380,12 +380,12 @@ gnc_sx_get_sxes_referencing_account(QofBook *book, Account *acct)
             GncGUID *guid = NULL;
             qof_instance_get (QOF_INSTANCE (s), "sx-account", &guid, NULL);
             if (guid_equal(acct_guid, guid))
-                rtn = g_list_append(rtn, sx);
+                rtn = g_list_prepend (rtn, sx);
 
             guid_free (guid);
         }
     }
-    return rtn;
+    return g_list_reverse (rtn);
 }
 
 /* ========================== END OF FILE =============================== */
diff --git a/libgnucash/engine/ScrubBusiness.c b/libgnucash/engine/ScrubBusiness.c
index 6adb52a19..d775157ef 100644
--- a/libgnucash/engine/ScrubBusiness.c
+++ b/libgnucash/engine/ScrubBusiness.c
@@ -400,9 +400,10 @@ gncScrubLotDanglingPayments (GNCLot *lot)
         if (gnc_numeric_compare (gnc_numeric_abs (free_val), gnc_numeric_abs (ll_val)) > 0)
             continue;
 
-        filtered_list = g_list_append(filtered_list, free_split);
+        filtered_list = g_list_prepend (filtered_list, free_split);
     }
 
+    filtered_list = g_list_reverse (filtered_list);
     match_list = gncSLFindOffsSplits (filtered_list, ll_val);
     g_list_free (filtered_list);
 
diff --git a/libgnucash/engine/Transaction.c b/libgnucash/engine/Transaction.c
index 6cd2e855a..1635ba277 100644
--- a/libgnucash/engine/Transaction.c
+++ b/libgnucash/engine/Transaction.c
@@ -569,7 +569,7 @@ xaccTransSortSplits (Transaction *trans)
         split = node->data;
         if (gnc_numeric_negative_p (xaccSplitGetValue(split)))
             continue;
-        new_list = g_list_append(new_list, split);
+        new_list = g_list_prepend (new_list, split);
     }
 
     /* then credits */
@@ -578,12 +578,12 @@ xaccTransSortSplits (Transaction *trans)
         split = node->data;
         if (!gnc_numeric_negative_p (xaccSplitGetValue(split)))
             continue;
-        new_list = g_list_append(new_list, split);
+        new_list = g_list_prepend (new_list, split);
     }
 
     /* install newly sorted list */
     g_list_free(trans->splits);
-    trans->splits = new_list;
+    trans->splits = g_list_reverse (new_list);
 }
 
 
diff --git a/libgnucash/engine/gncCustomer.c b/libgnucash/engine/gncCustomer.c
index b7c547d94..7d0c47939 100644
--- a/libgnucash/engine/gncCustomer.c
+++ b/libgnucash/engine/gncCustomer.c
@@ -705,9 +705,9 @@ GList * gncCustomerGetJoblist (const GncCustomer *cust, gboolean show_all)
         {
             GncJob *j = iterator->data;
             if (gncJobGetActive (j))
-                list = g_list_append (list, j);
+                list = g_list_prepend (list, j);
         }
-        return list;
+        return g_list_reverse (list);
     }
 }
 

commit b73cacd58c1a79987f39b567e2a77a2c57499b19
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Feb 22 18:11:53 2021 +0800

    [gnc-recurrence.c] avoid O(N^2) children traversal
    
    * each loop iteration called g_list_length and g_list_nth_data
    
    better to forloop scan children instead

diff --git a/gnucash/gnome-utils/gnc-recurrence.c b/gnucash/gnome-utils/gnc-recurrence.c
index ceeab66bc..7a9b3f4ba 100644
--- a/gnucash/gnome-utils/gnc-recurrence.c
+++ b/gnucash/gnome-utils/gnc-recurrence.c
@@ -517,20 +517,15 @@ GList *
 gnc_recurrence_comp_get_list(GncRecurrenceComp *grc)
 {
     GList *rlist = NULL, *children;
-    gint i;
-
 
     children = gtk_container_get_children(GTK_CONTAINER(grc->vbox));
-    for (i = 0; i < g_list_length(children); i++)
+    for (GList *n = children; n; n = n->next)
     {
-        GncRecurrence *gr;
-        const Recurrence *r;
-        gr = GNC_RECURRENCE(g_list_nth_data(children, i));
-        r = gnc_recurrence_get(gr);
-        rlist = g_list_append(rlist, (gpointer)r);
+        const Recurrence *r = gnc_recurrence_get (GNC_RECURRENCE (n->data));
+        rlist = g_list_prepend (rlist, (gpointer)r);
     }
     g_list_free(children);
-    return rlist;
+    return g_list_reverse (rlist);
 }
 
 



Summary of changes:
 gnucash/gnome-search/gnc-general-search.c          |  1 -
 gnucash/gnome-utils/gnc-gtk-utils.c                |  1 -
 gnucash/gnome-utils/gnc-recurrence.c               | 13 ++++------
 .../gnc-sx-instance-dense-cal-adapter.c            |  7 +++---
 gnucash/gnome-utils/gnc-tree-model-split-reg.c     | 28 ++++++++--------------
 gnucash/gnome-utils/gnc-tree-view-account.c        |  3 ++-
 gnucash/gnome-utils/window-main-summarybar.c       |  9 +------
 gnucash/gnome/assistant-loan.cpp                   |  4 +++-
 gnucash/gnome/dialog-imap-editor.c                 |  5 +---
 gnucash/gnome/dialog-lot-viewer.c                  |  5 ++--
 gnucash/gnome/gnc-budget-view.c                    |  4 ++--
 gnucash/gnome/gnc-plugin-page-register.c           | 11 +++++----
 gnucash/gnome/gnc-plugin-page-register2.c          | 11 +++++----
 libgnucash/app-utils/gnc-sx-instance-model.c       |  3 ++-
 libgnucash/core-utils/gnc-glib-utils.c             |  4 ++--
 libgnucash/engine/SX-book.c                        |  4 ++--
 libgnucash/engine/ScrubBusiness.c                  |  3 ++-
 libgnucash/engine/Split.c                          | 23 +++++++++++++-----
 libgnucash/engine/Split.h                          |  1 +
 libgnucash/engine/Transaction.c                    |  6 ++---
 libgnucash/engine/gncCustomer.c                    |  4 ++--
 21 files changed, 74 insertions(+), 76 deletions(-)



More information about the gnucash-changes mailing list