From fcf36dd4f9879a82342e5606535d2dcf46d1de2a Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Mon, 17 May 2010 12:34:05 +0000 Subject: Simplify mpegplayer a bit and use array-based lists rather than linked lists for stream management. Move a couple useful functions to handle pointer arrays from kernel.c into general.c; mpeglayer now makes use of them. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26101 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/mpegplayer/mpeg_misc.c | 60 +++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'apps/plugins/mpegplayer/mpeg_misc.c') diff --git a/apps/plugins/mpegplayer/mpeg_misc.c b/apps/plugins/mpegplayer/mpeg_misc.c index 8e6ccf650f..e201aa69c7 100644 --- a/apps/plugins/mpegplayer/mpeg_misc.c +++ b/apps/plugins/mpegplayer/mpeg_misc.c @@ -102,3 +102,63 @@ uint32_t muldiv_uint32(uint32_t multiplicand, return UINT32_MAX; /* Saturate */ } + + +/** Lists **/ + +/* Does the list have any members? */ +bool list_is_empty(void **list) +{ + return *list == NULL; +} + +/* Is the item inserted into a particular list? */ +bool list_is_member(void **list, void *item) +{ + return *rb->find_array_ptr(list, item) != NULL; +} + +/* Removes an item from a list - returns true if item was found + * and thus removed. */ +bool list_remove_item(void **list, void *item) +{ + return rb->remove_array_ptr(list, item) != -1; +} + +/* Adds a list item, insert last, if not already present. */ +void list_add_item(void **list, void *item) +{ + void **item_p = rb->find_array_ptr(list, item); + if (*item_p == NULL) + *item_p = item; +} + +/* Clears the entire list. */ +void list_clear_all(void **list) +{ + while (*list != NULL) + *list++ = NULL; +} + +/* Enumerate all items in the array, passing each item in turn to the + * callback as well as the data value. The current item may be safely + * removed. Other changes during enumeration are undefined. The callback + * may return 'false' to stop the enumeration early. */ +void list_enum_items(void **list, + list_enum_callback_t callback, + intptr_t data) +{ + for (;;) + { + void *item = *list; + + if (item == NULL) + break; + + if (callback != NULL && !callback(item, data)) + break; + + if (*list == item) + list++; /* Item still there */ + } +} -- cgit v1.2.3