summaryrefslogtreecommitdiffstats
path: root/libdimension/list.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@gmail.com>2010-05-01 15:55:00 -0600
committerTavian Barnes <tavianator@gmail.com>2010-05-01 15:55:00 -0600
commit4b61b9a2d67e8f011840c95d20deef096c2e51a3 (patch)
treee408c5bdd9fa288cb6ce74897a2df52d9abdedbe /libdimension/list.c
parentfa424d083234ce32b87d3527359d777bfdea0adc (diff)
downloaddimension-4b61b9a2d67e8f011840c95d20deef096c2e51a3.tar.xz
Fix list sorting.
Diffstat (limited to 'libdimension/list.c')
-rw-r--r--libdimension/list.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/libdimension/list.c b/libdimension/list.c
index f6a1f5d..4851e94 100644
--- a/libdimension/list.c
+++ b/libdimension/list.c
@@ -66,7 +66,6 @@ dmnsn_list_split(dmnsn_list *list)
list->length -= max;
half->length = max;
-
return half;
}
@@ -84,10 +83,26 @@ dmnsn_list_sort(dmnsn_list *list, dmnsn_comparator_fn *comparator)
dmnsn_list *half = dmnsn_list_split(list);
dmnsn_list_sort(list, comparator);
dmnsn_list_sort(half, comparator);
+ dmnsn_list_iterator *ii;
dmnsn_list_iterator *i = list->first, *j = half->first;
while (i || j) {
- if (!i || (*comparator)(j, i)) {
+ if (!i) {
+ dmnsn_list_iterator *temp = dmnsn_list_next(j);
+ dmnsn_list_iterator_remove(half, j);
+ dmnsn_list_iterator_insert(list, i, j);
+ j = temp;
+ continue;
+
+ j->prev = list->last;
+ list->last = j;
+ list->length += half->length;
+ half->first = half->last = NULL;
+ half->length = 0;
+ break;
+ } else if (!j) {
+ break;
+ } else if ((*comparator)(j, i)) {
dmnsn_list_iterator *temp = dmnsn_list_next(j);
dmnsn_list_iterator_remove(half, j);
dmnsn_list_iterator_insert(list, i, j);