diff options
Diffstat (limited to 'src/sp_list.c')
| -rw-r--r-- | src/sp_list.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/sp_list.c b/src/sp_list.c index 0f00371..ab752f7 100644 --- a/src/sp_list.c +++ b/src/sp_list.c | |||
| @@ -1,8 +1,22 @@ | |||
| 1 | #include "php_snuffleupagus.h" | 1 | #include "php_snuffleupagus.h" |
| 2 | 2 | ||
| 3 | void sp_list_free(sp_list_node *node) { | 3 | void sp_list_free(sp_list_node *node, void (*free_data_func)(void *data)) { |
| 4 | while (node) { | 4 | while (node) { |
| 5 | sp_list_node *tmp = node->next; | 5 | sp_list_node *tmp = node->next; |
| 6 | if (free_data_func && node->data) { | ||
| 7 | free_data_func(node->data); | ||
| 8 | } | ||
| 9 | pefree(node, 1); | ||
| 10 | node = tmp; | ||
| 11 | } | ||
| 12 | } | ||
| 13 | |||
| 14 | void sp_list_free2(sp_list_node *node) { | ||
| 15 | while (node) { | ||
| 16 | sp_list_node *tmp = node->next; | ||
| 17 | if (node->data) { | ||
| 18 | pefree(node->data, 1); | ||
| 19 | } | ||
| 6 | pefree(node, 1); | 20 | pefree(node, 1); |
| 7 | node = tmp; | 21 | node = tmp; |
| 8 | } | 22 | } |
| @@ -61,3 +75,9 @@ sp_list_node *sp_list_prepend(sp_list_node *list, void *data) { | |||
| 61 | new->data = data; | 75 | new->data = data; |
| 62 | return new; | 76 | return new; |
| 63 | } | 77 | } |
| 78 | |||
| 79 | size_t sp_list_len(sp_list_node *p) { | ||
| 80 | size_t num = 0; | ||
| 81 | for (; p; p = p->next) { num++; } | ||
| 82 | return num; | ||
| 83 | } | ||
