Commit bc08d5f5 authored by Jonathan Beck's avatar Jonathan Beck

Add dict iteration. Add functions to retrieve index and key from node.

parent 009274f4
...@@ -61,6 +61,11 @@ extern "C" { ...@@ -61,6 +61,11 @@ extern "C" {
*/ */
typedef void *plist_t; typedef void *plist_t;
/**
* The plist dictionary iterator.
*/
typedef uint32_t *plist_dict_iter;
/** /**
* The enumeration of plist node types. * The enumeration of plist node types.
*/ */
...@@ -195,6 +200,14 @@ extern "C" { ...@@ -195,6 +200,14 @@ extern "C" {
*/ */
PLIST_API plist_t plist_array_get_item(plist_t node, uint32_t n); 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. * Set the nth item in a #PLIST_ARRAY node.
* The previous item at index n will be freed using #plist_free * The previous item at index n will be freed using #plist_free
...@@ -238,12 +251,31 @@ extern "C" { ...@@ -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 * @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. * Get the nth item in a #PLIST_DICT node.
......
...@@ -212,6 +212,14 @@ plist_t plist_array_get_item(plist_t node, uint32_t n) ...@@ -212,6 +212,14 @@ plist_t plist_array_get_item(plist_t node, uint32_t n)
return ret; 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) void plist_array_set_item(plist_t node, plist_t item, uint32_t n)
{ {
if (node && PLIST_ARRAY == plist_get_node_type(node)) { if (node && PLIST_ARRAY == plist_get_node_type(node)) {
...@@ -252,13 +260,38 @@ void plist_array_remove_item(plist_t node, uint32_t n) ...@@ -252,13 +260,38 @@ void plist_array_remove_item(plist_t node, uint32_t n)
return; 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 (iter && *iter == NULL) {
if (node && PLIST_DICT == plist_get_node_type(node)) { *iter = malloc(sizeof(uint32_t));
ret = g_node_n_children(node) / 2; **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) plist_t plist_dict_get_item(plist_t node, const char* key)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment