diff options
author | Andrei Zmievski <andrei@php.net> | 2000-03-14 21:20:38 +0000 |
---|---|---|
committer | Andrei Zmievski <andrei@php.net> | 2000-03-14 21:20:38 +0000 |
commit | 26eaf668e78ffa60e1559f4097eeea0ee1a645a2 (patch) | |
tree | 298d74675483b800507fb5a0e646c2db9bf6c71e /Zend | |
parent | 29c41fe46dccc9fbd874ab74e4bfa7dc5720d6f0 (diff) | |
download | php-git-26eaf668e78ffa60e1559f4097eeea0ee1a645a2.tar.gz |
Implemented external list traversing.
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/zend_llist.c | 44 | ||||
-rw-r--r-- | Zend/zend_llist.h | 15 |
2 files changed, 37 insertions, 22 deletions
diff --git a/Zend/zend_llist.c b/Zend/zend_llist.c index ffb535ab79..5ea65786c2 100644 --- a/Zend/zend_llist.c +++ b/Zend/zend_llist.c @@ -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; - 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; diff --git a/Zend/zend_llist.h b/Zend/zend_llist.h index c51f9074a7..805859a8ff 100644 --- a/Zend/zend_llist.h +++ b/Zend/zend_llist.h @@ -39,6 +39,7 @@ typedef struct _zend_llist { } 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); @@ -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); /* 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 */ |