diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common.c | 26 | ||||
-rw-r--r-- | src/common.h | 2 |
2 files changed, 28 insertions, 0 deletions
diff --git a/src/common.c b/src/common.c index 6c2b613..426b96f 100644 --- a/src/common.c +++ b/src/common.c @@ -262,3 +262,29 @@ void idevicerestore_progress(struct idevicerestore_client_t* client, int step, d } } } + +void plist_dict_merge(plist_t* dictionary, plist_t node) +{ + if (dictionary == NULL || (plist_get_node_type(*dictionary) != PLIST_DICT)) + return; + + char* key = NULL; + plist_dict_iter it = NULL; + plist_t subnode = NULL; + plist_dict_new_iter(node, &it); + plist_dict_next_item(node, it, &key, &subnode); + + while (subnode) + { + if (plist_dict_get_item(*dictionary, key) != NULL) + plist_dict_remove_item(*dictionary, key); + + plist_dict_insert_item(*dictionary, key, plist_copy(subnode)); + if (key) { + free(key); + key = NULL; + } + plist_dict_next_item(node, it, &key, &subnode); + } + free(it); +}
\ No newline at end of file diff --git a/src/common.h b/src/common.h index 2ea4a91..0805e0a 100644 --- a/src/common.h +++ b/src/common.h @@ -137,6 +137,8 @@ int mkdir_with_parents(const char *dir, int mode); void idevicerestore_progress(struct idevicerestore_client_t* client, int step, double progress); +void plist_dict_merge(plist_t* dictionary, plist_t node); + #ifdef __cplusplus } #endif |