summaryrefslogtreecommitdiff
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
parent02d647b5f9b71dc8be2b9c6bdc87c4850c07683b (diff)
downloadphp-git-e6b768105dfd416adc6e281af8ee7864a9596d85.tar.gz
- Quick and dirty hack for supporting sorts. Improve later on when I wake up.
-rw-r--r--Zend/zend_llist.c37
-rw-r--r--Zend/zend_llist.h4
2 files changed, 41 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)
{
diff --git a/Zend/zend_llist.h b/Zend/zend_llist.h
index c6eddb59b2..3cb8f28d96 100644
--- a/Zend/zend_llist.h
+++ b/Zend/zend_llist.h
@@ -38,6 +38,9 @@ typedef struct _zend_llist {
zend_llist_element *traverse_ptr;
} zend_llist;
+typedef int (*llist_compare_func_t) (const zend_llist_element *, const zend_llist_element *);
+typedef int (*compare_func_t)(const void *, const void *);
+
BEGIN_EXTERN_C()
ZEND_API void zend_llist_init(zend_llist *l, size_t size, void (*dtor)(void *data), unsigned char persistent);
ZEND_API void zend_llist_add_element(zend_llist *l, void *element);
@@ -50,6 +53,7 @@ ZEND_API void zend_llist_copy(zend_llist *dst, zend_llist *src);
ZEND_API void zend_llist_apply(zend_llist *l, void (*func)(void *data));
ZEND_API void zend_llist_apply_with_argument(zend_llist *l, void (*func)(void *data, void *arg), void *arg);
ZEND_API int zend_llist_count(zend_llist *l);
+ZEND_API void zend_llist_sort(zend_llist *l, llist_compare_func_t comp_func);
/* traversal */
ZEND_API void *zend_llist_get_first(zend_llist *l);