From c6d34bc399c94f913440ae47e57c5fdece0f2f14 Mon Sep 17 00:00:00 2001 From: tsauerbeck Date: Fri, 25 Feb 2005 15:31:52 +0000 Subject: [PATCH] make evas_list_sort more bullet-proof SVN revision: 13503 --- legacy/evas/src/lib/data/evas_list.c | 45 +++++++++++++++++----------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/legacy/evas/src/lib/data/evas_list.c b/legacy/evas/src/lib/data/evas_list.c index 164dcbb1ed..c89f6de56a 100644 --- a/legacy/evas/src/lib/data/evas_list.c +++ b/legacy/evas/src/lib/data/evas_list.c @@ -854,25 +854,36 @@ Evas_List * evas_list_sort(Evas_List *list, int size, int (*func)(void *, void *)) { Evas_List *l = NULL, *ll = NULL; - int range = (size / 2); + int mid; - if(range > 0) - { - /* bleh evas list splicing */ - ll = evas_list_nth_list(list, range); - if(ll->prev) - { - list->last = ll->prev; - list->count = range; - } - ll->prev->next = NULL; - ll->count = size - range; + if (!list || !func) + return NULL; + + /* if the caller specified an invalid size, sort the whole list */ + if (size <= 0 || size > list->count) + size = list->count; + + mid = size / 2; + if (mid < 1) + return list; + + /* bleh evas list splicing */ + ll = evas_list_nth_list(list, mid); + if (ll->prev) + { + list->last = ll->prev; + list->count = mid; + ll->prev->next = NULL; + ll->prev = NULL; + } + + ll->count = size - mid; + + /* merge sort */ + l = evas_list_sort(list, mid, func); + ll = evas_list_sort(ll, size - mid, func); + list = evas_list_combine(l, ll, func); - /* merge sort */ - l = evas_list_sort(list, range, func); - ll = evas_list_sort(ll, size - range, func); - list = evas_list_combine(l, ll, func); - } return(list); } /**