GNU extension like qsort but takes a 3 parameter comparision function.
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
typedef __compar_fn_t comparison_fn_t;
# endif
#endif
+#ifdef __USE_GNU
+typedef int (*__compar_d_fn_t) (__const void *, __const void *, void *);
+#endif
__BEGIN_NAMESPACE_STD
/* Do a binary search for KEY in BASE, which consists of NMEMB elements
extern void qsort (void *__base, size_t __nmemb, size_t __size,
__compar_fn_t __compar) __nonnull ((1, 4));
libc_hidden_proto(qsort)
-
+#ifdef __USE_GNU
+extern void qsort_r (void *__base, size_t __nmemb, size_t __size,
+ __compar_d_fn_t __compar, void *__arg)
+ __nonnull ((1, 4));
+libc_hidden_proto(qsort_r)
+#endif
/* Return the absolute value of X. */
extern int abs (int __x) __THROW __attribute__ ((__const__)) __wur;
# multi source stdlib.c
CSRC-y += abs.c labs.c atoi.c atol.c strtol.c strtoul.c _stdlib_strto_l.c \
- qsort.c bsearch.c \
+ qsort.c qsort_r.c bsearch.c \
llabs.c atoll.c strtoll.c strtoull.c _stdlib_strto_ll.c
# (aliases) strtoq.o strtouq.o
CSRC-$(UCLIBC_HAS_FLOATS) += atof.c
--- /dev/null
+/* Copyright (C) 2004-2006 Manuel Novoa III <mjn3@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_qsort_r
+#include "stdlib.c"
#endif
/**********************************************************************/
-#ifdef L_qsort
+#ifdef L_qsort_r
/* This code is derived from a public domain shell sort routine by
* Ray Gardner and found in Bob Stout's snippets collection. The
* calculation, as well as to reduce the generated code size with
* bcc and gcc. */
-void qsort(void *base,
+void qsort_r(void *base,
size_t nel,
size_t width,
- int (*comp)(const void *, const void *))
+ __compar_d_fn_t comp,
+ void *arg)
{
size_t wgap, i, j, k;
char tmp;
j -= wgap;
a = j + ((char *)base);
b = a + wgap;
- if ((*comp)(a, b) <= 0) {
+ if ((*comp)(a, b, arg) <= 0) {
break;
}
k = width;
} while (wgap);
}
}
-libc_hidden_def(qsort)
+libc_hidden_def(qsort_r)
/* ---------- original snippets version below ---------- */
#endif
#endif
+
+#ifdef L_qsort
+void qsort(void *base,
+ size_t nel,
+ size_t width,
+ __compar_fn_t comp)
+{
+ return qsort_r (base, nel, width, (__compar_d_fn_t) comp, NULL);
+}
+libc_hidden_def(qsort)
+#endif
+
/**********************************************************************/
#ifdef L__stdlib_mb_cur_max