From 11174f2aae4b0d728cf0b29a8ccbdcc413590f37 Mon Sep 17 00:00:00 2001 From: Folkert de Vries Date: Thu, 28 Aug 2025 20:31:31 +0200 Subject: [PATCH] add `qsort_r` for unix, and `qsort` and `qsort_s` for windows --- libc-test/semver/apple.txt | 1 + libc-test/semver/freebsd.txt | 1 + libc-test/semver/netbsd.txt | 1 + libc-test/semver/windows.txt | 2 ++ src/unix/bsd/apple/mod.rs | 8 ++++++++ src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs | 11 +++++++++++ src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs | 8 ++++++++ src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs | 8 ++++++++ src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs | 8 ++++++++ src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs | 8 ++++++++ src/unix/bsd/netbsdlike/netbsd/mod.rs | 8 ++++++++ src/windows/mod.rs | 13 +++++++++++++ 12 files changed, 77 insertions(+) diff --git a/libc-test/semver/apple.txt b/libc-test/semver/apple.txt index 800d4a7996d0d..90bb0de7b57eb 100644 --- a/libc-test/semver/apple.txt +++ b/libc-test/semver/apple.txt @@ -2121,6 +2121,7 @@ ptrace pututxline pwritev qsort +qsort_r querylocale quotactl radvisory diff --git a/libc-test/semver/freebsd.txt b/libc-test/semver/freebsd.txt index 24a75ae4d460f..1102391743492 100644 --- a/libc-test/semver/freebsd.txt +++ b/libc-test/semver/freebsd.txt @@ -2241,6 +2241,7 @@ ptsname_r pututxline pwritev qsort +qsort_r querylocale rallocx rand diff --git a/libc-test/semver/netbsd.txt b/libc-test/semver/netbsd.txt index da962722f5561..35b476c784894 100644 --- a/libc-test/semver/netbsd.txt +++ b/libc-test/semver/netbsd.txt @@ -1535,6 +1535,7 @@ ptrace_siginfo pututxline pwritev qsort +qsort_r rand readdir_r readlinkat diff --git a/libc-test/semver/windows.txt b/libc-test/semver/windows.txt index 281a13bb73034..a91794bed52ef 100644 --- a/libc-test/semver/windows.txt +++ b/libc-test/semver/windows.txt @@ -275,6 +275,8 @@ putchar putenv putenv_s puts +qsort +qsort_s raise rand read diff --git a/src/unix/bsd/apple/mod.rs b/src/unix/bsd/apple/mod.rs index 0fbb174c1fe4f..6e24800687552 100644 --- a/src/unix/bsd/apple/mod.rs +++ b/src/unix/bsd/apple/mod.rs @@ -5926,6 +5926,14 @@ extern "C" { search_path: *const c_char, argv: *const *mut c_char, ) -> c_int; + + pub fn qsort_r( + base: *mut c_void, + num: size_t, + size: size_t, + arg: *mut c_void, + compar: Option c_int>, + ); } cfg_if! { diff --git a/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs b/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs index f886c17db2b91..8476ed6490f96 100644 --- a/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs +++ b/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs @@ -424,6 +424,17 @@ extern "C" { // in FreeBSD 12 pub fn dirname(path: *const c_char) -> *mut c_char; pub fn basename(path: *const c_char) -> *mut c_char; + + // Argument order of the function pointer changed in FreeBSD 14. From 14 onwards the signature + // matches the POSIX specification by having the third argument be a mutable pointer, on + // earlier versions the first argument is the mutable pointer. + pub fn qsort_r( + base: *mut c_void, + num: size_t, + size: size_t, + arg: *mut c_void, + compar: Option c_int>, + ); } cfg_if! { diff --git a/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs b/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs index 256e96295f705..b95b36dcabc09 100644 --- a/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs +++ b/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs @@ -468,6 +468,14 @@ extern "C" { pub fn dirname(path: *mut c_char) -> *mut c_char; pub fn basename(path: *mut c_char) -> *mut c_char; + + pub fn qsort_r( + base: *mut c_void, + num: size_t, + size: size_t, + arg: *mut c_void, + compar: Option c_int>, + ); } cfg_if! { diff --git a/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs b/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs index d9eb98ab4e3f6..799805a4e901a 100644 --- a/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs +++ b/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs @@ -507,6 +507,14 @@ extern "C" { pub fn dirname(path: *mut c_char) -> *mut c_char; pub fn basename(path: *mut c_char) -> *mut c_char; + + pub fn qsort_r( + base: *mut c_void, + num: size_t, + size: size_t, + arg: *mut c_void, + compar: Option c_int>, + ); } #[link(name = "kvm")] diff --git a/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs b/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs index bc06df909e860..a46d6b7a49fa9 100644 --- a/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs +++ b/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs @@ -509,6 +509,14 @@ extern "C" { pub fn dirname(path: *mut c_char) -> *mut c_char; pub fn basename(path: *mut c_char) -> *mut c_char; + + pub fn qsort_r( + base: *mut c_void, + num: size_t, + size: size_t, + compar: Option c_int>, + arg: *mut c_void, + ); } #[link(name = "kvm")] diff --git a/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs b/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs index f18433273c0f2..ef27418cc9af5 100644 --- a/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs +++ b/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs @@ -511,6 +511,14 @@ extern "C" { pub fn dirname(path: *mut c_char) -> *mut c_char; pub fn basename(path: *mut c_char) -> *mut c_char; + + pub fn qsort_r( + base: *mut c_void, + num: size_t, + size: size_t, + compar: Option c_int>, + arg: *mut c_void, + ); } #[link(name = "kvm")] diff --git a/src/unix/bsd/netbsdlike/netbsd/mod.rs b/src/unix/bsd/netbsdlike/netbsd/mod.rs index a8d6dbfb0e38b..bfa82fcb113e5 100644 --- a/src/unix/bsd/netbsdlike/netbsd/mod.rs +++ b/src/unix/bsd/netbsdlike/netbsd/mod.rs @@ -2755,6 +2755,14 @@ extern "C" { new_value: *const itimerspec, old_value: *mut itimerspec, ) -> c_int; + + pub fn qsort_r( + base: *mut c_void, + num: size_t, + size: size_t, + compar: Option c_int>, + arg: *mut c_void, + ); } #[link(name = "rt")] diff --git a/src/windows/mod.rs b/src/windows/mod.rs index dfee0df55c8f7..a83a5bbacfcd4 100644 --- a/src/windows/mod.rs +++ b/src/windows/mod.rs @@ -289,6 +289,19 @@ extern "C" { pub fn isblank(c: c_int) -> c_int; pub fn tolower(c: c_int) -> c_int; pub fn toupper(c: c_int) -> c_int; + pub fn qsort( + base: *mut c_void, + num: size_t, + size: size_t, + compar: Option c_int>, + ); + pub fn qsort_s( + base: *mut c_void, + num: size_t, + size: size_t, + compar: Option c_int>, + arg: *mut c_void, + ); pub fn fopen(filename: *const c_char, mode: *const c_char) -> *mut FILE; pub fn freopen(filename: *const c_char, mode: *const c_char, file: *mut FILE) -> *mut FILE; pub fn fflush(file: *mut FILE) -> c_int;