Remove node_iterator and operate on node list directly to improve memory usage
diff --git a/libcnary/Makefile.am b/libcnary/Makefile.am
index bba9ada..5a26fb5 100644
--- a/libcnary/Makefile.am
+++ b/libcnary/Makefile.am
@@ -8,11 +8,7 @@
 		       node.c \
 		       list.c \
 		       node_list.c \
-		       iterator.c \
-		       node_iterator.c \
 		       include/node.h \
 		       include/list.h \
 		       include/node_list.h \
-		       include/iterator.h \
-		       include/node_iterator.h \
 		       include/object.h
diff --git a/libcnary/include/iterator.h b/libcnary/include/iterator.h
deleted file mode 100644
index a33c4ff..0000000
--- a/libcnary/include/iterator.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * iterator.h
- *
- *  Created on: Mar 8, 2011
- *      Author: posixninja
- *
- * Copyright (c) 2011 Joshua Hill. All Rights Reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#ifndef ITERATOR_H_
-#define ITERATOR_H_
-
-struct list_t;
-struct object_t;
-
-typedef struct iterator_t {
-	struct object_t*(*next)(struct iterator_t* iterator);
-	int(*bind)(struct iterator_t* iterator, struct list_t* list);
-
-	unsigned int count;
-	unsigned int position;
-
-	struct list_t* list;
-	struct object_t* end;
-	struct object_t* begin;
-	struct object_t* value;
-} iterator_t;
-
-void iterator_destroy(struct iterator_t* iterator);
-struct iterator_t* iterator_create(struct list_t* list);
-
-struct object_t* iterator_next(struct iterator_t* iterator);
-int iterator_bind(struct iterator_t* iterator, struct list_t* list);
-
-#endif /* ITERATOR_H_ */
diff --git a/libcnary/include/node_iterator.h b/libcnary/include/node_iterator.h
deleted file mode 100644
index d3bce3a..0000000
--- a/libcnary/include/node_iterator.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * node_iterator.h
- *
- *  Created on: Mar 8, 2011
- *      Author: posixninja
- *
- * Copyright (c) 2011 Joshua Hill. All Rights Reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#ifndef NODE_ITERATOR_H_
-#define NODE_ITERATOR_H_
-
-#include "iterator.h"
-#include "node_list.h"
-
-// This class implements the abstract iterator class
-typedef struct node_iterator_t {
-	// Super class
-	struct iterator_t super;
-
-	// Local members
-	struct node_t*(*next)(struct node_iterator_t* iterator);
-	int(*bind)(struct node_iterator_t* iterator, struct node_list_t* list);
-
-	unsigned int count;
-	unsigned int position;
-
-	struct node_list_t* list;
-	struct node_t* end;
-	struct node_t* begin;
-	struct node_t* value;
-
-} node_iterator_t;
-
-void node_iterator_destroy(node_iterator_t* iterator);
-node_iterator_t* node_iterator_create(node_list_t* list);
-
-struct node_t* node_iterator_next(struct node_iterator_t* iterator);
-int node_iterator_bind(struct node_iterator_t* iterator, struct node_list_t* list);
-
-#endif /* NODE_ITERATOR_H_ */
diff --git a/libcnary/iterator.c b/libcnary/iterator.c
deleted file mode 100644
index 492a8ae..0000000
--- a/libcnary/iterator.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * iterator.c
- *
- *  Created on: Mar 8, 2011
- *      Author: posixninja
- *
- * Copyright (c) 2011 Joshua Hill. All Rights Reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "list.h"
-#include "object.h"
-#include "iterator.h"
-
-void iterator_destroy(iterator_t* iterator) {
-	if(iterator) {
-		free(iterator);
-	}
-}
-
-iterator_t* iterator_create(list_t* list) {
-	iterator_t* iterator = (iterator_t*) malloc(sizeof(iterator_t));
-	if(iterator == NULL) {
-		return NULL;
-	}
-	memset(iterator, '\0', sizeof(iterator_t));
-
-	if(list != NULL) {
-		// Create and bind to list
-
-	} else {
-		// Empty Iterator
-	}
-
-	return iterator;
-}
-
-object_t* iterator_next(iterator_t* iterator) {
-	return NULL;
-}
-
-int iterator_bind(iterator_t* iterator, list_t* list) {
-	return -1;
-}
diff --git a/libcnary/node.c b/libcnary/node.c
index 4b550dd..c24ca7a 100644
--- a/libcnary/node.c
+++ b/libcnary/node.c
@@ -26,7 +26,6 @@
 
 #include "node.h"
 #include "node_list.h"
