diff options
| -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); | 
