diff options
author | Ariadne Conill <ariadne@dereferenced.org> | 2022-04-04 08:21:05 -0500 |
---|---|---|
committer | Ariadne Conill <ariadne@dereferenced.org> | 2022-04-04 08:21:05 -0500 |
commit | 8eddaeefa1478c1bebb89f435626565429797b04 (patch) | |
tree | 68a05354ab1c3f86a911692a6beb2df0dbec08db /portability/stdlib.h | |
parent | 55e20d3e5b48eea29523b633492a167118dcc3bd (diff) | |
download | apk-tools-fix/portability-broken-qsort-r.tar.gz apk-tools-fix/portability-broken-qsort-r.tar.bz2 apk-tools-fix/portability-broken-qsort-r.tar.xz apk-tools-fix/portability-broken-qsort-r.zip |
portability: check for qsort_r which does not match POSIX-next definitionfix/portability-broken-qsort-r
FreeBSD (and also Darwin) introduced its own qsort_r, which has different
semantics than the one slated for inclusion in POSIX. Add a portability
thunk to deal with translating between implementations.
Diffstat (limited to 'portability/stdlib.h')
-rw-r--r-- | portability/stdlib.h | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/portability/stdlib.h b/portability/stdlib.h index 6254c7c..d213ae7 100644 --- a/portability/stdlib.h +++ b/portability/stdlib.h @@ -1,3 +1,4 @@ +#pragma once #include_next <stdlib.h> #ifdef NEED_QSORT_R @@ -5,3 +6,28 @@ void qsort_r(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *, void *), void *arg); #endif + +#ifdef HAVE_BROKEN_QSORT_R +struct __apk_qsort_r_compat_arg { + int (*compar)(const void *, const void *, void *); + void *arg; +}; + +static inline int __apk_qsort_r_compar_compat(void *arg, const void *a, const void *b) +{ + struct __apk_qsort_r_compat_arg *compat_arg = arg; + return compat_arg->compar(a, b, compat_arg->arg); +} + +static inline void __apk_qsort_r(void *base, size_t nmemb, size_t size, + int (*compar)(const void *, const void *, void *), + void *arg) +{ + struct __apk_qsort_r_compat_arg compat_arg = { + .compar = compar, + .arg = arg, + }; + qsort_r(base, nmemb, size, &compat_arg, __apk_qsort_r_compar_compat); +} +#define qsort_r(...) __apk_qsort_r(__VA_ARGS__) +#endif |