make evas_list_sort more bullet-proof

SVN revision: 13503
This commit is contained in:
tsauerbeck 2005-02-25 15:31:52 +00:00 committed by tsauerbeck
parent a360af99f4
commit c6d34bc399
1 changed files with 28 additions and 17 deletions

View File

@ -854,25 +854,36 @@ Evas_List *
evas_list_sort(Evas_List *list, int size, int (*func)(void *, void *)) evas_list_sort(Evas_List *list, int size, int (*func)(void *, void *))
{ {
Evas_List *l = NULL, *ll = NULL; Evas_List *l = NULL, *ll = NULL;
int range = (size / 2); int mid;
if(range > 0) if (!list || !func)
{ return NULL;
/* bleh evas list splicing */
ll = evas_list_nth_list(list, range); /* if the caller specified an invalid size, sort the whole list */
if(ll->prev) if (size <= 0 || size > list->count)
{ size = list->count;
list->last = ll->prev;
list->count = range; mid = size / 2;
} if (mid < 1)
ll->prev->next = NULL; return list;
ll->count = size - range;
/* 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); return(list);
} }
/** /**