vlc | branch: master | Thomas Guillem <[email protected]> | Mon Jan 21 16:41:54 2019 +0100| [e7a1994bc184b331b5494818b75a77fad4511cf5] | committer: Thomas Guillem
core: add vlc_qsort Following the upcoming POSIX prototype. Copied from compat/qsort_r.c > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e7a1994bc184b331b5494818b75a77fad4511cf5 --- include/vlc_sort.h | 36 +++++++++++++++++++++++++++++++++ src/Makefile.am | 2 ++ src/libvlccore.sym | 1 + src/misc/sort.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+) diff --git a/include/vlc_sort.h b/include/vlc_sort.h new file mode 100644 index 0000000000..85a0034ec6 --- /dev/null +++ b/include/vlc_sort.h @@ -0,0 +1,36 @@ +/****************************************************************************** + * vlc_sort.h + ****************************************************************************** + * Copyright © 2019 VLC authors and VideoLAN + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SORT_H +#define VLC_SORT_H + +#include <stdlib.h> +#include <stddef.h> + +/** + * Sort an array with reentrancy, following the upcoming POSIX prototype + * + * cf. POSIX qsort_r + */ +VLC_API void vlc_qsort(void *base, size_t nmemb, size_t size, + int (*compar)(const void *, const void *, void *), + void *arg); + +#endif diff --git a/src/Makefile.am b/src/Makefile.am index aec931cdd4..5defc9bff7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -87,6 +87,7 @@ pluginsinclude_HEADERS = \ ../include/vlc_fingerprinter.h \ ../include/vlc_interrupt.h \ ../include/vlc_renderer_discovery.h \ + ../include/vlc_sort.h \ ../include/vlc_sout.h \ ../include/vlc_spu.h \ ../include/vlc_stream.h \ @@ -386,6 +387,7 @@ libvlccore_la_SOURCES = \ misc/httpcookies.c \ misc/fingerprinter.c \ misc/text_style.c \ + misc/sort.c \ misc/subpicture.c \ misc/subpicture.h \ misc/medialibrary.c diff --git a/src/libvlccore.sym b/src/libvlccore.sym index a7bf98ecc1..629b3ec9eb 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -671,6 +671,7 @@ vlc_rand_bytes vlc_drand48 vlc_lrand48 vlc_mrand48 +vlc_qsort vlc_restorecancel vlc_rwlock_destroy vlc_rwlock_init diff --git a/src/misc/sort.c b/src/misc/sort.c new file mode 100644 index 0000000000..fc62eb7fff --- /dev/null +++ b/src/misc/sort.c @@ -0,0 +1,58 @@ +/****************************************************************************** + * sort.c: sort back-end + ****************************************************************************** + * Copyright © 2019 VLC authors and VideoLAN + * Copyright © 2018 Rémi Denis-Courmont + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <vlc_common.h> +#include <vlc_sort.h> + +static thread_local struct +{ + int (*compar)(const void *, const void *, void *); + void *arg; +} state; + +static int compar_wrapper(const void *a, const void *b) +{ + return state.compar(a, b, state.arg); +} + +/* Follow the upcoming POSIX prototype, coming from GNU/libc. + * Note that this differs from the BSD prototype. */ + +VLC_WEAK void vlc_qsort(void *base, size_t nmemb, size_t size, + int (*compar)(const void *, const void *, void *), + void *arg) +{ + int (*saved_compar)(const void *, const void *, void *) = state.compar; + void *saved_arg = state.arg; + + state.compar = compar; + state.arg = arg; + + qsort(base, nmemb, size, compar_wrapper); + + /* Restore state for nested reentrant calls */ + state.compar = saved_compar; + state.arg = saved_arg; +} _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
