Commit 21e389bc authored by Jonathan Beck's avatar Jonathan Beck

Add special accessor for structured types in API.

parent 2abf518f
...@@ -140,6 +140,25 @@ extern "C" { ...@@ -140,6 +140,25 @@ extern "C" {
*/ */
PLIST_API plist_t plist_get_prev_sibling(plist_t node); PLIST_API plist_t plist_get_prev_sibling(plist_t node);
/**
* Get the nth child of a #PLIST_ARRAY node.
*
* @param node the node of type #PLIST_ARRAY
* @param n the index of the child to get. Range is [0, array_size[
* @return the nth children or NULL if node is not of type #PLIST_ARRAY
*/
PLIST_API plist_t plist_get_array_nth_el(plist_t node, uint32_t n);
/**
* Get the child of a #PLIST_DICT node from the associated key value.
*
* @param node the node of type #PLIST_DICT
* @param key the key associated to the requested value
* @return the key associated value or NULL if node is not of type #PLIST_DICT
*/
PLIST_API plist_t plist_get_dict_el_from_key(plist_t node, const char *key);
/******************************************** /********************************************
* * * *
* Setters * * Setters *
......
...@@ -165,6 +165,34 @@ plist_t plist_get_prev_sibling(plist_t node) ...@@ -165,6 +165,34 @@ plist_t plist_get_prev_sibling(plist_t node)
return (plist_t) g_node_prev_sibling((GNode *) node); return (plist_t) g_node_prev_sibling((GNode *) node);
} }
plist_t plist_get_array_nth_el(plist_t node, uint32_t n)
{
plist_t ret = NULL;
if (node && PLIST_ARRAY == plist_get_node_type(node)) {
uint32_t i = 0;
plist_t temp = plist_get_first_child(node);
while ( i <= n && temp) {
if (i == n)
ret = temp;
temp = plist_get_next_sibling(temp);
i++;
}
}
return ret;
}
plist_t plist_get_dict_el_from_key(plist_t node, const char *key)
{
plist_t ret = NULL;
if (node && PLIST_DICT == plist_get_node_type(node)) {
plist_t key_node = plist_find_node_by_key(node, key);
ret = plist_get_next_sibling(key_node);
}
return ret;
}
static char compare_node_value(plist_type type, plist_data_t data, const void *value, uint64_t length) static char compare_node_value(plist_type type, plist_data_t data, const void *value, uint64_t length)
{ {
char res = FALSE; char res = FALSE;
......
...@@ -180,21 +180,55 @@ typedef struct { ...@@ -180,21 +180,55 @@ typedef struct {
} }
PListNode* find_node_by_key(char *s) { PListNode* find_node_by_key(char *s) {
PListNode* plist = allocate_wrapper(); plist_t node = plist_find_node_by_key($self->node, s);
if (plist) { if (node) {
plist->node = plist_find_node_by_key($self->node, s); PListNode* plist = allocate_wrapper();
plist->should_keep_plist = 1; if (plist) {
plist->node = node;
plist->should_keep_plist = 1;
}
return plist;
} }
return plist; return NULL;
} }
PListNode* find_node_by_string(char* s) { PListNode* find_node_by_string(char* s) {
PListNode* plist = allocate_wrapper(); plist_t node = plist_find_node_by_string($self->node, s);
if (plist) { if (node) {
plist->node = plist_find_node_by_string($self->node, s); PListNode* plist = allocate_wrapper();
plist->should_keep_plist = 1; if (plist) {
plist->node = node;
plist->should_keep_plist = 1;
}
return plist;
}
return NULL;
}
PListNode* get_array_nth_el(unsigned int n) {
plist_t node = plist_get_array_nth_el($self->node, n);
if (node) {
PListNode* plist = allocate_wrapper();
if (plist) {
plist->node = node;
plist->should_keep_plist = 1;
}
return plist;
} }
return plist; return NULL;
}
PListNode* get_dict_el_from_key(char *key) {
plist_t node = plist_get_dict_el_from_key($self->node, key);
if (node) {
PListNode* plist = allocate_wrapper();
if (plist) {
plist->node = node;
plist->should_keep_plist = 1;
}
return plist;
}
return NULL;
} }
char* to_xml () { char* to_xml () {
......
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