diff options
author | Nikias Bassen | 2014-03-19 02:26:09 +0100 |
---|---|---|
committer | Nikias Bassen | 2014-03-19 02:26:09 +0100 |
commit | f9299fa80a7530fea4b829ea851972a664edf1fe (patch) | |
tree | 94cf6141a7ef3c4661f05d33cb26e05d6e1b2410 | |
parent | 6dcc8c48bb372ad372ffb1848bd24c6b416fd16e (diff) | |
download | libplist-f9299fa80a7530fea4b829ea851972a664edf1fe.tar.gz libplist-f9299fa80a7530fea4b829ea851972a664edf1fe.tar.bz2 |
plist_dict_set_item: insert key/value pair if key not already present
-rw-r--r-- | include/plist/plist.h | 9 | ||||
-rw-r--r-- | src/plist.c | 21 |
2 files changed, 16 insertions, 14 deletions
diff --git a/include/plist/plist.h b/include/plist/plist.h index 41588a8..b482199 100644 --- a/include/plist/plist.h +++ b/include/plist/plist.h @@ -310,20 +310,21 @@ extern "C" /** * Set item identified by key in a #PLIST_DICT node. - * The previous item at index n will be freed using #plist_free + * The previous item identified by key will be freed using #plist_free. + * If there is no item for the given key a new item will be inserted. * * @param node the node of type #PLIST_DICT * @param item the new item associated to key - * @param key the identifier of the item to get. Assert if identifier is not present. + * @param key the identifier of the item to set. */ PLIST_API void plist_dict_set_item(plist_t node, const char* key, plist_t item); /** - * Insert a new item at position n in a #PLIST_DICT node. + * Insert a new item into a #PLIST_DICT node. * * @param node the node of type #PLIST_DICT * @param item the new item to insert - * @param key The identifier of the item to insert. Assert if identifier already present. + * @param key The identifier of the item to insert. */ PLIST_API void plist_dict_insert_item(plist_t node, const char* key, plist_t item); diff --git a/src/plist.c b/src/plist.c index e077ad9..f33de0a 100644 --- a/src/plist.c +++ b/src/plist.c @@ -405,17 +405,18 @@ plist_t plist_dict_get_item(plist_t node, const char* key) void plist_dict_set_item(plist_t node, const char* key, plist_t item) { - if (node && PLIST_DICT == plist_get_node_type(node)) - { + if (node && PLIST_DICT == plist_get_node_type(node)) { node_t* old_item = plist_dict_get_item(node, key); - if (old_item) - { + if (old_item) { int idx = plist_free_node(old_item); - if (idx < 0) { - node_attach(node, item); - } else { - node_insert(node, idx, item); - } + if (idx < 0) { + node_attach(node, item); + } else { + node_insert(node, idx, item); + } + } else { + node_attach(node, plist_new_key(key)); + node_attach(node, item); } } return; @@ -466,7 +467,7 @@ void plist_dict_merge(plist_t *target, plist_t source) if (plist_dict_get_item(*target, key) != NULL) plist_dict_remove_item(*target, key); - plist_dict_insert_item(*target, key, plist_copy(subnode)); + plist_dict_set_item(*target, key, plist_copy(subnode)); free(key); key = NULL; } while (1); |