summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/plist/plist.h38
-rw-r--r--src/plist.c43
2 files changed, 73 insertions, 8 deletions
diff --git a/include/plist/plist.h b/include/plist/plist.h
index beb467a..484203b 100644
--- a/include/plist/plist.h
+++ b/include/plist/plist.h
@@ -62,6 +62,11 @@ extern "C" {
typedef void *plist_t;
/**
+ * The plist dictionary iterator.
+ */
+ typedef uint32_t *plist_dict_iter;
+
+/**
* The enumeration of plist node types.
*/
typedef enum {
@@ -196,6 +201,14 @@ extern "C" {
PLIST_API plist_t plist_array_get_item(plist_t node, uint32_t n);
/**
+ * Get the index of an item. item must be a member of a #PLIST_ARRAY node.
+ *
+ * @param node the node
+ * @return the node index
+ */
+ PLIST_API uint32_t plist_array_get_item_index(plist_t node);
+
+/**
* Set the nth item in a #PLIST_ARRAY node.
* The previous item at index n will be freed using #plist_free
*
@@ -238,12 +251,31 @@ extern "C" {
********************************************/
/**
- * Get size of a #PLIST_DICT node.
+ * Create iterator of a #PLIST_DICT node.
+ * The allocated iterator shoult be freed with tandard free function
+ *
+ * @param node the node of type #PLIST_DICT
+ * @param iter iterator of the #PLIST_DICT node
+ */
+ PLIST_API void plist_dict_new_iter(plist_t node, plist_dict_iter *iter);
+
+/**
+ * Increment iterator of a #PLIST_DICT node.
*
* @param node the node of type #PLIST_DICT
- * @return size of the #PLIST_DICT node
+ * @param iter iterator of the dictionary
+ * @param key a location to store the key, or NULL.
+ * @param val a location to store the value, or NULL.
+ */
+ PLIST_API void plist_dict_next_item(plist_t node, plist_dict_iter iter, char **key, plist_t *val);
+
+/**
+ * Get key associated to an item. Item must be member of a dictionary
+ *
+ * @param node the node
+ * @param key a location to store the key.
*/
- PLIST_API uint32_t plist_dict_get_size(plist_t node);
+ PLIST_API void plist_dict_get_item_key(plist_t node, char **key);
/**
* Get the nth item in a #PLIST_DICT node.
diff --git a/src/plist.c b/src/plist.c
index 95bc43c..a9a6173 100644
--- a/src/plist.c
+++ b/src/plist.c
@@ -212,6 +212,14 @@ plist_t plist_array_get_item(plist_t node, uint32_t n)
return ret;
}
+uint32_t plist_array_get_item_index(plist_t node)
+{
+ plist_t father = plist_get_parent(node);
+ if (PLIST_ARRAY == plist_get_node_type(father)) {
+ return g_node_child_position(father, node);
+ }
+}
+
void plist_array_set_item(plist_t node, plist_t item, uint32_t n)
{
if (node && PLIST_ARRAY == plist_get_node_type(node)) {
@@ -252,13 +260,38 @@ void plist_array_remove_item(plist_t node, uint32_t n)
return;
}
-uint32_t plist_dict_get_size(plist_t node)
+void plist_dict_new_iter(plist_t node, plist_dict_iter *iter)
{
- uint32_t ret = 0;
- if (node && PLIST_DICT == plist_get_node_type(node)) {
- ret = g_node_n_children(node) / 2;
+ if (iter && *iter == NULL) {
+ *iter = malloc(sizeof(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) && *iter < g_node_n_children(node) / 2) {
+
+ if (key) {
+ plist_get_key_val((plist_t)g_node_nth_child(node, 2 * (*iter)), key);
+ }
+
+ if (val) {
+ val = (plist_t) g_node_nth_child(node, 2 * (*iter) + 1);
+ }
+
+ *iter += 2;
+ }
+ return;
+}
+
+void plist_dict_get_item_key(plist_t node, char **key)
+{
+ plist_t father = plist_get_parent(node);
+ if (PLIST_DICT == plist_get_node_type(father)) {
+ plist_get_key_val( (plist_t) g_node_prev_sibling(node), key);
}
- return ret;
}
plist_t plist_dict_get_item(plist_t node, const char* key)