forked from enlightenment/efl
make evas_list_sort more bullet-proof
SVN revision: 13503
This commit is contained in:
parent
a360af99f4
commit
c6d34bc399
|
@ -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 (!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;
|
||||
|
||||
if(range > 0)
|
||||
{
|
||||
/* bleh evas list splicing */
|
||||
ll = evas_list_nth_list(list, range);
|
||||
if(ll->prev)
|
||||
ll = evas_list_nth_list(list, mid);
|
||||
if (ll->prev)
|
||||
{
|
||||
list->last = ll->prev;
|
||||
list->count = range;
|
||||
}
|
||||
list->count = mid;
|
||||
ll->prev->next = NULL;
|
||||
ll->count = size - range;
|
||||
ll->prev = NULL;
|
||||
}
|
||||
|
||||
ll->count = size - mid;
|
||||
|
||||
/* merge sort */
|
||||
l = evas_list_sort(list, range, func);
|
||||
ll = evas_list_sort(ll, size - range, func);
|
||||
l = evas_list_sort(list, mid, func);
|
||||
ll = evas_list_sort(ll, size - mid, func);
|
||||
list = evas_list_combine(l, ll, func);
|
||||
}
|
||||
|
||||
return(list);
|
||||
}
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue