summaryrefslogtreecommitdiffstats
path: root/firmware/general.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 /firmware/general.c
parent9fde12676b382a31a10c58e2473edfde460e4d73 (diff)
downloadrockbox-fcf36dd4f9879a82342e5606535d2dcf46d1de2a.tar.gz
rockbox-fcf36dd4f9879a82342e5606535d2dcf46d1de2a.tar.bz2
rockbox-fcf36dd4f9879a82342e5606535d2dcf46d1de2a.zip
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 'firmware/general.c')
-rw-r--r--firmware/general.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/firmware/general.c b/firmware/general.c
index fa1025492b..20b0277c09 100644
--- a/firmware/general.c
+++ b/firmware/general.c
@@ -196,3 +196,40 @@ char *create_datetime_filename(char *buffer, const char *path,
return buffer;
}
#endif /* CONFIG_RTC */
+
+/***
+ ** Compacted pointer lists
+ **
+ ** N-length list requires N+1 elements to ensure NULL-termination.
+ **/
+
+/* Find a pointer in a pointer array. Returns the addess of the element if
+ * found or the address of the terminating NULL otherwise. This can be used
+ * to bounds check and add items. */
+void ** find_array_ptr(void **arr, void *ptr)
+{
+ void *curr;
+ for (curr = *arr; curr != NULL && curr != ptr; curr = *(++arr));
+ return arr;
+}
+
+/* Remove a pointer from a pointer array if it exists. Compacts it so that
+ * no gaps exist. Returns 0 on success and -1 if the element wasn't found. */
+int remove_array_ptr(void **arr, void *ptr)
+{
+ void *curr;
+ arr = find_array_ptr(arr, ptr);
+
+ if (*arr == NULL)
+ return -1;
+
+ /* Found. Slide up following items. */
+ do
+ {
+ void **arr1 = arr + 1;
+ *arr++ = curr = *arr1;
+ }
+ while (curr != NULL);
+
+ return 0;
+}