Junio C Hamano <gits...@pobox.com> writes: > Eh, wait. BSD and Microsoft have paramters reordered in the > callback comparison function. I suspect that would not fly very > well.
Hmm. We could do it like this, which may not be too bad. #if APPLE_QSORT_R struct apple_qsort_adapter { int (*user_cmp)(const void *, const void *, void *); void *user_ctx; } static int apple_qsort_adapter_cmp(void *ctx, const void *a, const void *b) { struct apple_qsort_adapter *wrapper_ctx = ctx; return wrapper_ctx->user_cmp(a, b, wrapper_ctx->user_ctx); } #endif int git_qsort_s(void *b, size_t n, size_t s, int (*cmp)(const void *, const void *, void *), void *ctx) { if (!n) return 0; if (!b || !cmp) return -1; #if GNU_QSORT_R qsort_r(b, n, s, cmp, ctx); #elif APPLE_QSORT_R { struct appple_qsort_adapter a = { cmp, ctx }; qsort_r(b, n, s, &a, appple_qsort_adapter_cmp); } #endif return 0; }