summaryrefslogtreecommitdiffstats
path: root/libcnary/node_iterator.c
diff options
context:
space:
mode:
Diffstat (limited to 'libcnary/node_iterator.c')
-rw-r--r--libcnary/node_iterator.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/libcnary/node_iterator.c b/libcnary/node_iterator.c
new file mode 100644
index 0000000..eef3a4f
--- /dev/null
+++ b/libcnary/node_iterator.c
@@ -0,0 +1,64 @@
1/*
2 * node_iterator.c
3 *
4 * Created on: Mar 8, 2011
5 * Author: posixninja
6 */
7
8#include <stdio.h>
9#include <stdlib.h>
10#include <string.h>
11
12#include "node.h"
13#include "node_list.h"
14#include "node_iterator.h"
15
16void node_iterator_destroy(node_iterator_t* iterator) {
17 if(iterator) {
18 free(iterator);
19 }
20}
21
22node_iterator_t* node_iterator_create(node_list_t* list) {
23 node_iterator_t* iterator = (node_iterator_t*) malloc(sizeof(node_iterator_t));
24 if(iterator == NULL) {
25 return NULL;
26 }
27 memset(iterator, '\0', sizeof(node_iterator_t));
28
29 iterator->count = 0;
30 iterator->position = 0;
31
32 iterator->end = NULL;
33 iterator->begin = NULL;
34 iterator->value = list->begin;
35
36 iterator->list = NULL;
37 iterator->next = node_iterator_next;
38 iterator->bind = node_iterator_bind;
39
40
41 if(list != NULL) {
42 iterator->bind(iterator, list);
43 }
44
45 return iterator;
46}
47
48node_t* node_iterator_next(node_iterator_t* iterator) {
49 node_t* node = iterator->value;
50 if (node) {
51 iterator->value = node->next;
52 }
53 iterator->position++;
54 return node;
55}
56
57int node_iterator_bind(node_iterator_t* iterator, node_list_t* list) {
58 iterator->position = 0;
59 iterator->end = list->end;
60 iterator->count = list->count;
61 iterator->begin = list->begin;
62 iterator->value = list->begin;
63 return 0;
64}