[vlc-commits] core: add vlc_qsort

Thomas Guillem git at videolan.org
Tue Jan 22 18:56:11 CET 2019


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | 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;
+}



More information about the vlc-commits mailing list