summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2013-12-13 00:32:06 +0100
committerGravatar Nikias Bassen2013-12-13 00:32:06 +0100
commit3b7647499474619b3e24bf01105b6b037887a0ed (patch)
tree743215893ce32c6d535f0dc143cb3e9f4060a378
parent8f644ca58ea2174241a3a3ddac943efdf353642c (diff)
downloadlibplist-3b7647499474619b3e24bf01105b6b037887a0ed.tar.gz
libplist-3b7647499474619b3e24bf01105b6b037887a0ed.tar.bz2
add new plist_dict_merge() function
-rw-r--r--include/plist/plist.h10
-rw-r--r--src/plist.c27
2 files changed, 37 insertions, 0 deletions
diff --git a/include/plist/plist.h b/include/plist/plist.h
index 546e108..41588a8 100644
--- a/include/plist/plist.h
+++ b/include/plist/plist.h
@@ -336,6 +336,16 @@ extern "C"
336 */ 336 */
337 PLIST_API void plist_dict_remove_item(plist_t node, const char* key); 337 PLIST_API void plist_dict_remove_item(plist_t node, const char* key);
338 338
339 /**
340 * Merge a dictionary into another. This will add all key/value pairs
341 * from the source dictionary to the target dictionary, overwriting
342 * any existing key/value pairs that are already present in target.
343 *
344 * @param target pointer to an existing node of type #PLIST_DICT
345 * @param source node of type #PLIST_DICT that should be merged into target
346 */
347 PLIST_API void plist_dict_merge(plist_t *target, plist_t source);
348
339 349
340 /******************************************** 350 /********************************************
341 * * 351 * *
diff --git a/src/plist.c b/src/plist.c
index dcaf601..e077ad9 100644
--- a/src/plist.c
+++ b/src/plist.c
@@ -446,6 +446,33 @@ void plist_dict_remove_item(plist_t node, const char* key)
446 return; 446 return;
447} 447}
448 448
449void plist_dict_merge(plist_t *target, plist_t source)
450{
451 if (!target || !*target || (plist_get_node_type(*target) != PLIST_DICT) || !source || (plist_get_node_type(source) != PLIST_DICT))
452 return;
453
454 char* key = NULL;
455 plist_dict_iter it = NULL;
456 plist_t subnode = NULL;
457 plist_dict_new_iter(source, &it);
458 if (!it)
459 return;
460
461 do {
462 plist_dict_next_item(source, it, &key, &subnode);
463 if (!key)
464 break;
465
466 if (plist_dict_get_item(*target, key) != NULL)
467 plist_dict_remove_item(*target, key);
468
469 plist_dict_insert_item(*target, key, plist_copy(subnode));
470 free(key);
471 key = NULL;
472 } while (1);
473 free(it);
474}
475
449plist_t plist_access_pathv(plist_t plist, uint32_t length, va_list v) 476plist_t plist_access_pathv(plist_t plist, uint32_t length, va_list v)
450{ 477{
451 plist_t current = plist; 478 plist_t current = plist;