From 21e389bca01794aeca1e79c92a86fc060549b835 Mon Sep 17 00:00:00 2001 From: Jonathan Beck Date: Wed, 15 Apr 2009 22:35:56 +0200 Subject: Add special accessor for structured types in API. --- include/plist/plist.h | 19 ++++++++++++++++++ src/plist.c | 28 ++++++++++++++++++++++++++ swig/plist.i | 54 +++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 91 insertions(+), 10 deletions(-) diff --git a/include/plist/plist.h b/include/plist/plist.h index 7bdd00a..b7b0fa4 100644 --- a/include/plist/plist.h +++ b/include/plist/plist.h @@ -140,6 +140,25 @@ extern "C" { */ 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 * diff --git a/src/plist.c b/src/plist.c index 2a70a09..c3c9e7b 100644 --- a/src/plist.c +++ b/src/plist.c @@ -165,6 +165,34 @@ plist_t plist_get_prev_sibling(plist_t 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) { char res = FALSE; diff --git a/swig/plist.i b/swig/plist.i index 41ff7cc..a56592e 100644 --- a/swig/plist.i +++ b/swig/plist.i @@ -180,21 +180,55 @@ typedef struct { } PListNode* find_node_by_key(char *s) { - PListNode* plist = allocate_wrapper(); - if (plist) { - plist->node = plist_find_node_by_key($self->node, s); - plist->should_keep_plist = 1; + plist_t node = plist_find_node_by_key($self->node, s); + if (node) { + PListNode* plist = allocate_wrapper(); + if (plist) { + plist->node = node; + plist->should_keep_plist = 1; + } + return plist; } - return plist; + return NULL; } PListNode* find_node_by_string(char* s) { - PListNode* plist = allocate_wrapper(); - if (plist) { - plist->node = plist_find_node_by_string($self->node, s); - plist->should_keep_plist = 1; + plist_t node = plist_find_node_by_string($self->node, s); + if (node) { + PListNode* plist = allocate_wrapper(); + 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 () { -- cgit v1.1-32-gdbae