summaryrefslogtreecommitdiff
path: root/portability/stdlib.h
blob: d213ae7b677c8cd1f5a809d5db6f43b10c2d4d44 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#pragma once
#include_next <stdlib.h>

#ifdef NEED_QSORT_R
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