Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=8bcc25958f41e31d45c3b72f0ab68c350b3ad928
commit 8bcc25958f41e31d45c3b72f0ab68c350b3ad928 Author: Michel Hermier <[email protected]> Date: Fri Jun 7 12:46:02 2013 +0200 libflib: First chunck of new FList API. diff --git a/lib/libflib/flist.c b/lib/libflib/flist.c index 83526a9..eea9b4d 100644 --- a/lib/libflib/flist.c +++ b/lib/libflib/flist.c @@ -29,7 +29,123 @@ #include "flistaccumulator.h" #include "fstdlib.h" -#if 0 +void f_listitem_init (FListItem *listitem) { + listitem->next = listitem->previous = listitem; +} + +void f_listitem_fini (FListItem *listitem, FVisitorFunc fn, void *user_data) { + FVisitor visitor = { + .fn = fn, + .user_data = user_data + }; + + f_visit (listitem, &visitor); + f_listitem_remove (listitem); +} + +void f_listitem_delete (FListItem *listitem, FVisitorFunc fn, void *user_data) { + if (listitem != NULL) { + f_listitem_fini (listitem, fn, user_data); + f_free (listitem); + } +} + +FListItem *f_listitem_next (FListItem *listitem) { + return listitem != NULL ? listitem->next : NULL; +} + +FListItem *f_listitem_previous (FListItem *listitem) { + return listitem != NULL ? listitem->previous : NULL; +} + +/** + * Insert a @listitem after @listitem_ref. + */ +void f_listitem_insert_after (FListItem *listitem, FListItem *listitem_ref) { + f_listitem_insert_range_after (listitem, listitem, listitem_ref); +} + +/** + * Insert a @listitem before @listitem_ref. + */ +void f_listitem_insert_before (FListItem *listitem, FListItem *listitem_ref) { + f_listitem_insert_range_before (listitem, listitem, listitem_ref); +} + +/** + * Insert a @listitem_first to @listitem_last after @listitem_ref. + */ +void f_listitem_insert_range_after (FListItem *listitem_first, FListItem *listitem_last, FListItem *listitem_ref) { + assert (listitem_ref != NULL); + if (listitem_first == NULL || + listitem_last == NULL) { + return; + } + listitem_first->previous = listitem_ref; + listitem_last->next = listitem_ref->next; + listitem_first->previous->next = listitem_first; + listitem_last->next->previous = listitem_last; +} + +/** + * Insert a @listitem_first to @listitem_last before @listitem_ref. + */ +void f_listitem_insert_range_before (FListItem *listitem_first, FListItem *listitem_last, FListItem *listitem_ref) { + assert (listitem_ref != NULL); + if (listitem_first == NULL || + listitem_last == NULL) { + return; + } + listitem_first->previous = listitem_ref->previous; + listitem_last->next = listitem_ref; + listitem_first->previous->next = listitem_first; + listitem_last->next->previous = listitem_last; +} + +/** + * Remove a @listitem from the list it belongs. + */ +void f_listitem_remove (FListItem *listitem) { + if (listitem != NULL) { + listitem->next->previous = listitem->previous; + listitem->previous->next = listitem->next; + f_listitem_init (listitem); + } +} + +static +FListItem *f_list_head (FList *list) { + return list != NULL ? &list->head : NULL; +} + +FListItem *f_list_begin (FList *list) { + return f_list_first (list); +} + +FListItem *f_list_end (FList *list) { + return f_list_head (list); +} + +FListItem *f_list_rbegin (FList *list) { + return f_list_last (list); +} + +FListItem *f_list_rend (FList *list) { + return f_list_head (list); +} + +FListItem *f_list_first (FList *list) { + FListItem *head = f_list_head (list); + + return head != NULL ? head->next : NULL; +} + +FListItem *f_list_last (FList *list) { + FListItem *head = f_list_head (list); + + return head != NULL ? head->previous : NULL; +} + int f_list_add (FList *list, FListItem *listitem) { return f_list_append (list, listitem); } @@ -42,7 +158,6 @@ int f_list_append (FList *list, FListItem *listitem) { f_listitem_insert_before (listitem, f_list_end (list)); return 0; } -#endif /* DO NOT MAKE PUBLIC FOR NOW: * Require list implemantation change. diff --git a/lib/libflib/flist.h b/lib/libflib/flist.h index 61897ad..b4a5360 100644 --- a/lib/libflib/flist.h +++ b/lib/libflib/flist.h @@ -32,16 +32,59 @@ struct FListItem { FListItem *previous; }; +void f_listitem_init (FListItem *listitem); +void f_listitem_fini (FListItem *listitem, FVisitorFunc fn, void *user_data); + +void f_listitem_delete (FListItem *listitem, FVisitorFunc fn, void *user_data); + +FListItem *f_listitem_next (FListItem *listitem); +FListItem *f_listitem_previous (FListItem *listitem); + +void f_listitem_insert_after (FListItem *listitem, FListItem *listitem_ref); +void f_listitem_insert_before (FListItem *listitem, FListItem *listitem_ref); +void f_listitem_insert_range_after (FListItem *listitem_first, FListItem *listitem_last, FListItem *listitem_ref); +void f_listitem_insert_range_before (FListItem *listitem_first, FListItem *listitem_last, FListItem *listitem_ref); +void f_listitem_remove (FListItem *listitem); + typedef struct FList FList; struct FList { FListItem head; }; -#if 0 +FListItem *f_list_begin (FList *list); +FListItem *f_list_end (FList *list); +FListItem *f_list_rbegin (FList *list); +FListItem *f_list_rend (FList *list); + +FListItem *f_list_first (FList *list); +FListItem *f_list_last (FList *list); + int f_list_add (FList *list, FListItem *listitem); int f_list_append (FList *list, FListItem *listitem); + +#define f_list_entry(ptr, type, member) \ + f_containerof (ptr, type, member) +#if 0 +#define f_foreach(it, list) \ + for (it = f_list_begin (f_identity_cast(FList *, list)); \ + it != f_list_end (list); \ + it = f_identity_cast(FListItem *, it->next)) +#endif +#define f_foreach_entry(it, list, member) \ + for (it = f_list_entry (f_list_begin (list), f_typeof (*it), member); \ + &it->member != f_list_end (list); \ + it = f_list_entry (it->member.next, f_typeof (*it), member)) +#if 0 +#define f_rforeach(it, list) \ + for (it = f_list_rbegin (f_identity_cast(FList *, list)); \ + it != f_list_rend (FList *, list); \ + it = f_identity_cast(FListItem *, it->next)) #endif +#define f_rforeach_entry(it, list, member) \ + for (it = f_list_entry (f_list_rbegin (list), f_typeof (*it), member); \ + &it->member != f_list_rend (list); \ + it = f_list_entry (it->member.previous, f_typeof(*it), member)) typedef struct FPtrListItem FPtrListItem; _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
