mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-13 18:17:39 -04:00
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
This commit is contained in:
parent
9fde12676b
commit
fcf36dd4f9
15 changed files with 199 additions and 313 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue