Просмотр исходного кода

reformatting: cJSONUtils_GenerateMergePatch

Max Bruckner 8 лет назад
Родитель
Сommit
c0b17dc651
1 измененных файлов с 53 добавлено и 29 удалено
  1. 53 29
      cJSON_Utils.c

+ 53 - 29
cJSON_Utils.c

@@ -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;
 }