summaryrefslogtreecommitdiff
path: root/Zend/zend_llist.c
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>2000-02-18 14:33:28 +0000
committerAndi Gutmans <andi@php.net>2000-02-18 14:33:28 +0000
commite6b768105dfd416adc6e281af8ee7864a9596d85 (patch)
treed50df39595390d54f14df50cf416830f55b76e64 /Zend/zend_llist.c
parent02d647b5f9b71dc8be2b9c6bdc87c4850c07683b (diff)
downloadphp-git-e6b768105dfd416adc6e281af8ee7864a9596d85.tar.gz
- Quick and dirty hack for supporting sorts. Improve later on when I wake up.
Diffstat (limited to 'Zend/zend_llist.c')
-rw-r--r--Zend/zend_llist.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/Zend/zend_llist.c b/Zend/zend_llist.c
index 1024f0fa8e..c8351ccadb 100644
--- a/Zend/zend_llist.c
+++ b/Zend/zend_llist.c
@@ -148,6 +148,43 @@ ZEND_API void zend_llist_apply(zend_llist *l, void (*func)(void *data))
}
}
+ZEND_API void zend_llist_sort(zend_llist *l, llist_compare_func_t comp_func)
+{
+ int list_size=0, i;
+
+ zend_llist_element **elements;
+ zend_llist_element *element, **ptr;
+
+ for (element=l->head; element; element=element->next) {
+ list_size++;
+ }
+
+ if (list_size == 0) {
+ return;
+ }
+
+ elements = (zend_llist_element **) emalloc(list_size*sizeof(zend_llist_element *));
+
+ ptr = &elements[0];
+
+ for (element=l->head; element; element=element->next) {
+ *ptr++ = element;
+ }
+
+ qsort(elements, list_size, sizeof(zend_llist_element *), (compare_func_t) comp_func);
+
+ l->head = elements[0];
+ elements[0]->prev = NULL;
+
+ for (i=1; i<list_size; i++) {
+ elements[i]->prev = elements[i-1];
+ elements[i-1]->next = elements[i];
+ }
+ elements[i-1]->next = NULL;
+ l->tail = elements[i-1];
+ efree(elements);
+}
+
ZEND_API void zend_llist_apply_with_argument(zend_llist *l, void (*func)(void *data, void *arg), void *arg)
{