summaryrefslogtreecommitdiff
path: root/apps/plugins/mpegplayer/mpeg_misc.c
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2010-05-17 12:34:05 +0000
committerMichael Sevakis <jethead71@rockbox.org>2010-05-17 12:34:05 +0000
commitfcf36dd4f9879a82342e5606535d2dcf46d1de2a (patch)
tree21ed249c7a6f9d0bd7e2049c7a9f9e0708ba28f8 /apps/plugins/mpegplayer/mpeg_misc.c
parent9fde12676b382a31a10c58e2473edfde460e4d73 (diff)
downloadrockbox-fcf36dd4f9879a82342e5606535d2dcf46d1de2a.zip
rockbox-fcf36dd4f9879a82342e5606535d2dcf46d1de2a.tar.gz
rockbox-fcf36dd4f9879a82342e5606535d2dcf46d1de2a.tar.bz2
rockbox-fcf36dd4f9879a82342e5606535d2dcf46d1de2a.tar.xz
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
Diffstat (limited to 'apps/plugins/mpegplayer/mpeg_misc.c')
-rw-r--r--apps/plugins/mpegplayer/mpeg_misc.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/apps/plugins/mpegplayer/mpeg_misc.c b/apps/plugins/mpegplayer/mpeg_misc.c
index 8e6ccf6..e201aa6 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 */
+ }
+}