aboutsummaryrefslogtreecommitdiff
path: root/libctf/ctf-decls.h
diff options
context:
space:
mode:
Diffstat (limited to 'libctf/ctf-decls.h')
-rw-r--r--libctf/ctf-decls.h39
1 files changed, 36 insertions, 3 deletions
diff --git a/libctf/ctf-decls.h b/libctf/ctf-decls.h
index 5e9ede4..d12409e 100644
--- a/libctf/ctf-decls.h
+++ b/libctf/ctf-decls.h
@@ -22,12 +22,45 @@
#include "config.h"
-#if !HAVE_DECL_QSORT_R
#include <stddef.h>
-void qsort_r (void *base, size_t nmemb, size_t size,
+#include <stdlib.h>
+
+#if HAVE_QSORT_R_ARG_LAST
+static inline void
+ctf_qsort_r (void *base, size_t nmemb, size_t size,
+ int (*compar)(const void *, const void *, void *),
+ void *arg)
+{
+ qsort_r (base, nmemb, size, compar, arg);
+}
+#elif HAVE_QSORT_R_COMPAR_LAST
+struct ctf_qsort_arg
+{
+ int (*compar) (const void *, const void *, void *);
+ void *arg;
+};
+
+static int
+ctf_qsort_compar_thunk (void *arg, const void *a, const void *b)
+{
+ struct ctf_qsort_arg *qsort_arg = (struct ctf_qsort_arg *) arg;
+
+ return qsort_arg->compar (a, b, arg);
+}
+
+static inline void
+ctf_qsort_r (void *base, size_t nmemb, size_t size,
+ int (*compar)(const void *, const void *, void *),
+ void *arg)
+{
+ struct ctf_qsort_arg thunk = { compar, arg };
+ qsort_r (base, nmemb, size, &thunk, ctf_qsort_compar_thunk);
+}
+#else
+void ctf_qsort_r (void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *, void *),
void *arg);
-#endif /* !HAVE_DECL_QSORT_R */
+#endif
#undef MAX
#undef MIN