summaryrefslogtreecommitdiff
path: root/src/stdlib
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2020-08-15 11:54:37 -0400
committerJakob Kaivo <jkk@ung.org>2020-08-15 11:54:37 -0400
commit05f52c10c527ce911a2880b4ddd4c9ee299172a8 (patch)
tree373c7779852a70df43e8267e8b65ce59d90db56a /src/stdlib
parentb0c44ab82b12b062ab0fd89140c4b96bee92849c (diff)
remove the need for a custom struct
Diffstat (limited to 'src/stdlib')
-rw-r--r--src/stdlib/_qsort.h37
-rw-r--r--src/stdlib/qsort.c7
2 files changed, 15 insertions, 29 deletions
diff --git a/src/stdlib/_qsort.h b/src/stdlib/_qsort.h
index 28d273cd..475932a7 100644
--- a/src/stdlib/_qsort.h
+++ b/src/stdlib/_qsort.h
@@ -1,42 +1,33 @@
#include <stdlib.h>
-struct __qs {
- char *base;
- size_t size;
- int (*compar)(const void *, const void *);
-};
-
-static void __swap(struct __qs *a, size_t b, size_t c)
+static void __swap(char *base, size_t size, size_t b, size_t c)
{
- char *x = a->base + (a->size * b);
- char *y = a->base + (a->size * c);
+ char *x = base + (size * b);
+ char *y = base + (size * c);
size_t i;
- for (i = 0; i < a->size; i++) {
+ for (i = 0; i < size; i++) {
char tmp = x[i];
x[i] = y[i];
y[i] = tmp;
}
}
-static size_t __partition(struct __qs *a, size_t lo, size_t hi)
+static void __qsort(char *base, size_t size, size_t lo, size_t hi, int (*compar)(const void *, const void *))
{
size_t i = lo, j = 0;
+ if (lo >= hi) {
+ return;
+ }
+
for (j = lo; j < hi; j++) {
- if (a->compar(a->base + (a->size * j), a->base + (a->size * hi)) < 0) {
- __swap(a, i, j);
+ if (compar(base + (size * j), base + (size * hi)) < 0) {
+ __swap(base, size, i, j);
i++;
}
}
- __swap(a, i, hi);
- return i;
-}
+ __swap(base, size, i, hi);
-static void __qsort(struct __qs *a, size_t lo, size_t hi)
-{
- if (lo < hi) {
- size_t p = __partition(a, lo, hi);
- __qsort(a, lo, p - 1);
- __qsort(a, p + 1, hi);
- }
+ __qsort(base, size, lo, i - 1, compar);
+ __qsort(base, size, i + 1, hi, compar);
}
diff --git a/src/stdlib/qsort.c b/src/stdlib/qsort.c
index a6746947..b8e21b9c 100644
--- a/src/stdlib/qsort.c
+++ b/src/stdlib/qsort.c
@@ -5,12 +5,7 @@
void qsort(void * base, size_t nmemb, size_t size, int (*compar)(const void *, const void *))
{
- struct __qs qs = {
- base,
- size,
- compar,
- };
- __qsort(&qs, 0, nmemb - 1);
+ __qsort(base, size, 0, nmemb - 1, compar);
}
/***