aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-09-15 03:44:34 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-09-15 03:44:34 +0000
commita8994b167e270cfa8e42e7b82c510c8e62af360e (patch)
treef291c11f15184f5d1b47cf655c70cf2841b9c521
parent5425099a9f536d52fa61bb78d97e79c48368390a (diff)
downloadruby-a8994b167e270cfa8e42e7b82c510c8e62af360e.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--ChangeLog4
-rw-r--r--configure.in3
-rw-r--r--util.c24
3 files changed, 30 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 02760b1385..1599485daa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
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