gnucash maint: Multiple changes pushed

Christopher Lam clam at code.gnucash.org
Tue Nov 2 11:56:01 EDT 2021


Updated	 via  https://github.com/Gnucash/gnucash/commit/970e9af3 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/79d8ef02 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/3dfdf606 (commit)
	from  https://github.com/Gnucash/gnucash/commit/b5f5129f (commit)



commit 970e9af3423eb50b9823d264cf6685ccad0b2973
Merge: b5f5129f7 79d8ef029
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Tue Nov 2 23:35:07 2021 +0800

    Merge branch 'glist-functions' into maint #1183


commit 79d8ef0299dca2c1caf7bb21a8f3d57f718a6177
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Tue Nov 2 15:02:50 2021 +0800

    Revert b5f5129f7 using gnc_list_length_cmp

diff --git a/gnucash/gnome-utils/gnc-main-window.c b/gnucash/gnome-utils/gnc-main-window.c
index 385a216d2..fdff025c1 100644
--- a/gnucash/gnome-utils/gnc-main-window.c
+++ b/gnucash/gnome-utils/gnc-main-window.c
@@ -65,6 +65,7 @@
 #include "gnc-state.h"
 #include "gnc-ui.h"
 #include "gnc-ui-util.h"
+#include <gnc-glib-utils.h>
 #include "gnc-uri-utils.h"
 #include "gnc-version.h"
 #include "gnc-warnings.h"
@@ -1446,7 +1447,7 @@ gnc_main_window_delete_event (GtkWidget *window,
     if (already_dead)
         return TRUE;
 
-    if (active_windows && active_windows->next)
+    if (gnc_list_length_cmp (active_windows, 1) > 0)
     {
         gint response;
         GtkWidget *dialog;
@@ -1478,7 +1479,7 @@ gnc_main_window_delete_event (GtkWidget *window,
         return TRUE;
     }
 
-    if (active_windows && active_windows->next)
+    if (gnc_list_length_cmp (active_windows, 1) > 0)
         return FALSE;
 
     already_dead = gnc_main_window_quit(GNC_MAIN_WINDOW(window));
@@ -3348,7 +3349,7 @@ gnc_main_window_close_page (GncPluginPage *page)
             /* remove the preference callbacks from the main window */
             gnc_main_window_remove_prefs (window);
         }
-        if (window && active_windows && active_windows->next)
+        if (window && (gnc_list_length_cmp (active_windows, 1) > 0))
             gtk_widget_destroy (GTK_WIDGET(window));
     }
 }
diff --git a/gnucash/gnome/dialog-imap-editor.c b/gnucash/gnome/dialog-imap-editor.c
index 966d60391..7b6d2c6db 100644
--- a/gnucash/gnome/dialog-imap-editor.c
+++ b/gnucash/gnome/dialog-imap-editor.c
@@ -33,6 +33,7 @@
 
 #include "gnc-ui.h"
 #include "gnc-ui-util.h"
+#include <gnc-glib-utils.h>
 #include "Account.h"
 
 #define DIALOG_IMAP_CM_CLASS    "dialog-imap-edit"
@@ -251,7 +252,7 @@ gnc_imap_dialog_delete (ImapDialog *imap_dialog)
     list = gtk_tree_selection_get_selected_rows (selection, &fmodel);
 
     // Make sure we have some rows selected
-    if (list == NULL)
+    if (!gnc_list_length_cmp (list, 0))
         return;
 
     // reset the invalid map total
