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 --- firmware/general.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'firmware/general.c') 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; +} -- cgit v1.2.3