Index: libc/usr/src/common/util/qsort.c =================================================================== --- libc.orig/usr/src/common/util/qsort.c +++ libc/usr/src/common/util/qsort.c @@ -50,9 +50,15 @@ static void swapb(char *r1, char *r2, si * note: cstyle specifically prohibits nested conditional operators * but this is the only way to do the median of 3 function in-line */ +#ifdef QSORT_R +#define med3(a, b, c) (cmp((a), (b), arg) < 0) \ + ? ((cmp((b), (c), arg) < 0) ? (b) : (cmp((a), (c), arg) < 0) ? (c) : (a)) \ + : ((cmp((b), (c), arg) > 0) ? (b) : (cmp((a), (c), arg) > 0) ? (c) : (a)) +#else #define med3(a, b, c) (cmp((a), (b)) < 0) \ ? ((cmp((b), (c)) < 0) ? (b) : (cmp((a), (c)) < 0) ? (c) : (a)) \ : ((cmp((b), (c)) > 0) ? (b) : (cmp((a), (c)) > 0) ? (c) : (a)) +#endif #define THRESH_L 5 /* threshold for insertion sort */ #define THRESH_M3 20 /* threshold for median of 3 */ @@ -104,12 +110,22 @@ typedef struct { * 9) The user compare function modifies the data records */ +#ifdef QSORT_R +void +qsort_r( + void *basep, + size_t nrec, + size_t rsiz, + int (*cmp)(const void *, const void *, void *), + void *arg) +#else void qsort( void *basep, size_t nrec, size_t rsiz, int (*cmp)(const void *, const void *)) +#endif { size_t i; /* temporary variable */ @@ -209,7 +225,12 @@ qsort( b_par = t_par; while (b_par > b_lim) { b_par -= rsiz; - if ((*cmp)(b_par, b_par + rsiz) <= 0) { +#ifdef QSORT_R + if ((*cmp)(b_par, b_par + rsiz, arg) <= 0) +#else + if ((*cmp)(b_par, b_par + rsiz) <= 0) +#endif + { break; } (*swapf)(b_par, b_par + rsiz, loops); @@ -323,7 +344,11 @@ qsort( if (b_par == m2) { continue; } +#ifdef QSORT_R + cv = cmp(b_par, m2, arg); +#else cv = cmp(b_par, m2); +#endif if (cv > 0) { break; } @@ -342,7 +367,11 @@ qsort( if (t_par == m2) { continue; } +#ifdef QSORT_R + cv = cmp(t_par, m2, arg); +#else cv = cmp(t_par, m2); +#endif if (cv < 0) { break; } Index: libc/usr/src/lib/libc/port/mapfile-vers =================================================================== --- libc.orig/usr/src/lib/libc/port/mapfile-vers +++ libc/usr/src/lib/libc/port/mapfile-vers @@ -289,6 +289,7 @@ SYMBOL_VERSION DYSON_1 { memrchr; program_invocation_name; program_invocation_short_name; + qsort_r; rawmemchr; sendfile; sendfilev; Index: libc/usr/src/lib/libc/i386/Makefile.com =================================================================== --- libc.orig/usr/src/lib/libc/i386/Makefile.com +++ libc/usr/src/lib/libc/i386/Makefile.com @@ -101,6 +101,7 @@ COMOBJS= \ bsearch.o \ bzero.o \ qsort.o \ + qsort_r.o \ strtol.o \ strtoul.o \ strtoll.o \ Index: libc/usr/src/common/util/qsort_r.c =================================================================== --- /dev/null +++ libc/usr/src/common/util/qsort_r.c @@ -0,0 +1,2 @@ +#define QSORT_R +#include "qsort.c" Index: libc/usr/src/lib/libc/amd64/Makefile =================================================================== --- libc.orig/usr/src/lib/libc/amd64/Makefile +++ libc/usr/src/lib/libc/amd64/Makefile @@ -100,6 +100,7 @@ COMOBJS= \ bsearch.o \ bzero.o \ qsort.o \ + qsort_r.o \ strtol.o \ strtoul.o \ strtoll.o \ Index: libc/usr/src/head/stdlib.h =================================================================== --- libc.orig/usr/src/head/stdlib.h +++ libc/usr/src/head/stdlib.h @@ -34,6 +34,8 @@ #ifndef _STDLIB_H #define _STDLIB_H +#include + #include #include @@ -43,7 +45,17 @@ #if defined(_GNU_SOURCE) || defined(__EXTENSIONS__) # include + +#if __cplusplus >= 199711L +namespace std { #endif +void qsort_r(void *, size_t, size_t, int (*)(const void *, const void *, void *), void *); + +#if __cplusplus >= 199711L +} +#endif /* end of namespace std */ + +#endif /* _GNU_SOURCE */ /* @@ -73,6 +85,9 @@ using std::mblen; using std::mbstowcs; using std::mbtowc; using std::qsort; +#if defined(_GNU_SOURCE) || defined(__EXTENSIONS__) +using std::qsort_r; +#endif using std::rand; using std::realloc; using std::srand;