From 4b61b9a2d67e8f011840c95d20deef096c2e51a3 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Sat, 1 May 2010 15:55:00 -0600 Subject: Fix list sorting. --- libdimension/list.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'libdimension/list.c') 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); -- cgit v1.2.3