summaryrefslogtreecommitdiff
path: root/mh
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2010-02-20 20:19:45 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2010-02-20 20:22:54 +0200
commit1413567bfd73bfb39404201a4fc19a4d23dae3ec (patch)
tree8983ea8e696cb5fc6dae2519fb28a8a338fa8b76 /mh
parenta192c1115ffc99fe631826cd6f17ce00f4d22820 (diff)
downloadmailutils-1413567bfd73bfb39404201a4fc19a4d23dae3ec.tar.gz
mailutils-1413567bfd73bfb39404201a4fc19a4d23dae3ec.tar.bz2
Mu_list_replace and mu_list_remove actually reclaim the memory associated with the item.
* include/mailutils/iterator.h (mu_itrctl_delete_nd) (mu_itrctl_replace_nd): New mu_itrctl_req constants. * include/mailutils/list.h (mu_list_remove_nd) (mu_list_replace_nd): New prototypes. (mu_list_destroy_item_t): New typedef. (mu_list_set_destroy_item): Return mu_list_destroy_item_t. * mailbox/list.c (DESTROY_ITEM): New macro. (mu_list_destroy): Use DESTROY_ITEM. (mu_list_remove, mu_list_replace): Actually destroy the item being removed. (mu_list_remove_nd, mu_list_replace_nd): New functions. (mu_list_set_destroy_item): Return previous value of destroy_item. (list_itrctl): Handle mu_itrctl_delete_nd and mu_itrctl_replace_nd. * mailbox/observer.c (mu_observable_create): Register destroy_item function. (mu_observable_destroy): Remove explicit loop. Rely on destroy_item instead. (mu_observable_detach): Use mu_iterator_ctl to actually remove the event. * mh/mh_alias.y (_insert_list): Remove. (alias_expand_list): Use mu_iterator_ctl to insert replacement list and remove the current item. * mh/sortm.c (addop): Register destroy_item function. (remop): Remove call to free. * movemail/movemail.c (main): <uidl loop>: Use mu_itrctl_delete to remove items. * libmu_sieve/util.c: Minor change. * mail/util.c (util_slist_compare): New static function. (util_slist_add): Register destroy_item and comparison functions for the new list. (util_slist_remove,util_slist_destroy): Rewrite. * imap4d/authenticate.c (auth_add): Use mu_list_free_item as destroy_item function. * imap4d/util.c (util_register_event): Likewise. * include/mailutils/cpp/list.h (List)<set_destroy_item>: Change return value. * libmu_cpp/list.cc (List::set_destroy_item): Reflect changes to mu_list_set_destroy_item. * libmu_argp/common.c: Include stdlib.h
Diffstat (limited to 'mh')
-rw-r--r--mh/mh_alias.y26
-rw-r--r--mh/sortm.c11
2 files changed, 11 insertions, 26 deletions
diff --git a/mh/mh_alias.y b/mh/mh_alias.y
index c6e742b8e..ca27e8b29 100644
--- a/mh/mh_alias.y
+++ b/mh/mh_alias.y
@@ -262,26 +262,6 @@ aliascmp (const char *pattern, const char *name)
return strcmp (pattern, name);
}
-
-int
-_insert_list (mu_list_t list, void *prev, mu_list_t new_list)
-{
- mu_iterator_t itr;
-
- if (mu_list_get_iterator (new_list, &itr))
- return 1;
- for (mu_iterator_first (itr); !mu_iterator_is_done (itr); mu_iterator_next (itr))
- {
- void *item;
-
- mu_iterator_current (itr, &item);
- mu_list_insert (list, prev, item, 0);
- prev = item;
- }
- mu_iterator_destroy (&itr);
- return 0;
-}
-
static int mh_alias_get_internal (const char *name, mu_iterator_t start,
mu_list_t *return_list, int *inclusive);
@@ -300,9 +280,11 @@ alias_expand_list (mu_list_t name_list, mu_iterator_t orig_itr, int *inclusive)
mu_iterator_current (itr, (void **)&name);
if (mh_alias_get_internal (name, orig_itr, &exlist, inclusive) == 0)
{
- _insert_list (name_list, name, exlist);
- mu_list_remove (name_list, name);
+ /* Insert exlist after name */
+ mu_iterator_ctl (itr, mu_itrctl_insert_list, exlist);
mu_list_destroy (&exlist);
+ /* Remove name */
+ mu_iterator_ctl (itr, mu_itrctl_delete, NULL);
}
}
mu_iterator_destroy (&itr);
diff --git a/mh/sortm.c b/mh/sortm.c
index 06482f924..68b95c38d 100644
--- a/mh/sortm.c
+++ b/mh/sortm.c
@@ -215,10 +215,14 @@ addop (char *field, compfun comp)
{
struct comp_op *op = xmalloc (sizeof (*op));
- if (!oplist && mu_list_create (&oplist))
+ if (!oplist)
{
- mu_error (_("can't create operation list"));
- exit (1);
+ if (mu_list_create (&oplist))
+ {
+ mu_error (_("can't create operation list"));
+ exit (1);
+ }
+ mu_list_set_destroy_item (oplist, mu_list_free_item);
}
op->field = field;
op->comp = comp;
@@ -248,7 +252,6 @@ remop (compfun comp)
d.op = NULL;
mu_list_do (oplist, rem_action, &d);
mu_list_remove (oplist, d.op);
- free (d.op);
}
struct comp_data {

Return to:

Send suggestions and report system problems to the System administrator.