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_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);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue