From a8994b167e270cfa8e42e7b82c510c8e62af360e Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 15 Sep 2015 03:44:34 +0000 Subject: util.c: BSD qsort_r * util.c (ruby_qsort): use BSD-style qsort_r if available. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51857 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- util.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'util.c') 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 -- cgit v1.2.1