aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/stdlib/qsort.3
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/stdlib/qsort.3')
-rw-r--r--lib/libc/stdlib/qsort.364
1 files changed, 36 insertions, 28 deletions
diff --git a/lib/libc/stdlib/qsort.3 b/lib/libc/stdlib/qsort.3
index 606185f9baee..e2e29e7cf04f 100644
--- a/lib/libc/stdlib/qsort.3
+++ b/lib/libc/stdlib/qsort.3
@@ -29,10 +29,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)qsort.3 8.1 (Berkeley) 6/4/93
-.\" $FreeBSD$
-.\"
-.Dd January 20, 2020
+.Dd October 25, 2024
.Dt QSORT 3
.Os
.Sh NAME
@@ -67,8 +64,8 @@
.Fa "void *base"
.Fa "size_t nmemb"
.Fa "size_t size"
+.Fa "int \*[lp]*compar\*[rp]\*[lp]const void *, const void *, void *\*[rp]"
.Fa "void *thunk"
-.Fa "int \*[lp]*compar\*[rp]\*[lp]void *, const void *, const void *\*[rp]"
.Fc
.Ft int
.Fo heapsort
@@ -157,7 +154,7 @@ function behaves identically to
.Fn qsort ,
except that it takes an additional argument,
.Fa thunk ,
-which is passed unchanged as the first argument to function pointed to
+which is passed unchanged as the last argument to function pointed to
.Fa compar .
This allows the comparison function to access additional
data without using global variables, and thus
@@ -251,16 +248,8 @@ untrue.
The
.Fn qsort_s
function behaves the same as
-.Fn qsort_r , except that:
-.Bl -dash
-.It
-The order of arguments is different
-.It
-The order of arguments to
-.Fa compar
-is different
-.It
-if
+.Fn qsort_r ,
+except that if
.Fa nmemb
or
.Fa size
@@ -270,13 +259,16 @@ or
.Fa nmemb
is not zero and
.Fa compar
-is NULL, then the runtime-constraint handler is called, and
+is
+.Dv NULL
+or
+.Fa size
+is zero, then the runtime-constraint handler is called, and
.Fn qsort_s
returns an error.
Note that the handler is called before
.Fn qsort_s
returns the error, and the handler function might not return.
-.El
.Sh RETURN VALUES
The
.Fn qsort
@@ -332,16 +324,21 @@ main(void)
.Sh COMPATIBILITY
The order of arguments for the comparison function used with
.Fn qsort_r
-is different from the one used by
-.Fn qsort_s ,
+is historically different from the one used by
+.Fn qsort_s
and the GNU libc implementation of
.Fn qsort_r .
-When porting software written for GNU libc, it is usually possible
-to replace
+However, as of
+.Fx 14.0 ,
+the
.Fn qsort_r
-with
-.Fn qsort_s
-to work around this problem.
+has been updated so that the
+.Fa thunk
+parameter appears last to match
+.St -p1003.1-2024 .
+Both the historical and the updated interfaces are now accepted
+via C11 generic selection and C++ polymorphism,
+but the updated interface is recommended for portable applications.
.Pp
.Fn qsort_s
is part of the
@@ -425,14 +422,25 @@ were unable to allocate memory.
.Sh STANDARDS
The
.Fn qsort
-function
-conforms to
+function conforms to
.St -isoC .
+The
+.Fn qsort_r
+function conforms to
+.St -p1003.1-2024 .
+The
.Fn qsort_s
-conforms to
+function conforms to
.St -isoC-2011
K.3.6.3.2.
.Sh HISTORY
The variants of these functions that take blocks as arguments first appeared in
Mac OS X.
This implementation was created by David Chisnall.
+.Pp
+In
+.Fx 14.0 ,
+the prototype of
+.Fn qsort_r
+was updated to match
+.St -p1003.1-2024 .