diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-09-15 03:44:34 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-09-15 03:44:34 +0000 |
commit | 1a3fd32b4d81476c95162cdf28322e9b4d6abda9 (patch) | |
tree | f291c11f15184f5d1b47cf655c70cf2841b9c521 | |
parent | b3174a713b56bbec272dfd55a9a06ce385416b13 (diff) | |
download | ruby-1a3fd32b4d81476c95162cdf28322e9b4d6abda9.tar.gz |
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
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | configure.in | 3 | ||||
-rw-r--r-- | util.c | 24 |
3 files changed, 30 insertions, 1 deletions
@@ -1,3 +1,7 @@ +Tue Sep 15 12:44:32 2015 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * util.c (ruby_qsort): use BSD-style qsort_r if available. + Mon Sep 14 19:26:34 2015 Shugo Maeda <shugo@ruby-lang.org> * lib/net/ftp.rb (parse_mlsx_entry): parse pathnames including diff --git a/configure.in b/configure.in index b5771d8264..39827cd519 100644 --- a/configure.in +++ b/configure.in @@ -2314,6 +2314,9 @@ void qsort_r(void *base, size_t nmemb, size_t size, AS_CASE("$rb_cv_gnu_qsort_r:$rb_cv_bsd_qsort_r", [yes:no], [ AC_DEFINE(HAVE_GNU_QSORT_R, 1) + ], + [no:yes], [ + AC_DEFINE(HAVE_BSD_QSORT_R, 1) ]) fi @@ -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 |