summaryrefslogtreecommitdiff
path: root/src/sp_list.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sp_list.c')
-rw-r--r--src/sp_list.c22
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
3void sp_list_free(sp_list_node *node) { 3void 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
14void 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
79size_t sp_list_len(sp_list_node *p) {
80 size_t num = 0;
81 for (; p; p = p->next) { num++; }
82 return num;
83}