@@ -645,7 +646,7 @@ get_imap_info (ImapDialog *imap_dialog, Account *acc, const gchar *category, con
     else
         head = IMAP_FRAME;
 
-    if (imap_list != NULL)
+    if (gnc_list_length_cmp (imap_list, 0))
     {
         PINFO("List length is %d", g_list_length (imap_list));
 
diff --git a/gnucash/gnome/dialog-invoice.c b/gnucash/gnome/dialog-invoice.c
index 4faa55df1..b1585b59c 100644
--- a/gnucash/gnome/dialog-invoice.c
+++ b/gnucash/gnome/dialog-invoice.c
@@ -50,6 +50,7 @@
 #include "gncOwner.h"
 #include "gncInvoice.h"
 #include "gncInvoiceP.h"
+#include <gnc-glib-utils.h>
 
 #include "gncEntryLedger.h"
 
@@ -3237,7 +3238,7 @@ multi_post_invoice_cb (GtkWindow *dialog, GList *invoice_list, gpointer user_dat
     gboolean test;
     InvoiceWindow *iw;
 
-    if (invoice_list == NULL)
+    if (!gnc_list_length_cmp (invoice_list, 0))
         return;
     // Get the posting parameters for these invoices
     iw = gnc_ui_invoice_edit(dialog, invoice_list->data);
@@ -3287,7 +3288,7 @@ multi_print_invoice_cb (GtkWindow *dialog, GList *invoice_list, gpointer user_da
 {
     struct multi_edit_invoice_data meid;
 
-    if (invoice_list == NULL)
+    if (!gnc_list_length_cmp (invoice_list, 0))
         return;
 
     meid.user_data = user_data;
diff --git a/gnucash/gnome/dialog-payment.c b/gnucash/gnome/dialog-payment.c
index 20bb58c50..7cf165e82 100644
--- a/gnucash/gnome/dialog-payment.c
+++ b/gnucash/gnome/dialog-payment.c
@@ -32,6 +32,7 @@
 #include "gnc-ui.h"
 #include "gnc-gui-query.h"
 #include "gnc-ui-util.h"
+#include <gnc-glib-utils.h>
 #include "qof.h"
 #include "gnc-date.h"
 #include "gnc-date-edit.h"
@@ -1735,7 +1736,7 @@ static GList *select_txn_lots (GtkWindow *parent, Transaction *txn, Account **po
     /* If the txn has both APAR splits linked to a business lot and
      * splits that are not, issue a warning some will be discarded.
      */
-    if (has_no_lot_apar_splits && (txn_lots != NULL))
+    if (has_no_lot_apar_splits && gnc_list_length_cmp (txn_lots, 0))
     {
         GtkWidget *dialog;
         char *split_str = g_strdup ("");
diff --git a/gnucash/gnome/dialog-price-edit-db.c b/gnucash/gnome/dialog-price-edit-db.c
index 62511ee8e..14770a519 100644
--- a/gnucash/gnome/dialog-price-edit-db.c
+++ b/gnucash/gnome/dialog-price-edit-db.c
@@ -49,6 +49,7 @@
 #include "swig-runtime.h"
 #include "guile-mappings.h"
 #include "gnc-engine-guile.h"
+#include <gnc-glib-utils.h>
 
 
 #define DIALOG_PRICE_DB_CM_CLASS "dialog-price-edit-db"
@@ -366,7 +367,7 @@ selection_changed_cb (GtkTreeSelection *selection, gpointer data)
     PricesDialog *pdb_dialog = data;
     GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(pdb_dialog->remove_view));
     GList *rows = gtk_tree_selection_get_selected_rows (selection, &model);
-    gboolean have_rows = (rows != NULL);
+    gboolean have_rows = (gnc_list_length_cmp (rows, 0));
 
     change_source_flag (PRICE_REMOVE_SOURCE_COMM, have_rows, pdb_dialog);
     g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL);
@@ -547,7 +548,7 @@ gnc_prices_dialog_add_clicked (GtkWidget *widget, gpointer data)
     }
     else if (comm_list) // selection contains price parent rows
     {
-        if (!comm_list->next) // make sure it is only one parent
+        if (!gnc_list_length_cmp (comm_list, 1)) // make sure it is only one parent
         {
             price = gnc_price_create (pdb_dialog->book);
             gnc_price_set_commodity (price, comm_list->data);
diff --git a/gnucash/gnome/dialog-sx-editor.c b/gnucash/gnome/dialog-sx-editor.c
index d3d5308cb..e79e3f2ac 100644
--- a/gnucash/gnome/dialog-sx-editor.c
+++ b/gnucash/gnome/dialog-sx-editor.c
@@ -63,6 +63,7 @@
 #include "gnc-ui-util.h"
 #include "gnucash-sheet.h"
 #include "gnc-session.h"
+#include <gnc-glib-utils.h>
 
 #include "gnc-split-reg.h"
 
@@ -579,7 +580,7 @@ gnc_sxed_check_endpoint (GncSxEditorDialog *sxed)
 
     g_date_clear (&nextDate, 1);
     gnc_frequency_save_to_recurrence (sxed->gncfreq, &schedule, &startDate);
-    if (schedule != NULL)
+    if (gnc_list_length_cmp (schedule, 0))
     {
         g_date_subtract_days (&startDate, 1);
         recurrenceListNextInstance (schedule, &startDate, &nextDate);
@@ -1766,7 +1767,7 @@ _sx_engine_event_handler (QofInstance *ent, QofEventId event_type, gpointer user
     book = qof_instance_get_book (QOF_INSTANCE (acct));
     affected_sxes = gnc_sx_get_sxes_referencing_account (book, acct);
 
-    if (affected_sxes == NULL)
+    if (!gnc_list_length_cmp (affected_sxes, 0))
         return;
 
     {
diff --git a/gnucash/gnome/dialog-sx-editor2.c b/gnucash/gnome/dialog-sx-editor2.c
index 6c95643ad..6ddb3b3a8 100644
--- a/gnucash/gnome/dialog-sx-editor2.c
+++ b/gnucash/gnome/dialog-sx-editor2.c
@@ -63,6 +63,7 @@
 #include "gnc-ui-util.h"
 #include "gnc-tree-model-split-reg.h"
 #include "gnc-tree-control-split-reg.h"
+#include <gnc-glib-utils.h>
 
 #include "gnc-sx-instance-model.h"
 #include "dialog-sx-since-last-run.h"
@@ -836,7 +837,7 @@ gnc_sxed_check_consistent (GncSxEditorDialog2 *sxed)
 
         g_date_clear (&nextDate, 1);
         gnc_frequency_save_to_recurrence (sxed->gncfreq, &schedule, &startDate);
-        if (schedule != NULL)
+        if (gnc_list_length_cmp (schedule, 0))
         {
             g_date_subtract_days (&startDate, 1);
             recurrenceListNextInstance (schedule, &startDate, &nextDate);
@@ -1704,7 +1705,7 @@ _sx_engine_event_handler (QofInstance *ent, QofEventId event_type, gpointer user
     book = qof_instance_get_book (QOF_INSTANCE (acct));
     affected_sxes = gnc_sx_get_sxes_referencing_account (book, acct);
 
-    if (affected_sxes == NULL)
+    if (!gnc_list_length_cmp (affected_sxes, 0))
         return;
 
     {
diff --git a/gnucash/gnome/gnc-plugin-page-account-tree.c b/gnucash/gnome/gnc-plugin-page-account-tree.c
index 1a6b7ff76..4c43b1612 100644
--- a/gnucash/gnome/gnc-plugin-page-account-tree.c
+++ b/gnucash/gnome/gnc-plugin-page-account-tree.c
@@ -70,6 +70,7 @@
 #include "window-main-summarybar.h"
 #include "dialog-object-references.h"
 #include "dialog-find-account.h"
+#include <gnc-glib-utils.h>
 
 /* This static indicates the debugging module that this .o belongs to.  */
 static QofLogModule log_module = GNC_MOD_GUI;
@@ -593,7 +594,7 @@ gnc_plugin_page_account_tree_open (Account *account, GtkWindow *win)
     page_list = gnc_gobject_tracking_get_list(GNC_PLUGIN_PAGE_ACCOUNT_TREE_NAME);
 
     // If we have a window, look for account page in that window
-    if (page_list != NULL)
+    if (gnc_list_length_cmp (page_list, 0))
     {
         if (win != NULL)
         {
@@ -1500,7 +1501,7 @@ account_subaccount (Account* account)
 {
     Account* subaccount = NULL;
     GList *subs = gnc_account_get_children (account);
-    if (subs && !subs->next)
+    if (!gnc_list_length_cmp (subs, 1))
         subaccount = subs->data;
     g_list_free (subs);
     return subaccount;
diff --git a/gnucash/gnome/gnc-plugin-page-sx-list.c b/gnucash/gnome/gnc-plugin-page-sx-list.c
index ed8507b5c..218a5e0c3 100644
--- a/gnucash/gnome/gnc-plugin-page-sx-list.c
+++ b/gnucash/gnome/gnc-plugin-page-sx-list.c
@@ -756,7 +756,7 @@ gnc_plugin_page_sx_list_cmd_edit (GtkAction *action, GncPluginPageSxList *page)
 
     selection = gtk_tree_view_get_selection (priv->tree_view);
     selected_paths = gtk_tree_selection_get_selected_rows (selection, &model);
-    if (selected_paths == NULL)
+    if (!gnc_list_length_cmp (selected_paths, 0))
     {
         g_warning ("no selection edit.");
         return;
@@ -792,7 +792,7 @@ gnc_plugin_page_sx_list_cmd_edit2 (GtkAction *action, GncPluginPageSxList *page)
 
     selection = gtk_tree_view_get_selection (priv->tree_view);
     selected_paths = gtk_tree_selection_get_selected_rows (selection, &model);
-    if (selected_paths == NULL)
+    if (!gnc_list_length_cmp (selected_paths, 0))
     {
         g_warning ("no selection edit.");
         return;
@@ -853,7 +853,7 @@ gnc_plugin_page_sx_list_cmd_delete (GtkAction *action, GncPluginPageSxList *page
 
     selection = gtk_tree_view_get_selection (priv->tree_view);
     selected_paths = gtk_tree_selection_get_selected_rows (selection, &model);
-    if (selected_paths == NULL)
+    if (!gnc_list_length_cmp (selected_paths, 0))
     {
         g_warning ("no selection for delete.");
         return;
diff --git a/gnucash/register/ledger-core/gnc-ledger-display.c b/gnucash/register/ledger-core/gnc-ledger-display.c
index 3326ddeae..a6c0f33c7 100644
--- a/gnucash/register/ledger-core/gnc-ledger-display.c
+++ b/gnucash/register/ledger-core/gnc-ledger-display.c
@@ -37,6 +37,7 @@
 #include "gnc-ledger-display.h"
 #include "gnc-prefs.h"
 #include "gnc-ui-util.h"
+#include <gnc-glib-utils.h>
 #include "split-register-control.h"
 #include "split-register-model.h"
 
@@ -429,7 +430,7 @@ gnc_ledger_display_gl (void)
         tRoot = gnc_book_get_template_root (gnc_get_current_book());
         al = gnc_account_get_descendants (tRoot);
 
-        if (al != NULL)
+        if (gnc_list_length_cmp (al, 0))
             xaccQueryAddAccountMatch (query, al, QOF_GUID_MATCH_NONE, QOF_QUERY_AND);
 
         g_list_free (al);
diff --git a/libgnucash/engine/Recurrence.c b/libgnucash/engine/Recurrence.c
index 9e2e33e8f..b450e9368 100644
--- a/libgnucash/engine/Recurrence.c
+++ b/libgnucash/engine/Recurrence.c
@@ -31,8 +31,7 @@
 #include "gnc-date.h"
 #include "Account.h"
 #include <stdint.h>
-#include <stdint.h>
-#include <stdint.h>
+#include <gnc-glib-utils.h>
 
 #define LOG_MOD "gnc.engine.recurrence"
 static QofLogModule log_module = LOG_MOD;
@@ -556,7 +555,7 @@ recurrenceWeekendAdjustFromString(const gchar *str)
 gboolean
 recurrenceListIsSemiMonthly(GList *recurrences)
 {
-    if (!(recurrences && recurrences->next && !recurrences->next->next))
+    if (gnc_list_length_cmp (recurrences, 2))
         return FALSE;
 
     // should be a "semi-monthly":
diff --git a/libgnucash/engine/gncIDSearch.c b/libgnucash/engine/gncIDSearch.c
index 449732c87..921708d1d 100644
--- a/libgnucash/engine/gncIDSearch.c
+++ b/libgnucash/engine/gncIDSearch.c
@@ -22,6 +22,7 @@
 **********************************************************************/
 
 #include "gncIDSearch.h"
+#include <gnc-glib-utils.h>
 
 typedef enum
 {   UNDEFINED,
@@ -122,7 +123,7 @@ static void * search(QofBook * book, const gchar *id, void * object, GncSearchTy
     result = qof_query_run (q);
 
     // now compare _exactly_
-    if (result != NULL)
+    if (gnc_list_length_cmp (result, 0))
     {
         result = g_list_first (result);
 

commit 3dfdf606081a2d23a2a816ad5acadce2f7b55595
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Nov 1 22:17:50 2021 +0800

    [gnc-glib-utils] Define and export gnc_list_length_cmp

diff --git a/libgnucash/core-utils/gnc-glib-utils.c b/libgnucash/core-utils/gnc-glib-utils.c
index e79cf7e02..7bb2ba533 100644
--- a/libgnucash/core-utils/gnc-glib-utils.c
+++ b/libgnucash/core-utils/gnc-glib-utils.c
@@ -351,3 +351,13 @@ gnc_g_list_stringjoin (GList *list_of_strings, const gchar *sep)
 
     return retval;
 }
+
+gint
+gnc_list_length_cmp (const GList *list, size_t len)
+{
+    for (GList *lst = (GList*) list;; lst = g_list_next (lst), len--)
+    {
+        if (!lst) return (len ? -1 : 0);
+        if (!len) return 1;
+    }
+}
diff --git a/libgnucash/core-utils/gnc-glib-utils.h b/libgnucash/core-utils/gnc-glib-utils.h
index 97e36c53d..c1a9a37b3 100644
--- a/libgnucash/core-utils/gnc-glib-utils.h
+++ b/libgnucash/core-utils/gnc-glib-utils.h
@@ -199,6 +199,20 @@ void gnc_scm_log_debug(const gchar *msg);
  **/
 gchar * gnc_g_list_stringjoin (GList *list_of_strings, const gchar *sep);
 
+/**
+ * @brief Scans the GList elements the minimum number of iterations
+ * required to test it against a specified size. Returns -1, 0 or 1
+ * depending on whether the GList length has less, same, or more
+ * elements than the size specified.
+ *
+ * @param lst A GList
+ *
+ * @param len the comparator length to compare the GList length with
+ *
+ * @return A signed int comparing GList length with specified size.
+ **/
+gint gnc_list_length_cmp (const GList *list, size_t len);
+
 /** Kill a process.  On UNIX send a SIGKILL, on Windows call TerminateProcess.
  *
  *  @param pid The process ID. */
diff --git a/libgnucash/core-utils/test/test-gnc-glib-utils.c b/libgnucash/core-utils/test/test-gnc-glib-utils.c
index e4423baaa..0c59356e3 100644
--- a/libgnucash/core-utils/test/test-gnc-glib-utils.c
+++ b/libgnucash/core-utils/test/test-gnc-glib-utils.c
@@ -110,6 +110,28 @@ test_g_list_stringjoin (gconstpointer data)
     g_list_free (test);
 }
 
+static void
+test_gnc_list_length (gconstpointer data)
+{
+    GList *lst = NULL;
+
+    g_assert (gnc_list_length_cmp (lst, 0) == 0);
+    g_assert (gnc_list_length_cmp (lst, 1) == -1);
+
+    lst = g_list_prepend (lst, (gpointer)1);
+    g_assert (gnc_list_length_cmp (lst, 0) == 1);
+    g_assert (gnc_list_length_cmp (lst, 1) == 0);
+    g_assert (gnc_list_length_cmp (lst, 2) == -1);
+
+    lst = g_list_prepend (lst, (gpointer)2);
+    g_assert (gnc_list_length_cmp (lst, 1) == 1);
+    g_assert (gnc_list_length_cmp (lst, 2) == 0);
+    g_assert (gnc_list_length_cmp (lst, 3) == -1);
+
+    g_list_free (lst);
+}
+
+
 int
 main (int argc, char *argv[])
 {
@@ -119,6 +141,7 @@ main (int argc, char *argv[])
     g_test_add_data_func ("/core-utils/gnc_utf8_strip_invalid_and_controls invalid utf8", (gconstpointer)invalid_utf8, test_gnc_utf8_strip_invalid_and_controls);
     g_test_add_data_func ("/core-utils/gnc_utf8_strip_invalid_and_controls control chars", (gconstpointer)controls, test_gnc_utf8_strip_invalid_and_controls);
     g_test_add_data_func ("/core-utils/gnc_g_list_stringjoin", NULL, test_g_list_stringjoin);
+    g_test_add_data_func ("/core-utils/gnc_list_length", NULL, test_gnc_list_length);
 
     return g_test_run();
 }



Summary of changes:
 gnucash/gnome-utils/gnc-main-window.c             |  7 ++++---
 gnucash/gnome/dialog-imap-editor.c                |  5 +++--
 gnucash/gnome/dialog-invoice.c                    |  5 +++--
 gnucash/gnome/dialog-payment.c                    |  3 ++-
 gnucash/gnome/dialog-price-edit-db.c              |  5 +++--
 gnucash/gnome/dialog-sx-editor.c                  |  5 +++--
 gnucash/gnome/dialog-sx-editor2.c                 |  5 +++--
 gnucash/gnome/gnc-plugin-page-account-tree.c      |  5 +++--
 gnucash/gnome/gnc-plugin-page-sx-list.c           |  6 +++---
 gnucash/register/ledger-core/gnc-ledger-display.c |  3 ++-
 libgnucash/core-utils/gnc-glib-utils.c            | 10 ++++++++++
 libgnucash/core-utils/gnc-glib-utils.h            | 14 ++++++++++++++
 libgnucash/core-utils/test/test-gnc-glib-utils.c  | 23 +++++++++++++++++++++++
 libgnucash/engine/Recurrence.c                    |  5 ++---
 libgnucash/engine/gncIDSearch.c                   |  3 ++-
 15 files changed, 80 insertions(+), 24 deletions(-)



More information about the gnucash-changes mailing list