mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
util.c: qsort_s in C11
* configure.ac: macro for C11 to use qsort_s. * util.c (ruby_qsort): fix for C11 qsort_s. the comparison function for MSVCRT qsort_s is compatible with BSD qsort_r, but not with C11 qsort_s, in spite of its name. note that mingw defines __STDC_VERSION__ but uses qsort_s in MSVCRT, so the MSVCRT block needs to preced the C11 block. [ruby-core:88899] [Bug #15091] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64661 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7671126dfb
commit
8e9a8c043e
2 changed files with 23 additions and 6 deletions
|
@ -1869,7 +1869,7 @@ AC_CHECK_FUNCS(utimes)
|
||||||
AC_CHECK_FUNCS(wait4)
|
AC_CHECK_FUNCS(wait4)
|
||||||
AC_CHECK_FUNCS(waitpid)
|
AC_CHECK_FUNCS(waitpid)
|
||||||
|
|
||||||
AS_IF([test "$ac_cv_func_memset_s" = yes],
|
AS_CASE(["$ac_cv_func_memset_s:$ac_cvs_func_qsort_s"], [*yes*],
|
||||||
[RUBY_DEFINE_IF([!defined __STDC_WANT_LIB_EXT1__], [__STDC_WANT_LIB_EXT1__], 1)])
|
[RUBY_DEFINE_IF([!defined __STDC_WANT_LIB_EXT1__], [__STDC_WANT_LIB_EXT1__], 1)])
|
||||||
|
|
||||||
AS_IF([test "$ac_cv_func_getcwd" = yes], [
|
AS_IF([test "$ac_cv_func_getcwd" = yes], [
|
||||||
|
|
27
util.c
27
util.c
|
@ -195,14 +195,32 @@ ruby_strtoul(const char *str, char **endptr, int base)
|
||||||
# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
|
# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined HAVE_BSD_QSORT_R && defined HAVE_QSORT_S
|
typedef int (cmpfunc_t)(const void*, const void*, void*);
|
||||||
|
|
||||||
|
#if defined HAVE_QSORT_S
|
||||||
|
# if defined __MSVCRT__
|
||||||
# define qsort_r(base, nel, size, arg, cmp) qsort_s(base, nel, size, cmp, arg)
|
# define qsort_r(base, nel, size, arg, cmp) qsort_s(base, nel, size, cmp, arg)
|
||||||
# define cmp_bsd_qsort cmp_ms_qsort
|
# define cmp_bsd_qsort cmp_ms_qsort
|
||||||
# define HAVE_BSD_QSORT_R 1
|
# define HAVE_BSD_QSORT_R 1
|
||||||
#endif
|
# elif defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L
|
||||||
#if defined HAVE_BSD_QSORT_R
|
/* C11 qsort_s has the same arguments as ours */
|
||||||
typedef int (cmpfunc_t)(const void*, const void*, void*);
|
void
|
||||||
|
ruby_qsort(void* base, const size_t nel, const size_t size, cmpfunc_t *cmp, void *d)
|
||||||
|
{
|
||||||
|
if (!nel || !size) return; /* nothing to sort */
|
||||||
|
|
||||||
|
/* get rid of runtime-constraints handler for MT-safeness */
|
||||||
|
if (!base || !cmp) return;
|
||||||
|
if (nel > RSIZE_MAX || size > RSIZE_MAX) return;
|
||||||
|
|
||||||
|
qsort_s(base, nel, size, cmp, d);
|
||||||
|
}
|
||||||
|
# else
|
||||||
|
# error Unknown version qsort_s
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_BSD_QSORT_R
|
||||||
struct bsd_qsort_r_args {
|
struct bsd_qsort_r_args {
|
||||||
cmpfunc_t *cmp;
|
cmpfunc_t *cmp;
|
||||||
void *arg;
|
void *arg;
|
||||||
|
@ -339,7 +357,6 @@ typedef struct { char *LL, *RR; } stack_node; /* Stack structure for L,l,R,r */
|
||||||
((*cmp)((b),(c),d)<0 ? (b) : ((*cmp)((a),(c),d)<0 ? (c) : (a))) : \
|
((*cmp)((b),(c),d)<0 ? (b) : ((*cmp)((a),(c),d)<0 ? (c) : (a))) : \
|
||||||
((*cmp)((b),(c),d)>0 ? (b) : ((*cmp)((a),(c),d)<0 ? (a) : (c))))
|
((*cmp)((b),(c),d)>0 ? (b) : ((*cmp)((a),(c),d)<0 ? (a) : (c))))
|
||||||
|
|
||||||
typedef int (cmpfunc_t)(const void*, const void*, void*);
|
|
||||||
void
|
void
|
||||||
ruby_qsort(void* base, const size_t nel, const size_t size, cmpfunc_t *cmp, void *d)
|
ruby_qsort(void* base, const size_t nel, const size_t size, cmpfunc_t *cmp, void *d)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue