Skip to content

Commit a8994b1

Browse files
committed
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
1 parent 5425099 commit a8994b1

File tree

3 files changed

+30
-1
lines changed

3 files changed

+30
-1
lines changed

ChangeLog

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
Tue Sep 15 12:44:32 2015 Nobuyoshi Nakada <[email protected]>
2+
3+
* util.c (ruby_qsort): use BSD-style qsort_r if available.
4+
15
Mon Sep 14 19:26:34 2015 Shugo Maeda <[email protected]>
26

37
* lib/net/ftp.rb (parse_mlsx_entry): parse pathnames including

configure.in

+3
Original file line numberDiff line numberDiff line change
@@ -2314,6 +2314,9 @@ void qsort_r(void *base, size_t nmemb, size_t size,
23142314
AS_CASE("$rb_cv_gnu_qsort_r:$rb_cv_bsd_qsort_r",
23152315
[yes:no], [
23162316
AC_DEFINE(HAVE_GNU_QSORT_R, 1)
2317+
],
2318+
[no:yes], [
2319+
AC_DEFINE(HAVE_BSD_QSORT_R, 1)
23172320
])
23182321
fi
23192322

util.c

+23-1
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,30 @@ ruby_strtoul(const char *str, char **endptr, int base)
191191
# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
192192
#endif
193193

194+
#if defined HAVE_BSD_QSORT_R
195+
typedef int (cmpfunc_t)(const void*, const void*, void*);
196+
197+
struct bsd_qsort_r_args {
198+
cmpfunc_t *cmp;
199+
void *arg;
200+
};
194201

195-
#ifndef HAVE_GNU_QSORT_R
202+
static int
203+
cmp_bsd_qsort(void *d, const void *a, const void *b)
204+
{
205+
const struct bsd_qsort_r_args *args = d;
206+
return (*args->cmp)(a, b, args->arg);
207+
}
208+
209+
void
210+
ruby_qsort(void* base, const size_t nel, const size_t size, cmpfunc_t *cmp, void *d)
211+
{
212+
struct bsd_qsort_r_args args;
213+
args.cmp = cmp;
214+
args.arg = d;
215+
qsort_r(base, nel, size, &args, cmp_bsd_qsort);
216+
}
217+
#elif !defined HAVE_GNU_QSORT_R
196218
/* mm.c */
197219

198220
#define mmtype long

0 commit comments

Comments
 (0)