diff options
author | Stanislav Malyshev <stas@php.net> | 2000-11-13 14:55:28 +0000 |
---|---|---|
committer | Stanislav Malyshev <stas@php.net> | 2000-11-13 14:55:28 +0000 |
commit | 124569d16747392f1b464dd53bbe2a4223a7fc23 (patch) | |
tree | 61c194ed05e2ff17418e6d72e6b1ff0c44ecc59d /Zend | |
parent | 39f8c9807eb7cbc65aec0d8895ba4fc483dfe2c1 (diff) | |
download | php-git-124569d16747392f1b464dd53bbe2a4223a7fc23.tar.gz |
Fix zend_llist_apply_with_del - it should remove from list,
not only call dtor
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/zend_llist.c | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/Zend/zend_llist.c b/Zend/zend_llist.c index e0798f1a91..4d78b6c0b6 100644 --- a/Zend/zend_llist.c +++ b/Zend/zend_llist.c @@ -63,26 +63,30 @@ ZEND_API void zend_llist_prepend_element(zend_llist *l, void *element) } +#define DEL_LLIST_ELEMENT(current,l) \ + if (current->prev) {\ + current->prev->next = current->next;\ + } else {\ + l->head = current->next;\ + }\ + if (current->next) {\ + current->next->prev = current->prev;\ + } else {\ + l->tail = current->prev;\ + }\ + if (l->dtor) {\ + l->dtor(current->data);\ + pefree(current, l->persistent);\ + } + + ZEND_API void zend_llist_del_element(zend_llist *l, void *element, int (*compare)(void *element1, void *element2)) { zend_llist_element *current=l->head; while (current) { if (compare(current->data, element)) { - if (current->prev) { - current->prev->next = current->next; - } else { - l->head = current->next; - } - if (current->next) { - current->next->prev = current->prev; - } else { - l->tail = current->prev; - } - if (l->dtor) { - l->dtor(current->data); - pefree(current, l->persistent); - } + DEL_LLIST_ELEMENT(current,l); break; } current = current->next; @@ -147,10 +151,7 @@ ZEND_API void zend_llist_apply_with_del(zend_llist *l, int (*func)(void *data)) while (element) { next = element->next; if (func(element->data)) { - if (l->dtor) { - l->dtor(element->data); - pefree(element, l->persistent); - } + DEL_LLIST_ELEMENT(element,l); } element = next; } |