[balsa/wip/gtk4: 120/351] Use various convenience functions



commit f2bfd1a948520ba738072240ccddf3e255b7529d
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Tue Jan 9 16:04:06 2018 -0500

    Use various convenience functions
    
    Use various convenience functions for freeing and clearing lists,
    GObjects, and other pointers.

 libbalsa/address-book-extern.c  |    5 +--
 libbalsa/address-book-ldif.c    |    3 +-
 libbalsa/address-book-osmo.c    |    4 +-
 libbalsa/address-book-rubrica.c |    5 +---
 libbalsa/address-book-text.c    |    5 +---
 libbalsa/address-book-vcard.c   |    3 +-
 libbalsa/address-view.c         |    6 +---
 libbalsa/address.c              |    6 +---
 libbalsa/completion.c           |   51 +++++++++++++-------------------------
 libbalsa/filter-file.c          |    7 ++---
 libbalsa/filter-funcs.c         |    5 +---
 libbalsa/folder-scanners.c      |    3 +-
 libbalsa/identity.c             |    3 +-
 libbalsa/imap-server.c          |   14 ++++-------
 libbalsa/libbalsa.c             |    8 +++---
 libbalsa/mailbox.c              |    3 +-
 libbalsa/mailbox_local.c        |    5 +--
 libbalsa/message.h              |    3 +-
 libbalsa/misc.c                 |   26 +++++++++++++++++--
 libbalsa/misc.h                 |    2 +
 libbalsa/rfc2445.c              |   10 ++-----
 libbalsa/send.c                 |   20 ++++++---------
 src/balsa-app.c                 |   25 ++++--------------
 src/balsa-index.c               |    3 +-
 src/balsa-mblist.c              |    7 +----
 src/balsa-message.c             |   15 +++--------
 src/balsa-mime-widget-text.c    |   17 ++++---------
 src/balsa-print-object-text.c   |    5 +---
 src/filter-edit-callbacks.c     |   19 +++-----------
 src/filter-run-callbacks.c      |    5 +--
 src/main-window.c               |    3 +-
 src/print-gtk.c                 |    3 +-
 src/save-restore.c              |    6 +---
 src/sendmsg-window.c            |   39 ++++++++++++-----------------
 src/store-address.c             |    3 +-
 35 files changed, 131 insertions(+), 216 deletions(-)
---
diff --git a/libbalsa/address-book-extern.c b/libbalsa/address-book-extern.c
index 9ee3ace..2b4d025 100644
--- a/libbalsa/address-book-extern.c
+++ b/libbalsa/address-book-extern.c
@@ -48,6 +48,7 @@
 #include "address-book.h"
 #include "libbalsa-conf.h"
 #include "information.h"
+#include "misc.h"
 #include "abook-completion.h"
 #include <glib/gi18n.h>
 
