summaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'util.c')
-rw-r--r--util.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/util.c b/util.c
index aede3df62d..89dec0d19b 100644
--- a/util.c
+++ b/util.c
@@ -191,8 +191,30 @@ ruby_strtoul(const char *str, char **endptr, int base)
# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#endif
+#if defined HAVE_BSD_QSORT_R
+typedef int (cmpfunc_t)(const void*, const void*, void*);
+
+struct bsd_qsort_r_args {
+ cmpfunc_t *cmp;
+ void *arg;
+};
-#ifndef HAVE_GNU_QSORT_R
+static int
+cmp_bsd_qsort(void *d, const void *a, const void *b)
+{
+ const struct bsd_qsort_r_args *args = d;
+ return (*args->cmp)(a, b, args->arg);
+}
+
+void
+ruby_qsort(void* base, const size_t nel, const size_t size, cmpfunc_t *cmp, void *d)
+{
+ struct bsd_qsort_r_args args;
+ args.cmp = cmp;
+ args.arg = d;
+ qsort_r(base, nel, size, &args, cmp_bsd_qsort);
+}
+#elif !defined HAVE_GNU_QSORT_R
/* mm.c */
#define mmtype long