aboutsummaryrefslogtreecommitdiff
path: root/src/stdlib
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-03-27 17:42:17 -0400
committerBruce Hill <bruce@bruce-hill.com>2025-03-27 17:42:17 -0400
commit1147241f1890835ec66f02a505059d6fd17f6755 (patch)
tree77dc1881500dd6acec06a73c127fb5da42ac0b87 /src/stdlib
parenta187cca2b8405e1399f82d30c1a8c39d3912929f (diff)
Use qsort() instead of qsort_r() for portability
Diffstat (limited to 'src/stdlib')
-rw-r--r--src/stdlib/arrays.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/stdlib/arrays.c b/src/stdlib/arrays.c
index 61975aa9..152460a8 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;
}