-#include "node_iterator.h"
 
 void node_destroy(node_t* node) {
 	if(!node) return;
@@ -114,7 +113,6 @@
 static void _node_debug(node_t* node, unsigned int depth) {
 	unsigned int i = 0;
 	node_t* current = NULL;
-	node_iterator_t* iter = NULL;
 	for(i = 0; i < depth; i++) {
 		printf("\t");
 	}
@@ -128,11 +126,9 @@
 		if(node->parent) {
 			printf("NODE\n");
 		}
-		iter = node_iterator_create(node->children);
-		while ((current = iter->next(iter))) {
+		for (current = node_first_child(node); current; current = node_next_sibling(current)) {
 			_node_debug(current, depth+1);
 		}
-		node_iterator_destroy(iter);
 	}
 
 }
diff --git a/libcnary/node_iterator.c b/libcnary/node_iterator.c
deleted file mode 100644
index e629b73..0000000
--- a/libcnary/node_iterator.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * node_iterator.c
- *
- *  Created on: Mar 8, 2011
- *      Author: posixninja
- *
- * Copyright (c) 2011 Joshua Hill. All Rights Reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "node.h"
-#include "node_list.h"
-#include "node_iterator.h"
-
-void node_iterator_destroy(node_iterator_t* iterator) {
-	if(iterator) {
-		free(iterator);
-	}
-}
-
-node_iterator_t* node_iterator_create(node_list_t* list) {
-	node_iterator_t* iterator = (node_iterator_t*) malloc(sizeof(node_iterator_t));
-	if(iterator == NULL) {
-		return NULL;
-	}
-	memset(iterator, '\0', sizeof(node_iterator_t));
-
-	iterator->count = 0;
-	iterator->position = 0;
-
-	iterator->end = NULL;
-	iterator->begin = NULL;
-	iterator->value = NULL;
-
-	iterator->list = NULL;
-	iterator->next = node_iterator_next;
-	iterator->bind = node_iterator_bind;
-
-
-	if(list != NULL) {
-		iterator->bind(iterator, list);
-	}
-
-	return iterator;
-}
-
-node_t* node_iterator_next(node_iterator_t* iterator) {
-	node_t* node = iterator->value;
-	if (node) {
-		iterator->value = node->next;
-	}
-	iterator->position++;
-	return node;
-}
-
-int node_iterator_bind(node_iterator_t* iterator, node_list_t* list) {
-	iterator->position = 0;
-	iterator->end = list->end;
-	iterator->count = list->count;
-	iterator->begin = list->begin;
-	iterator->value = list->begin;
-	return 0;
-}
diff --git a/src/bplist.c b/src/bplist.c
index 69f3dca..679a5e5 100644
--- a/src/bplist.c
+++ b/src/bplist.c
@@ -39,7 +39,6 @@
 #include "ptrarray.h"
 
 #include <node.h>
-#include <node_iterator.h>
 
 /* Magic marker and size. */
 #define BPLIST_MAGIC            ((uint8_t*)"bplist")
@@ -938,12 +937,10 @@
     ptr_array_add(ser->objects, node);
 
     //now recurse on children
-    node_iterator_t *ni = node_iterator_create(node->children);
     node_t *ch;
-    while ((ch = node_iterator_next(ni))) {
+    for (ch = node_first_child(node); ch; ch = node_next_sibling(ch)) {
         serialize_plist(ch, data);
     }
-    node_iterator_destroy(ni);
 
     return;
 }
diff --git a/src/plist.c b/src/plist.c
index f62e6be..cd22ca6 100644
--- a/src/plist.c
+++ b/src/plist.c
@@ -36,7 +36,6 @@
 #endif
 
 #include <node.h>
-#include <node_iterator.h>
 #include <hashtable.h>
 
 extern void plist_xml_init(void);
@@ -209,12 +208,12 @@
     plist_free_data(data);
     node->data = NULL;
 
-    node_iterator_t *ni = node_iterator_create(node->children);
     node_t *ch;
-    while ((ch = node_iterator_next(ni))) {
+    for (ch = node_first_child(node); ch; ) {
+        node_t *next = node_next_sibling(ch);
         plist_free_node(ch);
+        ch = next;
     }
-    node_iterator_destroy(ni);
 
     node_destroy(node);
 
@@ -366,12 +365,10 @@
         *(plist_t*)parent_node_ptr = newnode;
     }
 
-    node_iterator_t *ni = node_iterator_create(node->children);
     node_t *ch;
-    while ((ch = node_iterator_next(ni))) {
+    for (ch = node_first_child(node); ch; ch = node_next_sibling(ch)) {
         plist_copy_node(ch, &newnode);
     }
-    node_iterator_destroy(ni);
 }
 
 PLIST_API plist_t plist_copy(plist_t node)
diff --git a/src/xplist.c b/src/xplist.c
index 6e64427..29b1284 100644
--- a/src/xplist.c
+++ b/src/xplist.c
@@ -40,7 +40,6 @@
 
 #include <node.h>
 #include <node_list.h>
-#include <node_iterator.h>
 
 #include "plist.h"
 #include "base64.h"
@@ -356,12 +355,10 @@
         if (node_data->type == PLIST_DICT) {
             assert((node->children->count % 2) == 0);
         }
-        node_iterator_t *ni = node_iterator_create(node->children);
         node_t *ch;
-        while ((ch = node_iterator_next(ni))) {
+        for (ch = node_first_child(node); ch; ch = node_next_sibling(ch)) {
             node_to_xml(ch, outbuf, depth+1);
         }
-        node_iterator_destroy(ni);
     }
 
     /* fix indent for structured types */