summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Jonathan Beck2009-04-15 22:35:56 +0200
committerGravatar Jonathan Beck2009-04-15 22:35:56 +0200
commit21e389bca01794aeca1e79c92a86fc060549b835 (patch)
treea116561eb9c682b31e1d560d5b1eb75f28ff6d8e
parent2abf518f8e92957df0dd74c06c49a5eb17845865 (diff)
downloadlibplist-21e389bca01794aeca1e79c92a86fc060549b835.tar.gz
libplist-21e389bca01794aeca1e79c92a86fc060549b835.tar.bz2
Add special accessor for structured types in API.
-rw-r--r--include/plist/plist.h19
-rw-r--r--src/plist.c28
-rw-r--r--swig/plist.i54
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 () {