Skip to content

Commit e6b7681

Browse files
author
Andi Gutmans
committed
- Quick and dirty hack for supporting sorts. Improve later on when I wake up.
1 parent 02d647b commit e6b7681

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

Zend/zend_llist.c

+37
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,43 @@ ZEND_API void zend_llist_apply(zend_llist *l, void (*func)(void *data))
148148
}
149149
}
150150

151+
ZEND_API void zend_llist_sort(zend_llist *l, llist_compare_func_t comp_func)
152+
{
153+
int list_size=0, i;
154+
155+
zend_llist_element **elements;
156+
zend_llist_element *element, **ptr;
157+
158+
for (element=l->head; element; element=element->next) {
159+
list_size++;
160+
}
161+
162+
if (list_size == 0) {
163+
return;
164+
}
165+
166+
elements = (zend_llist_element **) emalloc(list_size*sizeof(zend_llist_element *));
167+
168+
ptr = &elements[0];
169+
170+
for (element=l->head; element; element=element->next) {
171+
*ptr++ = element;
172+
}
173+
174+
qsort(elements, list_size, sizeof(zend_llist_element *), (compare_func_t) comp_func);
175+
176+
l->head = elements[0];
177+
elements[0]->prev = NULL;
178+
179+
for (i=1; i<list_size; i++) {
180+
elements[i]->prev = elements[i-1];
181+
elements[i-1]->next = elements[i];
182+
}
183+
elements[i-1]->next = NULL;
184+
l->tail = elements[i-1];
185+
efree(elements);
186+
}
187+
151188

152189
ZEND_API void zend_llist_apply_with_argument(zend_llist *l, void (*func)(void *data, void *arg), void *arg)
153190
{

Zend/zend_llist.h

+4
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ typedef struct _zend_llist {
3838
zend_llist_element *traverse_ptr;
3939
} zend_llist;
4040

41+
typedef int (*llist_compare_func_t) (const zend_llist_element *, const zend_llist_element *);
42+
typedef int (*compare_func_t)(const void *, const void *);
43+
4144
BEGIN_EXTERN_C()
4245
ZEND_API void zend_llist_init(zend_llist *l, size_t size, void (*dtor)(void *data), unsigned char persistent);
4346
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);
5053
ZEND_API void zend_llist_apply(zend_llist *l, void (*func)(void *data));
5154
ZEND_API void zend_llist_apply_with_argument(zend_llist *l, void (*func)(void *data, void *arg), void *arg);
5255
ZEND_API int zend_llist_count(zend_llist *l);
56+
ZEND_API void zend_llist_sort(zend_llist *l, llist_compare_func_t comp_func);
5357

5458
/* traversal */
5559
ZEND_API void *zend_llist_get_first(zend_llist *l);

0 commit comments

Comments
 (0)