Implemented external list traversing.

This commit is contained in:
Andrei Zmievski 2000-03-14 21:20:38 +00:00
parent 29c41fe46d
commit 26eaf668e7
2 changed files with 37 additions and 22 deletions

View file

@ -208,46 +208,54 @@ ZEND_API int zend_llist_count(zend_llist *l)
} }
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; zend_llist_position *current = pos ? pos : &l->traverse_ptr;
if (l->traverse_ptr) {
return l->traverse_ptr->data; *current = l->head;
if (*current) {
return (*current)->data;
} else { } else {
return NULL; 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; zend_llist_position *current = pos ? pos : &l->traverse_ptr;
if (l->traverse_ptr) {
return l->traverse_ptr->data; *current = l->tail;
if (*current) {
return (*current)->data;
} else { } else {
return NULL; 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) { zend_llist_position *current = pos ? pos : &l->traverse_ptr;
l->traverse_ptr = l->traverse_ptr->next;
if (l->traverse_ptr) { if (*current) {
return l->traverse_ptr->data; *current = (*current)->next;
if (*current) {
return (*current)->data;
} }
} }
return NULL; 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) { zend_llist_position *current = pos ? pos : &l->traverse_ptr;
l->traverse_ptr = l->traverse_ptr->prev;
if (l->traverse_ptr) { if (*current) {
return l->traverse_ptr->data; *current = (*current)->prev;
if (*current) {
return (*current)->data;
} }
} }
return NULL; return NULL;

View file

@ -39,6 +39,7 @@ typedef struct _zend_llist {
} zend_llist; } zend_llist;
typedef int (*llist_compare_func_t) (const zend_llist_element *, const zend_llist_element *); typedef int (*llist_compare_func_t) (const zend_llist_element *, const zend_llist_element *);
typedef zend_llist_element* zend_llist_position;
BEGIN_EXTERN_C() 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_init(zend_llist *l, size_t size, void (*dtor)(void *data), unsigned char persistent);
@ -55,10 +56,16 @@ ZEND_API int zend_llist_count(zend_llist *l);
ZEND_API void zend_llist_sort(zend_llist *l, llist_compare_func_t comp_func); ZEND_API void zend_llist_sort(zend_llist *l, llist_compare_func_t comp_func);
/* traversal */ /* traversal */
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);
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);
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);
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);
#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() END_EXTERN_C()
#endif /* _ZEND_LLIST_H */ #endif /* _ZEND_LLIST_H */