@@ -224,9 +225,7 @@ libbalsa_address_book_externq_load(LibBalsaAddressBook * ab,
     LibBalsaAddressBookExtern *addr_externq = LIBBALSA_ADDRESS_BOOK_EXTERN(ab);
 
     /* Erase the current address list */
-    g_list_foreach(addr_externq->address_list, (GFunc) g_object_unref, NULL);
-    g_list_free(addr_externq->address_list);
-    addr_externq->address_list = NULL;
+    libbalsa_clear_list(&addr_externq->address_list, g_object_unref);
     if(callback) {
         data.ab = ab;
         data.callback = callback;
diff --git a/libbalsa/address-book-ldif.c b/libbalsa/address-book-ldif.c
index f0c5b6f..5cd451b 100644
--- a/libbalsa/address-book-ldif.c
+++ b/libbalsa/address-book-ldif.c
@@ -399,8 +399,7 @@ libbalsa_address_book_ldif_parse_address(FILE * stream,
                     g_free(line);
                     return LBABERR_OK;
                 }
-                g_list_foreach(address_list, (GFunc) g_free, NULL);
-                g_list_free(address_list);
+                g_list_free_full(address_list, g_free);
            } 
             /* Record without e-mail address, or we're not creating
              * addresses: free memory. */
diff --git a/libbalsa/address-book-osmo.c b/libbalsa/address-book-osmo.c
index 0b00db8..4014666 100644
--- a/libbalsa/address-book-osmo.c
+++ b/libbalsa/address-book-osmo.c
@@ -40,6 +40,7 @@
 #include "address-book.h"
 #include "rfc6350.h"
 #include "address-book-osmo.h"
+#include "misc.h"
 
 
 /* for the time being, osmo svn rev. 1099 accepts only reading via DBus, not writing new or modified records 
*/
@@ -337,8 +338,7 @@ osmo_read_addresses(LibBalsaAddressBookOsmo *osmo,
                        /* drop list on error, reverse order otherwise */
                        if (addresses != NULL) {
                                if (*error != NULL) {
-                                       g_list_free_full(addresses, g_object_unref);
-                                       addresses = NULL;
+                                       libbalsa_clear_list(&addresses, g_object_unref);
                                } else {
                                        addresses = g_list_reverse(addresses);
                                }
diff --git a/libbalsa/address-book-rubrica.c b/libbalsa/address-book-rubrica.c
index 45fe627..2977de6 100644
--- a/libbalsa/address-book-rubrica.c
+++ b/libbalsa/address-book-rubrica.c
@@ -418,10 +418,7 @@ lbab_rubrica_load_xml(LibBalsaAddressBookRubrica * ab_rubrica,
     }
 
     /* free old data */
-    g_slist_foreach(ab_text->item_list, (GFunc) g_object_unref, NULL);
-    g_slist_free(ab_text->item_list);
-    ab_text->item_list = NULL;
-
+    libbalsa_clear_slist(&ab_text->item_list, g_object_unref);
     libbalsa_completion_clear_items(ab_text->name_complete);
 
 
diff --git a/libbalsa/address-book-text.c b/libbalsa/address-book-text.c
index 2c58acb..7f1948d 100644
--- a/libbalsa/address-book-text.c
+++ b/libbalsa/address-book-text.c
@@ -298,10 +298,7 @@ lbab_text_load_file(LibBalsaAddressBookText * ab_text, FILE * stream)
     if (!lbab_text_address_book_need_reload(ab_text))
         return TRUE;
 
-    g_slist_foreach(ab_text->item_list, (GFunc) lbab_text_item_free, NULL);
-    g_slist_free(ab_text->item_list);
-    ab_text->item_list = NULL;
-
+    libbalsa_clear_slist(&ab_text->item_list, (GDestroyNotify) lbab_text_item_free);
     libbalsa_completion_clear_items(ab_text->name_complete);
 
     parse_address =
diff --git a/libbalsa/address-book-vcard.c b/libbalsa/address-book-vcard.c
index 7dbe600..2a20c1a 100644
--- a/libbalsa/address-book-vcard.c
+++ b/libbalsa/address-book-vcard.c
@@ -263,8 +263,7 @@ libbalsa_address_book_vcard_parse_address(FILE * stream,
 
                     return LBABERR_OK;
                 }
-                g_list_foreach(address_list, (GFunc) g_free, NULL);
-                g_list_free(address_list);
+                g_list_free_full(address_list, g_free);
            }
             /* Record without e-mail address, or we're not creating
              * addresses: free memory. */
diff --git a/libbalsa/address-view.c b/libbalsa/address-view.c
index a816c6d..864c529 100644
--- a/libbalsa/address-view.c
+++ b/libbalsa/address-view.c
@@ -254,8 +254,7 @@ lbav_entry_setup_matches(LibBalsaAddressView * address_view,
     if (*prefix)
         match = lbav_get_matching_addresses(address_view, prefix, type);
     lbav_append_addresses(address_view, completion, match, prefix);
-    g_list_foreach(match, (GFunc) g_object_unref, NULL);
-    g_list_free(match);
+    g_list_free_full(match, g_object_unref);
 }
 
 /*
@@ -775,8 +774,7 @@ lbav_focus_out_cb(GtkEntry * entry, GdkEventFocus * event,
                 gtk_cell_editable_editing_done(GTK_CELL_EDITABLE(entry));
                 g_free(the_addr);
             }
-            g_list_foreach(match, (GFunc) g_object_unref, NULL);
-            g_list_free(match);
+            g_list_free_full(match, g_object_unref);
         }
     }
 
diff --git a/libbalsa/address.c b/libbalsa/address.c
index 698fe10..e70cd46 100644
--- a/libbalsa/address.c
+++ b/libbalsa/address.c
@@ -511,8 +511,7 @@ libbalsa_address_new_from_vcard(const gchar *str, const gchar *charset)
     g_free(first_name);
     g_free(nick_name);
     g_free(org);
-    g_list_foreach(address_list, (GFunc) g_free, NULL);
-    g_list_free(address_list);
+    g_list_free_full(address_list, g_free);
 
     return NULL;
 }
@@ -535,8 +534,7 @@ libbalsa_address_set_copy(LibBalsaAddress * dest, LibBalsaAddress * src)
     dest->last_name = g_strdup(src->last_name);
     g_free(dest->organization);
     dest->organization = g_strdup(src->organization);
-    g_list_foreach(dest->address_list, (GFunc) g_free, NULL);
-    g_list_free(dest->address_list);
+    g_list_free_full(dest->address_list, g_free);
 
     dst_al = NULL;
     for (src_al = src->address_list; src_al; src_al = src_al->next)
diff --git a/libbalsa/completion.c b/libbalsa/completion.c
index 086190b..840a320 100644
--- a/libbalsa/completion.c
+++ b/libbalsa/completion.c
@@ -56,8 +56,10 @@
 #include <string.h>
 
 #include <glib.h>
+#include "config.h"
 #include "completion.h"
 #include "abook-completion.h"
+#include "misc.h"
 
 /**
  * SECTION: completion
@@ -166,20 +168,11 @@ libbalsa_completion_add_items(LibBalsaCompletion * cmp,
     g_return_if_fail(cmp != NULL);
 
     /* optimize adding to cache? */
-    if (cmp->cache) {
-        g_list_free(cmp->cache);
-        cmp->cache = NULL;
-    }
-
-    if (cmp->prefix) {
-        g_free(cmp->prefix);
-        cmp->prefix = NULL;
-    }
+    g_clear_pointer(&cmp->cache, (GDestroyNotify) g_list_free);
+    g_clear_pointer(&cmp->prefix, (GDestroyNotify) g_free);
 
-    it = items;
-    while (it) {
+    for (it = items; it != NULL; it = it->next) {
         cmp->items = g_list_prepend(cmp->items, it->data);
-        it = it->next;
     }
 }
 
@@ -194,12 +187,9 @@ libbalsa_completion_clear_items(LibBalsaCompletion * cmp)
 {
     g_return_if_fail(cmp != NULL);
 
-    g_list_free_full(cmp->items, (GDestroyNotify) completion_data_free);
-    cmp->items = NULL;
-    g_list_free(cmp->cache);
-    cmp->cache = NULL;
-    g_free(cmp->prefix);
-    cmp->prefix = NULL;
+    libbalsa_clear_list(&cmp->items, (GDestroyNotify) completion_data_free);
+    g_clear_pointer(&cmp->cache, (GDestroyNotify) g_list_free);
+    g_clear_pointer(&cmp->prefix, (GDestroyNotify) g_free);
 }
 
 /**
@@ -248,26 +238,21 @@ libbalsa_completion_complete(LibBalsaCompletion * cmp,
 
     if (!done) {
         /* normal code */
-        g_list_free(cmp->cache);
-        cmp->cache = NULL;
-        list = cmp->items;
-        while (*prefix && list) {
-            if (!cmp->strncmp_func(prefix,
-                                   cmp->func ? cmp->func(list->
-                                                         data) : (gchar *)
-                                   list->data, len))
+        g_clear_pointer(&cmp->cache, (GDestroyNotify) g_list_free);
+        for (list = cmp->items; list != NULL && *prefix != '\0'; list = list->next) {
+            if (cmp->strncmp_func(prefix,
+                                  cmp->func ? cmp->func(list->data)
+                                            : (gchar *) list->data,
+                                  len) == 0) {
                 cmp->cache = g_list_prepend(cmp->cache, list->data);
-            list = list->next;
+            }
         }
     }
-    if (cmp->prefix) {
-        g_free(cmp->prefix);
-        cmp->prefix = NULL;
-    }
-    if (cmp->cache)
+    g_clear_pointer(&cmp->prefix, (GDestroyNotify) g_free);
+    if (cmp->cache != NULL)
         cmp->prefix = g_strdup(prefix);
 
-    return *prefix ? cmp->cache : cmp->items;
+    return *prefix != '\0' ? cmp->cache : cmp->items;
 }
 
 /**
diff --git a/libbalsa/filter-file.c b/libbalsa/filter-file.c
index d783301..d0c874e 100644
--- a/libbalsa/filter-file.c
+++ b/libbalsa/filter-file.c
@@ -369,10 +369,9 @@ libbalsa_condition_new_2_0(const gchar * filter_section_name,
            we create the combined condition. */
         info.tmp_list =
             g_list_sort(info.tmp_list, compare_conditions_order);
-        l = info.tmp_list;
-        for (; info.tmp_list; info.tmp_list = info.tmp_list->next) {
+        for (l = info.tmp_list; l != NULL; l = l->next) {
             LibBalsaTempCondition *tmp =
-                (LibBalsaTempCondition *) (info.tmp_list->data);
+                (LibBalsaTempCondition *) (l->data);
             LibBalsaCondition *res = 
                 libbalsa_condition_new_bool_ptr(FALSE, cmt, tmp->cnd,
                                                 cond_2_0);
@@ -381,7 +380,7 @@ libbalsa_condition_new_2_0(const gchar * filter_section_name,
             cond_2_0 = res;
             g_free(tmp);
         }
-        g_list_free(l);
+        g_list_free(info.tmp_list);
     }
     /* else we leak the list and structures?? */
     return cond_2_0;
diff --git a/libbalsa/filter-funcs.c b/libbalsa/filter-funcs.c
index 859c8b1..64541a6 100644
--- a/libbalsa/filter-funcs.c
+++ b/libbalsa/filter-funcs.c
@@ -500,10 +500,7 @@ libbalsa_condition_regex_free(LibBalsaConditionRegex* reg, gpointer throwaway)
 void 
 regexs_free(GSList * regexs)
 {
-    if (regexs) {
-       g_slist_foreach(regexs, (GFunc) libbalsa_condition_regex_free, NULL);
-       g_slist_free(regexs);
-    }
+    g_slist_free_full(regexs, (GDestroyNotify) libbalsa_condition_regex_free);
 }                               /* end condition_free_regexs() */
 
 void 
diff --git a/libbalsa/folder-scanners.c b/libbalsa/folder-scanners.c
index 1a3dbe2..b2822c6 100644
--- a/libbalsa/folder-scanners.c
+++ b/libbalsa/folder-scanners.c
@@ -387,8 +387,7 @@ libbalsa_imap_browse(const gchar * path, struct browser_state *state,
 
     --*depth;
 
-    g_list_foreach(list, (GFunc) g_free, NULL);
-    g_list_free(list);
+    g_list_free_full(list, g_free);
     return ret;
 }
 
diff --git a/libbalsa/identity.c b/libbalsa/identity.c
index d9c3e34..55dbcd0 100644
--- a/libbalsa/identity.c
+++ b/libbalsa/identity.c
@@ -1730,8 +1730,7 @@ help_ident_cb(GtkWidget * widget)
 static void
 lbi_free_smtp_server_list(GSList ** smtp_server_list)
 {
-    g_slist_foreach(*smtp_server_list, (GFunc) g_object_unref, NULL);
-    g_slist_free(*smtp_server_list);
+    g_slist_free_full(*smtp_server_list, g_object_unref);
     g_free(smtp_server_list);
 }
 
diff --git a/libbalsa/imap-server.c b/libbalsa/imap-server.c
index e8cc9f2..4426a23 100644
--- a/libbalsa/imap-server.c
+++ b/libbalsa/imap-server.c
@@ -855,15 +855,11 @@ libbalsa_imap_server_has_persistent_cache(LibBalsaImapServer *srv)
 void
 libbalsa_imap_server_force_disconnect(LibBalsaImapServer *imap_server)
 {
-       g_mutex_lock(&imap_server->lock);
-    g_list_foreach(imap_server->used_handles,
-                   (GFunc) lb_imap_server_info_free, NULL);
-    g_list_free(imap_server->used_handles);
-    imap_server->used_handles = NULL;
-    g_list_foreach(imap_server->free_handles,
-                   (GFunc) lb_imap_server_info_free, NULL);
-    g_list_free(imap_server->free_handles);
-    imap_server->free_handles = NULL;
+    g_mutex_lock(&imap_server->lock);
+
+    libbalsa_clear_list(&imap_server->used_handles, (GDestroyNotify) lb_imap_server_info_free);
+    libbalsa_clear_list(&imap_server->free_handles, (GDestroyNotify) lb_imap_server_info_free);
+
     g_mutex_unlock(&imap_server->lock);
 }
 
diff --git a/libbalsa/libbalsa.c b/libbalsa/libbalsa.c
index a4266ab..96a58b3 100644
--- a/libbalsa/libbalsa.c
+++ b/libbalsa/libbalsa.c
@@ -416,10 +416,10 @@ static GMutex certificate_lock;
 void
 libbalsa_certs_destroy(void)
 {
-       g_mutex_lock(&certificate_lock);
-    g_list_foreach(accepted_certs, (GFunc)X509_free, NULL);
-    g_list_free(accepted_certs);
-    accepted_certs = NULL;
+    g_mutex_lock(&certificate_lock);
+
+    libbalsa_clear_list(&accepted_certs, (GDestroyNotify) X509_free);
+
     g_mutex_unlock(&certificate_lock);
 }
 
diff --git a/libbalsa/mailbox.c b/libbalsa/mailbox.c
index 59f1396..013bd95 100644
--- a/libbalsa/mailbox.c
+++ b/libbalsa/mailbox.c
@@ -4002,8 +4002,7 @@ lbm_try_reassemble_idle(LibBalsaMailbox * mailbox)
     for (id = ids; id; id = id->next)
         lbm_try_reassemble(mailbox, id->data);
 
-    g_slist_foreach(ids, (GFunc) g_free, NULL);
-    g_slist_free(ids);
+    g_slist_free_full(ids, g_free);
     g_object_set_data(G_OBJECT(mailbox), LBM_TRY_REASSEMBLE_IDS, NULL);
 
     libbalsa_unlock_mailbox(mailbox);
diff --git a/libbalsa/mailbox_local.c b/libbalsa/mailbox_local.c
index 848e32d..61650c0 100644
--- a/libbalsa/mailbox_local.c
+++ b/libbalsa/mailbox_local.c
@@ -373,10 +373,9 @@ typedef struct {
 static void
 lbm_local_free_info(LibBalsaMailboxLocalInfo * info)
 {
-    if (info) {
+    if (info != NULL) {
         g_free(info->message_id);
-        g_list_foreach(info->refs_for_threading, (GFunc) g_free, NULL);
-        g_list_free(info->refs_for_threading);
+        g_list_free_full(info->refs_for_threading, g_free);
         g_free(info->sender);
         g_free(info);
     }
diff --git a/libbalsa/message.h b/libbalsa/message.h
index 49c7dd9..3cc11c0 100644
--- a/libbalsa/message.h
+++ b/libbalsa/message.h
@@ -157,8 +157,7 @@ struct _LibBalsaMessageHeaders {
 };
 
 /** FREE_HEADER_LIST() frees user_hdrs */
-#define FREE_HEADER_LIST(l) do{ g_list_foreach((l),(GFunc)g_strfreev,NULL);\
-                                g_list_free(l); } while(0)
+#define FREE_HEADER_LIST(l) g_list_free_full((l),(GDestroyNotify)g_strfreev)
 
 struct _LibBalsaMessage {
     GObject object;
diff --git a/libbalsa/misc.c b/libbalsa/misc.c
index e0bfcb9..448e112 100644
--- a/libbalsa/misc.c
+++ b/libbalsa/misc.c
@@ -1221,12 +1221,32 @@ libbalsa_clear_source_id(guint * tag)
 {
     gboolean retval;
 
-    g_return_val_if_fail(tag != NULL, FALSE);
-
-    if ((retval = (*tag != 0U))) {
+    retval = *tag != 0U;
+    if (retval) {
         g_source_remove(*tag);
         *tag = 0U;
     }
 
     return retval;
 }
+
+/*
+ * Convenience functions for freeing list items' data and clearing the
+ * list
+ *
+ * If the data do not need to be freed, just use
+ * g_clear_pointer(&list, (GDestroyNotify) g_list_free);
+ */
+void
+libbalsa_clear_list(GList ** list, GDestroyNotify free_func)
+{
+    g_list_free_full(*list, free_func);
+    *list = NULL;
+}
+
+void
+libbalsa_clear_slist(GSList ** list, GDestroyNotify free_func)
+{
+    g_slist_free_full(*list, free_func);
+    *list = NULL;
+}
diff --git a/libbalsa/misc.h b/libbalsa/misc.h
index 9756236..6ba1880 100644
--- a/libbalsa/misc.h
+++ b/libbalsa/misc.h
@@ -159,5 +159,7 @@ GString * libbalsa_html_encode_hyperlinks(GString * paragraph);
 gchar *libbalsa_font_string_to_css(const gchar * font_string, const gchar * name);
 
 gboolean libbalsa_clear_source_id(guint * tag);
+void libbalsa_clear_list(GList ** list, GDestroyNotify free_func);
+void libbalsa_clear_slist(GSList ** list, GDestroyNotify free_func);
 
 #endif                         /* __LIBBALSA_MISC_H__ */
diff --git a/libbalsa/rfc2445.c b/libbalsa/rfc2445.c
index cfa5f10..ce2009a 100644
--- a/libbalsa/rfc2445.c
+++ b/libbalsa/rfc2445.c
@@ -148,9 +148,7 @@ libbalsa_vcal_finalize(LibBalsaVCal * self)
 {
     g_return_if_fail(self != NULL);
 
-    if (self->vevent) {
-       g_list_free_full(self->vevent, g_object_unref);
-    }
+    g_list_free_full(self->vevent, g_object_unref);
 
     libbalsa_vcal_parent_class->finalize(G_OBJECT(self));
 }
@@ -215,12 +213,10 @@ libbalsa_vevent_finalize(LibBalsaVEvent * self)
 {
     g_return_if_fail(self != NULL);
 
-    if (self->organizer)
+    if (self->organizer) {
        g_object_unref(self->organizer);
-    if (self->attendee) {
-       g_list_foreach(self->attendee, (GFunc) g_object_unref, NULL);
-       g_list_free(self->attendee);
     }
+    g_list_free_full(self->attendee, g_object_unref);
     g_free(self->uid);
     g_free(self->summary);
     g_free(self->location);
diff --git a/libbalsa/send.c b/libbalsa/send.c
index bb234b9..eb48202 100644
--- a/libbalsa/send.c
+++ b/libbalsa/send.c
@@ -213,19 +213,16 @@ send_message_info_new(LibBalsaSmtpServer   *smtp_server,
 static void
 send_message_info_destroy(SendMessageInfo *smi)
 {
-       if (smi->outbox != NULL) {
-               g_object_unref(G_OBJECT(smi->outbox));
-       }
+    if (smi->outbox != NULL) {
+        g_object_unref(G_OBJECT(smi->outbox));
+    }
     if (smi->session != NULL) {
         g_object_unref(G_OBJECT(smi->session));
     }
-    if (smi->items != NULL) {
-        g_list_free_full(smi->items, (GDestroyNotify) msg_queue_item_destroy);
-    }
-    if (smi->progress_id != NULL) {
-       g_free(smi->progress_id);
-    }
+    g_list_free_full(smi->items, (GDestroyNotify) msg_queue_item_destroy);
+    g_free(smi->progress_id);
     g_object_unref(smi->smtp_server);
+
     g_free(smi);
 }
 
@@ -1821,8 +1818,7 @@ libbalsa_create_rfc2440_buffer(LibBalsaMessage *message,
                                               always_trust,
                                               parent, error);
         }
-        g_list_foreach(encrypt_for, (GFunc) g_free, NULL);
-        g_list_free(encrypt_for);
+        g_list_free_full(encrypt_for, g_free);
         if (!result) {
             return LIBBALSA_MESSAGE_ENCRYPT_ERROR;
         }
@@ -1909,7 +1905,7 @@ do_multipart_crypto(LibBalsaMessage *message,
                                              protocol, always_trust,
                                              parent, error);
         }
-        g_list_free_full(encrypt_for, (GDestroyNotify) g_free);
+        g_list_free_full(encrypt_for, g_free);
 
         if (!success) {
             return LIBBALSA_MESSAGE_ENCRYPT_ERROR;
diff --git a/src/balsa-app.c b/src/balsa-app.c
index f8b18c6..ff97981 100644
--- a/src/balsa-app.c
+++ b/src/balsa-app.c
@@ -412,29 +412,16 @@ balsa_app_destroy(void)
 {
     config_save();
 
-    g_list_foreach(balsa_app.address_book_list, (GFunc)g_object_unref, NULL);
-    g_list_free(balsa_app.address_book_list);
-    balsa_app.address_book_list = NULL;
+    libbalsa_clear_list(&balsa_app.address_book_list, g_object_unref);
 
     /* now free filters */
-    g_slist_foreach(balsa_app.filters, (GFunc)libbalsa_filter_free, 
+    g_slist_foreach(balsa_app.filters, (GFunc)libbalsa_filter_free,
                    GINT_TO_POINTER(TRUE));
-    g_slist_free(balsa_app.filters);
-    balsa_app.filters = NULL;
-
-    g_list_foreach(balsa_app.identities, (GFunc)g_object_unref, NULL);
-    g_list_free(balsa_app.identities);
-    balsa_app.identities = NULL;
-
-
-    g_list_foreach(balsa_app.folder_mru, (GFunc)g_free, NULL);
-    g_list_free(balsa_app.folder_mru);
-    balsa_app.folder_mru = NULL;
-
-    g_list_foreach(balsa_app.fcc_mru, (GFunc)g_free, NULL);
-    g_list_free(balsa_app.fcc_mru);
-    balsa_app.fcc_mru = NULL;
+    g_clear_pointer(&balsa_app.filters, (GDestroyNotify) g_slist_free);
 
+    libbalsa_clear_list(&balsa_app.identities, g_object_unref);
+    libbalsa_clear_list(&balsa_app.folder_mru, g_free);
+    libbalsa_clear_list(&balsa_app.fcc_mru, g_free);
 
     if(balsa_app.debug) g_print("balsa_app: Finished cleaning up.\n");
 }
diff --git a/src/balsa-index.c b/src/balsa-index.c
index 394effc..1800c5c 100644
--- a/src/balsa-index.c
+++ b/src/balsa-index.c
@@ -1494,8 +1494,7 @@ bndx_store_address(gpointer data)
     GList *messages = balsa_index_selected_list(BALSA_INDEX(data));
 
     balsa_store_address_from_messages(messages);
-    g_list_foreach(messages, (GFunc)g_object_unref, NULL);
-    g_list_free(messages);
+    g_list_free_full(messages, g_object_unref);
 }
 
 static void
diff --git a/src/balsa-mblist.c b/src/balsa-mblist.c
index 4cb666f..ac8d6db 100644
--- a/src/balsa-mblist.c
+++ b/src/balsa-mblist.c
@@ -1977,9 +1977,7 @@ bmbl_mru_combo_box_setup(GtkComboBox * combo_box)
     gtk_combo_box_set_active(combo_box, -1);
     store = GTK_LIST_STORE(gtk_combo_box_get_model(combo_box));
     gtk_list_store_clear(store);
-    g_slist_foreach(mro->real_urls, (GFunc) g_free, NULL);
-    g_slist_free(mro->real_urls);
-    mro->real_urls = NULL;
+    libbalsa_clear_slist(&mro->real_urls, g_free);
 
     for (list = *mro->url_list; list; list = list->next) {
         const gchar *url = list->data;
@@ -2035,8 +2033,7 @@ bmbl_mru_combo_box_changed(GtkComboBox * combo_box,
 static void
 bmbl_mru_combo_box_destroy_cb(BalsaMBListMRUOption * mro)
 {
-    g_slist_foreach(mro->real_urls, (GFunc) g_free, NULL);
-    g_slist_free(mro->real_urls);
+    g_slist_free_full(mro->real_urls, g_free);
     g_free(mro);
 }
 
diff --git a/src/balsa-message.c b/src/balsa-message.c
index 0025793..33a9901 100644
--- a/src/balsa-message.c
+++ b/src/balsa-message.c
@@ -814,9 +814,7 @@ balsa_message_destroy(GObject * object)
         bm->treeview = NULL;
     }
 
-    g_list_free(bm->save_all_list);
-    bm->save_all_list = NULL;
-
+    g_clear_pointer(&bm->save_all_list, (GDestroyNotify) g_list_free);
     g_clear_object(&bm->save_all_popup);
     g_clear_object(&bm->parts_popup);
     g_clear_object(&bm->bm_widget);
@@ -923,12 +921,8 @@ tree_mult_selection_popup(BalsaMessage * bm, const GdkEvent * event,
     gint selected;
 
     /* destroy left-over select list and popup... */
-    g_list_free(bm->save_all_list);
-    bm->save_all_list = NULL;
-    if (bm->save_all_popup) {
-        g_object_unref(bm->save_all_popup);
-        bm->save_all_popup = NULL;
-    }
+    g_clear_pointer(&bm->save_all_list, (GDestroyNotify) g_list_free);
+    g_clear_object(&bm->save_all_popup);
 
     /* collect all selected info blocks */
     gtk_tree_selection_selected_foreach(selection,
@@ -950,8 +944,7 @@ tree_mult_selection_popup(BalsaMessage * bm, const GdkEvent * event,
                                          NULL);
             }
         }
-        g_list_free(bm->save_all_list);
-        bm->save_all_list = NULL;
+        g_clear_pointer(&bm->save_all_list, (GDestroyNotify) g_list_free);
     } else if (selected > 1) {
         GtkWidget *menu_item;
 
diff --git a/src/balsa-mime-widget-text.c b/src/balsa-mime-widget-text.c
index 53f3d81..1a92427 100644
--- a/src/balsa-mime-widget-text.c
+++ b/src/balsa-mime-widget-text.c
@@ -110,7 +110,7 @@ static void check_call_url(GtkGestureMultiPress *multi_press,
                            gpointer              user_data);
 static message_url_t * find_url(GtkWidget * widget, gint x, gint y, GList * url_list);
 static void handle_url(const gchar* url);
-static void free_url_list(GList * url_list);
+static void free_url(message_url_t * url);
 static void bm_widget_on_url(const gchar *url);
 static void phrase_highlight(GtkTextBuffer * buffer, const gchar * id,
                             gunichar tag_char, const gchar * property,
@@ -154,7 +154,7 @@ balsa_mime_widget_text_finalize(GObject * gobject) {
     BalsaMimeWidgetText *mwt;
 
     mwt = BALSA_MIME_WIDGET_TEXT(gobject);
-    free_url_list(mwt->url_list);
+    g_list_free_full(mwt->url_list, (GDestroyNotify) free_url);
 
     G_OBJECT_CLASS(balsa_mime_widget_text_parent_class)->finalize(gobject);
 }
@@ -874,17 +874,10 @@ handle_url(const gchar * url)
 }
 
 static void
-free_url_list(GList * url_list)
+free_url(message_url_t * url)
 {
-    GList *list;
-
-    for (list = url_list; list != NULL; list = list->next) {
-        message_url_t *url_data = (message_url_t *) list->data;
-
-        g_free(url_data->url);
-        g_free(url_data);
-    }
-    g_list_free(url_list);
+    g_free(url->url);
+    g_free(url);
 }
 
 /* --- Hacker's Jargon highlighting --- */
diff --git a/src/balsa-print-object-text.c b/src/balsa-print-object-text.c
index df96ffb..298a459 100644
--- a/src/balsa-print-object-text.c
+++ b/src/balsa-print-object-text.c
@@ -307,10 +307,7 @@ balsa_print_object_text_plain(GList *list, GtkPrintContext * context,
            g_array_remove_index(attr_offs, 0);
            this_par_part = this_par_part->next;
        }
-       if (attr_list) {
-           g_list_foreach(attr_list, (GFunc) g_free, NULL);
-           g_list_free(attr_list);
-       }
+       g_list_free_full(attr_list, g_free);
        g_list_free(par_parts);
        g_array_free(attr_offs, TRUE);
     }
diff --git a/src/filter-edit-callbacks.c b/src/filter-edit-callbacks.c
index 8ce273c..1157947 100644
--- a/src/filter-edit-callbacks.c
+++ b/src/filter-edit-callbacks.c
@@ -1336,9 +1336,7 @@ update_filters_mailbox(GtkTreeModel * model, GtkTreePath * path,
        return FALSE;
 
     /* First we free the filters list (which is now obsolete) */
-    g_slist_foreach(mailbox->filters, (GFunc) g_free, NULL);
-    g_slist_free(mailbox->filters);
-    mailbox->filters = NULL;
+    libbalsa_clear_slist(&mailbox->filters, g_free);
     /* Second we replace old filters name by the new ones
      * Note : deleted filters are also removed */
     if (!filters_names_changes)
@@ -1427,21 +1425,12 @@ void fe_destroy_window_cb(GtkWidget * widget,gpointer throwaway)
         g_free(((filters_names_rec *)lst->data)->new_name);
         g_free((filters_names_rec *)lst->data);
     }
+    g_clear_pointer(&filters_names_changes, (GDestroyNotify) g_list_free);
 
-    g_list_free(filters_names_changes);
-    filters_names_changes=NULL;
-
-    for (lst = new_filters_names; lst != NULL; lst = lst->next) {
-        g_free((gchar *)lst->data);
-    }
-
-    g_list_free(new_filters_names);
-    new_filters_names=NULL;
+    libbalsa_clear_list(&new_filters_names, g_free);
 
     /* free all strings in fe_user_headers_list */
-    g_list_foreach(fe_user_headers_list,(GFunc)g_free,NULL);
-    g_list_free(fe_user_headers_list);
-    fe_user_headers_list = NULL;
+    libbalsa_clear_list(&fe_user_headers_list, g_free);
 
     fe_already_open=FALSE;
 }
diff --git a/src/filter-run-callbacks.c b/src/filter-run-callbacks.c
index 282a183..8b355f0 100644
--- a/src/filter-run-callbacks.c
+++ b/src/filter-run-callbacks.c
@@ -146,9 +146,8 @@ static
 void save_filters(BalsaFilterRunDialog * p)
 {
     if (p->filters_modified) {
-       g_slist_foreach(p->mbox->filters, (GFunc) g_free, NULL);
-       g_slist_free(p->mbox->filters);
-       p->mbox->filters=build_selected_filters_list(p->selected_filters,FALSE);
+       g_slist_free_full(p->mbox->filters, g_free);
+       p->mbox->filters = build_selected_filters_list(p->selected_filters,FALSE);
        config_mailbox_filters_save(p->mbox);
        p->filters_modified=FALSE;
     }
diff --git a/src/main-window.c b/src/main-window.c
index 25440d7..c01f3ee 100644
--- a/src/main-window.c
+++ b/src/main-window.c
@@ -3465,8 +3465,7 @@ bw_check_messages_thread(struct check_messages_thread_info *info)
                libbalsa_progress_dialog_ensure(&progress_dialog, _("Checking Mail…"), 
GTK_WINDOW(info->window), _("Mailboxes"));
        }
        g_slist_foreach(list, (GFunc) bw_mailbox_check, info);
-       g_slist_foreach(list, (GFunc) g_object_unref, NULL);
-       g_slist_free(list);
+       g_slist_free_full(list, g_object_unref);
        if (info->with_progress_dialog) {
                libbalsa_progress_dialog_update(&progress_dialog, _("Mailboxes"), TRUE, 1.0, NULL);
        }
diff --git a/src/print-gtk.c b/src/print-gtk.c
index 400e933..81d65b8 100644
--- a/src/print-gtk.c
+++ b/src/print-gtk.c
@@ -745,8 +745,7 @@ message_print(LibBalsaMessage * msg, GtkWindow * parent)
     /* clean up */
     if (err)
        g_error_free(err);
-    g_list_foreach(print_data->print_parts, (GFunc) g_object_unref, NULL);
-    g_list_free(print_data->print_parts);
+    g_list_free_full(print_data->print_parts, g_object_unref);
     g_free(print_data->footer);
     g_free(print_data);
     g_object_unref(G_OBJECT(print));
diff --git a/src/save-restore.c b/src/save-restore.c
index 5906516..97e0a25 100644
--- a/src/save-restore.c
+++ b/src/save-restore.c
@@ -1549,8 +1549,7 @@ config_address_books_load(void)
     libbalsa_conf_pop_group();
 
     /* Free old data in case address books were set by eg. config druid. */
-    g_list_free_full(balsa_app.address_book_list, g_object_unref);
-    balsa_app.address_book_list = NULL;
+    libbalsa_clear_list(&balsa_app.address_book_list, g_object_unref);
 
     libbalsa_conf_foreach_group(ADDRESS_BOOK_SECTION_PREFIX,
                                 config_address_book_load,
@@ -1619,8 +1618,7 @@ config_identities_load()
     gchar *default_ident;
 
     /* Free old data in case identities were set by eg. config druid. */
-    g_list_free_full(balsa_app.identities, g_object_unref);
-    balsa_app.identities = NULL;
+    libbalsa_clear_list(&balsa_app.identities, g_object_unref);
 
     libbalsa_conf_push_group("identity");
     default_ident = libbalsa_conf_get_string("CurrentIdentity");
diff --git a/src/sendmsg-window.c b/src/sendmsg-window.c
index f44dab6..fe63b9f 100644
--- a/src/sendmsg-window.c
+++ b/src/sendmsg-window.c
@@ -627,11 +627,7 @@ balsa_sendmsg_destroy_handler(BalsaSendmsg * bsmsg)
     quit_on_close = bsmsg->quit_on_close;
     g_free(bsmsg->fcc_url);
     g_free(bsmsg->in_reply_to);
-    if(bsmsg->references) {
-        g_list_foreach(bsmsg->references, (GFunc) g_free, NULL);
-        g_list_free(bsmsg->references);
-        bsmsg->references = NULL;
-    }
+    libbalsa_clear_list(&bsmsg->references, g_free);
 
 #if !(HAVE_GSPELL || HAVE_GTKSPELL)
     if (bsmsg->spell_checker)
@@ -2070,8 +2066,7 @@ insert_selected_messages(BalsaSendmsg *bsmsg, QuoteType type)
             gtk_text_buffer_insert_at_cursor(buffer, body->str, body->len);
             g_string_free(body, TRUE);
        }
-       g_list_foreach(l, (GFunc)g_object_unref, NULL);
-        g_list_free(l);
+       g_list_free_full(l, g_object_unref);
     }
 }
 
@@ -2109,8 +2104,7 @@ sw_attach_messages_activated(GSimpleAction * action,
                 break;
             }
        }
-       g_list_foreach(l, (GFunc)g_object_unref, NULL);
-        g_list_free(l);
+       g_list_free_full(l, g_object_unref);
     }
 }
 
@@ -2217,12 +2211,12 @@ attachments_add(GtkWidget        * widget,
     } else if (target == g_intern_static_string("text/uri-list")) {
         GSList *uri_list, *list;
 
-        list = uri2gslist((gchar *) gtk_selection_data_get_data(selection_data));
-        for (uri_list = list; uri_list != NULL; uri_list = uri_list->next) {
-           add_attachment(bsmsg, uri_list->data, FALSE, NULL);
-            g_free(uri_list->data);
+        uri_list = uri2gslist((gchar *) gtk_selection_data_get_data(selection_data));
+        for (list = uri_list; list != NULL; list = list->next) {
+           add_attachment(bsmsg, list->data, FALSE, NULL);
+            g_free(list->data);
         }
-        g_slist_free(list);
+        g_slist_free(uri_list);
     } else if (target == g_intern_static_string("STRING") ||
                target == g_intern_static_string("text/plain")) {
        gchar *url = rfc2396_uri((gchar *) gtk_selection_data_get_data(selection_data));
@@ -2801,24 +2795,24 @@ drag_data_quote(GtkWidget        * widget,
         }
         balsa_index_selected_msgnos_free(index, selected);
     } else if (target == g_intern_static_string(drop_types[TARGET_URI_LIST])) {
-        GSList *uri_list =
-            uri2gslist((gchar *)
-                       gtk_selection_data_get_data(selection_data));
-        for (; uri_list != NULL; uri_list = uri_list->next) {
+        GSList *uri_list, *list;
+
+        uri_list = uri2gslist((gchar *) gtk_selection_data_get_data(selection_data));
+        for (list = uri_list; list != NULL; list = list->next) {
             /* Since current GtkTextView gets this signal twice for
              * every action (#150141) we need to check for duplicates,
              * which is a good idea anyway. */
            has_file_attached_t find_file;
 
-           find_file.name = uri_list->data;
+           find_file.name = list->data;
            find_file.found = FALSE;
             if (bsmsg->tree_view)
                 gtk_tree_model_foreach(BALSA_MSG_ATTACH_MODEL(bsmsg),
                                        has_file_attached, &find_file);
             if (!find_file.found)
-                add_attachment(bsmsg, uri_list->data, FALSE, NULL);
+                add_attachment(bsmsg, list->data, FALSE, NULL);
+            g_free(list->data);
         }
-        g_slist_foreach(uri_list, (GFunc) g_free, NULL);
         g_slist_free(uri_list);
     }
 
@@ -6851,8 +6845,7 @@ sendmsg_window_reply_embedded(LibBalsaMessageBody *part,
                              in_reply_to, message_id);
         fill_body_from_part(bsmsg, part->embhdrs, message_id, references,
                             part->parts, QUOTE_ALL);
-        g_list_foreach(references, (GFunc) g_free, NULL);
-        g_list_free(references);
+        g_list_free_full(references, g_free);
     }
 
     if (reply_type == SEND_REPLY_ALL)
diff --git a/src/store-address.c b/src/store-address.c
index 85f9091..6616cea 100644
--- a/src/store-address.c
+++ b/src/store-address.c
@@ -177,8 +177,7 @@ store_address_response(GtkWidget * dialog, gint response,
         g_object_weak_unref(G_OBJECT(list->data),
                             (GWeakNotify) store_address_weak_notify, info);
     }
-    g_list_foreach(info->entries_list, (GFunc) g_free, NULL);
-    g_list_free(info->entries_list);
+    g_list_free_full(info->entries_list, g_free);
     store_address_free(info);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]