From 01a813f642b2606c5fd84444690c4681cd85b4d0 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sat, 29 Oct 2016 12:40:41 +0700 Subject: [PATCH] reformatting: cJSONUtils_MergePatch --- cJSON_Utils.c | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 903e2da..50dc9a3 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -725,21 +725,35 @@ void cJSONUtils_SortObject(cJSON *object) cJSON* cJSONUtils_MergePatch(cJSON *target, cJSON *patch) { - if (!patch || patch->type != cJSON_Object) {cJSON_Delete(target);return cJSON_Duplicate(patch,1);} - if (!target || target->type != cJSON_Object) {cJSON_Delete(target);target=cJSON_CreateObject();} + if (!patch || (patch->type != cJSON_Object)) + { + /* scalar value, array or NULL, just duplicate */ + cJSON_Delete(target); + return cJSON_Duplicate(patch, 1); + } - patch=patch->child; - while (patch) - { - if (patch->type == cJSON_NULL) cJSON_DeleteItemFromObject(target,patch->string); - else - { - cJSON *replaceme=cJSON_DetachItemFromObject(target,patch->string); - cJSON_AddItemToObject(target,patch->string,cJSONUtils_MergePatch(replaceme,patch)); - } - patch=patch->next; - } - return target; + if (!target || (target->type != cJSON_Object)) + { + cJSON_Delete(target); + target = cJSON_CreateObject(); + } + + patch = patch->child; + while (patch) + { + if (patch->type == cJSON_NULL) + { + /* NULL is the indicator to remove a value, see RFC7396 */ + cJSON_DeleteItemFromObject(target, patch->string); + } + else + { + cJSON *replaceme = cJSON_DetachItemFromObject(target, patch->string); + cJSON_AddItemToObject(target, patch->string, cJSONUtils_MergePatch(replaceme, patch)); + } + patch = patch->next; + } + return target; } cJSON *cJSONUtils_GenerateMergePatch(cJSON *from,cJSON *to)