|
@@ -756,34 +756,58 @@ cJSON* cJSONUtils_MergePatch(cJSON *target, cJSON *patch)
|
|
|
return target;
|
|
|
}
|
|
|
|
|
|
-cJSON *cJSONUtils_GenerateMergePatch(cJSON *from,cJSON *to)
|
|
|
+cJSON *cJSONUtils_GenerateMergePatch(cJSON *from, cJSON *to)
|
|
|
{
|
|
|
- cJSON *patch=0;
|
|
|
- if (!to) return cJSON_CreateNull();
|
|
|
- if (to->type!=cJSON_Object || !from || from->type!=cJSON_Object) return cJSON_Duplicate(to,1);
|
|
|
- cJSONUtils_SortObject(from);
|
|
|
- cJSONUtils_SortObject(to);
|
|
|
- from=from->child;to=to->child;
|
|
|
- patch=cJSON_CreateObject();
|
|
|
- while (from || to)
|
|
|
- {
|
|
|
- int compare=from?(to?strcmp(from->string,to->string):-1):1;
|
|
|
- if (compare<0)
|
|
|
- {
|
|
|
- cJSON_AddItemToObject(patch,from->string,cJSON_CreateNull());
|
|
|
- from=from->next;
|
|
|
- }
|
|
|
- else if (compare>0)
|
|
|
- {
|
|
|
- cJSON_AddItemToObject(patch,to->string,cJSON_Duplicate(to,1));
|
|
|
- to=to->next;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if (cJSONUtils_Compare(from,to)) cJSON_AddItemToObject(patch,to->string,cJSONUtils_GenerateMergePatch(from,to));
|
|
|
- from=from->next;to=to->next;
|
|
|
- }
|
|
|
- }
|
|
|
- if (!patch->child) {cJSON_Delete(patch);return 0;}
|
|
|
- return patch;
|
|
|
+ cJSON *patch = 0;
|
|
|
+ if (!to)
|
|
|
+ {
|
|
|
+ /* patch to delete everything */
|
|
|
+ return cJSON_CreateNull();
|
|
|
+ }
|
|
|
+ if ((to->type != cJSON_Object) || !from || (from->type != cJSON_Object))
|
|
|
+ {
|
|
|
+ return cJSON_Duplicate(to, 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ cJSONUtils_SortObject(from);
|
|
|
+ cJSONUtils_SortObject(to);
|
|
|
+
|
|
|
+ from = from->child;
|
|
|
+ to = to->child;
|
|
|
+ patch = cJSON_CreateObject();
|
|
|
+ while (from || to)
|
|
|
+ {
|
|
|
+ int compare = from ? (to ? strcmp(from->string, to->string) : -1) : 1;
|
|
|
+ if (compare < 0)
|
|
|
+ {
|
|
|
+ /* from has a value that to doesn't have -> remove */
|
|
|
+ cJSON_AddItemToObject(patch, from->string, cJSON_CreateNull());
|
|
|
+ from = from->next;
|
|
|
+ }
|
|
|
+ else if (compare > 0)
|
|
|
+ {
|
|
|
+ /* to has a value that from doesn't have -> add to patch */
|
|
|
+ cJSON_AddItemToObject(patch, to->string, cJSON_Duplicate(to, 1));
|
|
|
+ to = to->next;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ /* object key exists in both objects */
|
|
|
+ if (cJSONUtils_Compare(from, to))
|
|
|
+ {
|
|
|
+ /* not identical --> generate a patch */
|
|
|
+ cJSON_AddItemToObject(patch, to->string, cJSONUtils_GenerateMergePatch(from, to));
|
|
|
+ }
|
|
|
+ /* next key in the object */
|
|
|
+ from = from->next;
|
|
|
+ to = to->next;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!patch->child)
|
|
|
+ {
|
|
|
+ cJSON_Delete(patch);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return patch;
|
|
|
}
|