diff options
author | Andi Gutmans <andi@php.net> | 2000-02-18 14:33:28 +0000 |
---|---|---|
committer | Andi Gutmans <andi@php.net> | 2000-02-18 14:33:28 +0000 |
commit | e6b768105dfd416adc6e281af8ee7864a9596d85 (patch) | |
tree | d50df39595390d54f14df50cf416830f55b76e64 | |
parent | 02d647b5f9b71dc8be2b9c6bdc87c4850c07683b (diff) | |
download | php-git-e6b768105dfd416adc6e281af8ee7864a9596d85.tar.gz |
- Quick and dirty hack for supporting sorts. Improve later on when I wake up.
-rw-r--r-- | Zend/zend_llist.c | 37 | ||||
-rw-r--r-- | Zend/zend_llist.h | 4 |
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); |