summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorAndrei Zmievski <andrei@php.net>2000-03-14 21:20:38 +0000
committerAndrei Zmievski <andrei@php.net>2000-03-14 21:20:38 +0000
commit26eaf668e78ffa60e1559f4097eeea0ee1a645a2 (patch)
tree298d74675483b800507fb5a0e646c2db9bf6c71e /Zend
parent29c41fe46dccc9fbd874ab74e4bfa7dc5720d6f0 (diff)
downloadphp-git-26eaf668e78ffa60e1559f4097eeea0ee1a645a2.tar.gz
Implemented external list traversing.
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_llist.c44
-rw-r--r--Zend/zend_llist.h15
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 */