summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2019-01-21 02:09:44 +0100
committerGravatar Nikias Bassen2019-01-21 02:22:28 +0100
commit84d6af8f82b30b6519bb401d467febe4ea981dad (patch)
treecfd1f1f34e60cfb87696a8cb480e5af00b8c89a3 /src
parent5f8ca6e30334b81bd39a67f87a011cee8f282c3c (diff)
downloadlibplist-84d6af8f82b30b6519bb401d467febe4ea981dad.tar.gz
libplist-84d6af8f82b30b6519bb401d467febe4ea981dad.tar.bz2
plist: Add iterator for #PLIST_ARRAY nodes
Similar to #PLIST_DICT, an iterator can now be used for #PLIST_ARRAY nodes. Get an iterator with plist_array_new_iter() and use plist_array_next_item() to iterate over the elements.
Diffstat (limited to 'src')
-rw-r--r--src/Array.cpp38
-rw-r--r--src/plist.c38
2 files changed, 50 insertions, 26 deletions
diff --git a/src/Array.cpp b/src/Array.cpp
index 7c38a69..a511841 100644
--- a/src/Array.cpp
+++ b/src/Array.cpp
@@ -31,29 +31,30 @@ Array::Array(Node* parent) : Structure(PLIST_ARRAY, parent)
_array.clear();
}
+static void array_fill(Array *_this, std::vector<Node*> array, plist_t node)
+{
+ plist_array_iter iter = NULL;
+ plist_array_new_iter(node, &iter);
+ plist_t subnode;
+ do {
+ subnode = NULL;
+ plist_array_next_item(node, iter, &subnode);
+ array.push_back( Node::FromPlist(subnode, _this) );
+ } while (subnode);
+ free(iter);
+}
+
Array::Array(plist_t node, Node* parent) : Structure(parent)
{
_node = node;
- uint32_t size = plist_array_get_size(_node);
-
- for (uint32_t i = 0; i < size; i++)
- {
- plist_t subnode = plist_array_get_item(_node, i);
- _array.push_back( Node::FromPlist(subnode, this) );
- }
+ array_fill(this, _array, _node);
}
Array::Array(const PList::Array& a) : Structure()
{
_array.clear();
_node = plist_copy(a.GetPlist());
- uint32_t size = plist_array_get_size(_node);
-
- for (uint32_t i = 0; i < size; i++)
- {
- plist_t subnode = plist_array_get_item(_node, i);
- _array.push_back( Node::FromPlist(subnode, this) );
- }
+ array_fill(this, _array, _node);
}
Array& Array::operator=(PList::Array& a)
@@ -64,15 +65,8 @@ Array& Array::operator=(PList::Array& a)
delete _array.at(it);
}
_array.clear();
-
_node = plist_copy(a.GetPlist());
- uint32_t size = plist_array_get_size(_node);
-
- for (uint32_t i = 0; i < size; i++)
- {
- plist_t subnode = plist_array_get_item(_node, i);
- _array.push_back( Node::FromPlist(subnode, this) );
- }
+ array_fill(this, _array, _node);
return *this;
}
diff --git a/src/plist.c b/src/plist.c
index 6b604d6..1b33ec3 100644
--- a/src/plist.c
+++ b/src/plist.c
@@ -2,9 +2,9 @@
* plist.c
* Builds plist XML structures
*
- * Copyright (c) 2009-2016 Nikias Bassen All Rights Reserved.
- * Copyright (c) 2010-2015 Martin Szulecki All Rights Reserved.
- * Copyright (c) 2008 Zach C. All Rights Reserved.
+ * Copyright (c) 2009-2019 Nikias Bassen, All Rights Reserved.
+ * Copyright (c) 2010-2015 Martin Szulecki, All Rights Reserved.
+ * Copyright (c) 2008 Zach C., 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
@@ -457,6 +457,36 @@ PLIST_API void plist_array_remove_item(plist_t node, uint32_t n)
return;
}
+PLIST_API void plist_array_new_iter(plist_t node, plist_array_iter *iter)
+{
+ if (iter)
+ {
+ *iter = malloc(sizeof(node_t*));
+ *((node_t**)(*iter)) = node_first_child(node);
+ }
+ return;
+}
+
+PLIST_API void plist_array_next_item(plist_t node, plist_array_iter iter, plist_t *item)
+{
+ node_t** iter_node = (node_t**)iter;
+
+ if (item)
+ {
+ *item = NULL;
+ }
+
+ if (node && PLIST_ARRAY == plist_get_node_type(node) && *iter_node)
+ {
+ if (item)
+ {
+ *item = (plist_t)(*iter_node);
+ }
+ *iter_node = node_next_sibling(*iter_node);
+ }
+ return;
+}
+
PLIST_API uint32_t plist_dict_get_size(plist_t node)
{
uint32_t ret = 0;
@@ -469,7 +499,7 @@ PLIST_API uint32_t plist_dict_get_size(plist_t node)
PLIST_API void plist_dict_new_iter(plist_t node, plist_dict_iter *iter)
{
- if (iter && *iter == NULL)
+ if (iter)
{
*iter = malloc(sizeof(node_t*));
*((node_t**)(*iter)) = node_first_child(node);