From 1147241f1890835ec66f02a505059d6fd17f6755 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Thu, 27 Mar 2025 17:42:17 -0400 Subject: [PATCH] Use qsort() instead of qsort_r() for portability --- src/stdlib/arrays.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/stdlib/arrays.c b/src/stdlib/arrays.c index 61975aa..152460a 100644 --- a/src/stdlib/arrays.c +++ b/src/stdlib/arrays.c @@ -247,18 +247,28 @@ public OptionalInt_t Array$first(Array_t arr, Closure_t predicate) return NONE_INT; } +static Closure_t _sort_comparison = {.fn=NULL}; + +int _compare_closure(const void *a, const void *b) +{ + typedef int (*comparison_t)(const void*, const void*, void*); + return ((comparison_t)_sort_comparison.fn)(a, b, _sort_comparison.userdata); +} + public void Array$sort(Array_t *arr, Closure_t comparison, int64_t padded_item_size) { if (arr->data_refcount != 0 || (int64_t)arr->stride != padded_item_size) Array$compact(arr, padded_item_size); - qsort_r(arr->data, (size_t)arr->length, (size_t)padded_item_size, comparison.fn, comparison.userdata); + _sort_comparison = comparison; + qsort(arr->data, (size_t)arr->length, (size_t)padded_item_size, _compare_closure); } public Array_t Array$sorted(Array_t arr, Closure_t comparison, int64_t padded_item_size) { Array$compact(&arr, padded_item_size); - qsort_r(arr.data, (size_t)arr.length, (size_t)padded_item_size, comparison.fn, comparison.userdata); + _sort_comparison = comparison; + qsort(arr.data, (size_t)arr.length, (size_t)padded_item_size, _compare_closure); return arr; }