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 /Zend/zend_llist.c | |
parent | 02d647b5f9b71dc8be2b9c6bdc87c4850c07683b (diff) | |
download | php-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.c | 37 |
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) { |