summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Jonathan Beck2009-10-11 12:14:22 +0200
committerGravatar Jonathan Beck2009-10-11 12:14:22 +0200
commit5a7a91d4eb2263d2c9fd63d51bce9a4738b072d9 (patch)
treed571396540d0e9ec1cad8bef150eddd8a8e82f56
parentf8ba9f02e363e01b34381d945987b6cbefecfe97 (diff)
downloadlibplist-5a7a91d4eb2263d2c9fd63d51bce9a4738b072d9.tar.gz
libplist-5a7a91d4eb2263d2c9fd63d51bce9a4738b072d9.tar.bz2
Fix dict iteration.
-rw-r--r--src/plist.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/plist.c b/src/plist.c
index b723517..5ef3144 100644
--- a/src/plist.c
+++ b/src/plist.c
@@ -264,24 +264,33 @@ void plist_dict_new_iter(plist_t node, plist_dict_iter *iter)
{
if (iter && *iter == NULL) {
*iter = malloc(sizeof(uint32_t));
- *(uint32_t*)*iter = 0;
+ *((uint32_t*)(*iter)) = 0;
}
return;
}
void plist_dict_next_item(plist_t node, plist_dict_iter iter, char **key, plist_t *val)
{
- if (node && PLIST_DICT == plist_get_node_type(node) && *(uint32_t*)iter < g_node_n_children(node) / 2) {
+ uint32_t* iter_int = (uint32_t*) iter;
+
+ if (key) {
+ *key = NULL;
+ }
+ if (val) {
+ *val = NULL;
+ }
+
+ if (node && PLIST_DICT == plist_get_node_type(node) && *iter_int < g_node_n_children(node)) {
if (key) {
- plist_get_key_val((plist_t)g_node_nth_child(node, 2 * (*(uint32_t*)iter)), key);
+ plist_get_key_val((plist_t)g_node_nth_child(node, *iter_int), key);
}
if (val) {
- *val = (plist_t) g_node_nth_child(node, 2 * (*(uint32_t*)iter) + 1);
+ *val = (plist_t) g_node_nth_child(node, *iter_int + 1);
}
- *(uint32_t*)iter += 2;
+ *iter_int += 2;
}
return;
}