Source Code: http://www.divineblood.org/snippets/list_sort.c
Last Modified: Fri May 21, 2004 6:50pm
Download without markup
Download as zipfile
#define NEXTPTR(list) ((char *)&(list->next) - (char *)list)
void *list_sort(void *list, int nextpos, int(*compar)(const void *,
const void *));
void *list_sort(void *list, int nextpos, int(*compar)(const void *,
const void *))
{
int count = 0, i = 0;
unsigned char *ptr = list;
unsigned char **array;
for (; ptr != NULL; count++)
ptr = (void *)*(long *)(ptr+nextpos);
array = malloc(sizeof(void *)*count);
ptr = list;
for (; ptr != NULL; ptr = (void *)*(long *)(ptr+nextpos))
array[i++] = ptr;
qsort(array, count, sizeof(unsigned char *), compar);
list = NULL;
for (count--;count >= 0; count--)
{
(void *)*(long *)(array[count]+nextpos) = list;
list = array[count];
}
free(array);
return list;
}
list = list_sort(list, NEXTPTR(list), comparison_function);