}
-ZEND_API void *zend_llist_get_first(zend_llist *l)
+ZEND_API void *zend_llist_get_first_ex(zend_llist *l, zend_llist_position *pos)
{
- l->traverse_ptr = l->head;
- if (l->traverse_ptr) {
- return l->traverse_ptr->data;
+ zend_llist_position *current = pos ? pos : &l->traverse_ptr;
+
+ *current = l->head;
+ if (*current) {
+ return (*current)->data;
} else {
return NULL;
}
}
-ZEND_API void *zend_llist_get_last(zend_llist *l)
+ZEND_API void *zend_llist_get_last_ex(zend_llist *l, zend_llist_position *pos)
{
- l->traverse_ptr = l->tail;
- if (l->traverse_ptr) {
- return l->traverse_ptr->data;
+ zend_llist_position *current = pos ? pos : &l->traverse_ptr;
+
+ *current = l->tail;
+ if (*current) {
+ return (*current)->data;
} else {
return NULL;
}
}
-ZEND_API void *zend_llist_get_next(zend_llist *l)
+ZEND_API void *zend_llist_get_next_ex(zend_llist *l, zend_llist_position *pos)
{
- if (l->traverse_ptr) {
- l->traverse_ptr = l->traverse_ptr->next;
- if (l->traverse_ptr) {
- return l->traverse_ptr->data;
+ zend_llist_position *current = pos ? pos : &l->traverse_ptr;
+
+ if (*current) {
+ *current = (*current)->next;
+ if (*current) {
+ return (*current)->data;
}
}
return NULL;
}
-ZEND_API void *zend_llist_get_prev(zend_llist *l)
+ZEND_API void *zend_llist_get_prev_ex(zend_llist *l, zend_llist_position *pos)
{
- if (l->traverse_ptr) {
- l->traverse_ptr = l->traverse_ptr->prev;
- if (l->traverse_ptr) {
- return l->traverse_ptr->data;
+ zend_llist_position *current = pos ? pos : &l->traverse_ptr;
+
+ if (*current) {
+ *current = (*current)->prev;
+ if (*current) {
+ return (*current)->data;
}
}
return NULL;
} zend_llist;
typedef int (*llist_compare_func_t) (const zend_llist_element *, const zend_llist_element *);
+typedef zend_llist_element* zend_llist_position;
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_sort(zend_llist *l, llist_compare_func_t comp_func);
/* traversal */
-ZEND_API void *zend_llist_get_first(zend_llist *l);
-ZEND_API void *zend_llist_get_last(zend_llist *l);
-ZEND_API void *zend_llist_get_next(zend_llist *l);
-ZEND_API void *zend_llist_get_prev(zend_llist *l);
+ZEND_API void *zend_llist_get_first_ex(zend_llist *l, zend_llist_position *pos);
+ZEND_API void *zend_llist_get_last_ex(zend_llist *l, zend_llist_position *pos);
+ZEND_API void *zend_llist_get_next_ex(zend_llist *l, zend_llist_position *pos);
+ZEND_API void *zend_llist_get_prev_ex(zend_llist *l, zend_llist_position *pos);
+
+#define zend_llist_get_first(l) zend_llist_get_first_ex(l, NULL)
+#define zend_llist_get_last(l) zend_llist_get_last_ex(l, NULL)
+#define zend_llist_get_next(l) zend_llist_get_next_ex(l, NULL)
+#define zend_llist_get_prev(l) zend_llist_get_prev_ex(l, NULL)
+
END_EXTERN_C()
#endif /* _ZEND_LLIST_H */