Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=8c4fa1fdb742617e4df8a5387e545034f8e934f7
commit 8c4fa1fdb742617e4df8a5387e545034f8e934f7 Author: Michel Hermier <[email protected]> Date: Thu May 16 08:04:35 2013 +0200 libflib: s/f_listaccmulator/f_listaccmulate/g. Add f_list_exclude. diff --git a/lib/libflib/flist.c b/lib/libflib/flist.c index dedac0b..a7d9b3d 100644 --- a/lib/libflib/flist.c +++ b/lib/libflib/flist.c @@ -39,9 +39,9 @@ FList *f_list_new () { } void f_list_delete (FList *list, FVisitorFunc fn, void *user_data) { - FList *next; + FList *next = list; - for (; list != NULL; list = next) { + while ((list = next) != NULL) { next = list->next; f_list_free (list, fn, user_data); } @@ -57,9 +57,7 @@ FList *f_list_alloc (void *data) { } /** - * Free a list item. - * - * Returns the next item in the list or NULL if item was the last one in the list. + * Remove the item from it's list and free it. */ void f_list_free (FList *item, FVisitorFunc fn, void *user_data) { if (item != NULL) { @@ -193,7 +191,7 @@ FList *f_list_deep_copy (FList *list, FCopyFunc fn, void *user_data) { f_listaccumulator_init (&listaccumulator, f_list_new ()); for (; list; list = list->next) { - f_listaccumulator (fn (list->data, user_data), &listaccumulator); + f_listaccumulate (fn (list->data, user_data), &listaccumulator); } return f_listaccumulator_fini (&listaccumulator); } @@ -213,13 +211,29 @@ FList *f_list_detect (FList *list, FDetectFunc dfn, void *user_data) { return list; } +void f_list_exclude (FList **list, FList **excludelist, FDetectFunc dfn, void *user_data) { + FListAccumulator listaccumulator; + FList *item, *next = *list; + + f_listaccumulator_init (&listaccumulator, *excludelist); + while ((item = f_list_detect (next, dfn, user_data)) != NULL) { + next = item->next; + if (*list == item) { + *list = (*list)->next; + } + f_list_remove (item); + f_listaccumulate (item, &listaccumulator); + } + *excludelist = f_listaccumulator_fini (&listaccumulator); +} + FList *f_list_filter (FList *list, FDetectFunc dfn, void *user_data) { FListAccumulator listaccumulator; f_listaccumulator_init (&listaccumulator, f_list_new ()); for (list = f_list_detect (list, dfn, user_data); list != NULL; list = f_list_detect (f_list_next (list), dfn, user_data)) { - f_listaccumulator (list->data, &listaccumulator); + f_listaccumulate (list->data, &listaccumulator); } return f_listaccumulator_fini (&listaccumulator); } @@ -258,7 +272,7 @@ FList *f_list_reverse (FList *list) { FListAccumulator listaccumulator; f_listaccumulator_init (&listaccumulator, f_list_new ()); - f_list_foreach (list, (FVisitorFunc)f_listreverseaccumulator, &listaccumulator); + f_list_foreach (list, (FVisitorFunc)f_listreverseaccumulate, &listaccumulator); return f_listaccumulator_fini (&listaccumulator); } @@ -275,7 +289,7 @@ FList *f_list_uniques (FList *list, FCompareFunc fn, void *user_data) { f_listaccumulator_init (&listaccumulator, f_list_new ()); for (; list != NULL; list = list->next) { if (f_list_find_custom (listaccumulator.head, list->data, fn, user_data) == NULL) { - f_listaccumulator (list->data, &listaccumulator); + f_listaccumulate (list->data, &listaccumulator); } } return f_listaccumulator_fini (&listaccumulator); diff --git a/lib/libflib/flist.h b/lib/libflib/flist.h index 62d55ec..b6ccf6d 100644 --- a/lib/libflib/flist.h +++ b/lib/libflib/flist.h @@ -69,6 +69,7 @@ FList *f_list_copy (FList *list); FList *f_list_deep_copy (FList *list, FCopyFunc fn, void *user_data); void f_list_detach (FList *list, FCopyFunc fn, void *user_data); FList *f_list_detect (FList *list, FDetectFunc dfn, void *user_data); +void f_list_exclude (FList **list, FList **excludelist, FDetectFunc dfn, void *user_data); FList *f_list_filter (FList *list, FDetectFunc fn, void *user_data); FList *f_list_find (FList *list, const void *data); FList *f_list_find_custom (FList *list, const void *data, FCompareFunc cfn, void *user_data); diff --git a/lib/libflib/flistaccumulator.c b/lib/libflib/flistaccumulator.c index 25bbc35..852273f 100644 --- a/lib/libflib/flistaccumulator.c +++ b/lib/libflib/flistaccumulator.c @@ -40,14 +40,14 @@ FList *f_listaccumulator_fini (FListAccumulator *listaccumulator) { } void f_listaccumulator_accumulate (FListAccumulator *listaccumulator, void *data) { - f_listaccumulator (data, listaccumulator); + f_listaccumulate (data, listaccumulator); } void f_listaccumulator_reverse_accumulate (FListAccumulator *listaccumulator, void *data) { - f_listreverseaccumulator (data, listaccumulator); + f_listreverseaccumulate (data, listaccumulator); } -void f_listaccumulator (void *data, FListAccumulator *listaccumulator) { +void f_listaccumulate (void *data, FListAccumulator *listaccumulator) { FList *item = f_list_alloc (data); if (listaccumulator->head != NULL) { @@ -58,7 +58,7 @@ void f_listaccumulator (void *data, FListAccumulator *listaccumulator) { } } -void f_listreverseaccumulator (void *data, FListAccumulator *listaccumulator) { +void f_listreverseaccumulate (void *data, FListAccumulator *listaccumulator) { FList *item = f_list_alloc (data); if (listaccumulator->head != NULL) { diff --git a/lib/libflib/flistaccumulator.h b/lib/libflib/flistaccumulator.h index d699974..b819ba5 100644 --- a/lib/libflib/flistaccumulator.h +++ b/lib/libflib/flistaccumulator.h @@ -37,8 +37,8 @@ FList *f_listaccumulator_fini (FListAccumulator *listaccumulator); void f_listaccumulator_accumulate (FListAccumulator *listaccumulator, void *data); void f_listaccumulator_reverse_accumulate (FListAccumulator *listaccumulator, void *data); -void f_listaccumulator (void *data, FListAccumulator *listaccumulator); -void f_listreverseaccumulator (void *data, FListAccumulator *listaccumulator); +void f_listaccumulate (void *data, FListAccumulator *listaccumulator); +void f_listreverseaccumulate (void *data, FListAccumulator *listaccumulator); #endif /* F_LISTACCUMULATOR_H */ _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
