mirror of
https://github.com/DaveGamble/cJSON.git
synced 2023-08-10 21:13:26 +03:00
cJSONUtils_ApplyPatches: Handle replacement of root
This commit is contained in:
parent
02a05eea4e
commit
134ebf5e89
@ -486,7 +486,7 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch)
|
|||||||
|
|
||||||
op = cJSON_GetObjectItem(patch, "op");
|
op = cJSON_GetObjectItem(patch, "op");
|
||||||
path = cJSON_GetObjectItem(patch, "path");
|
path = cJSON_GetObjectItem(patch, "path");
|
||||||
if (!op || !path)
|
if (!cJSON_IsString(op) || !cJSON_IsString(path))
|
||||||
{
|
{
|
||||||
/* malformed patch. */
|
/* malformed patch. */
|
||||||
return 2;
|
return 2;
|
||||||
@ -524,6 +524,81 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch)
|
|||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* special case for replacing the root */
|
||||||
|
if (path->valuestring[0] == '\0')
|
||||||
|
{
|
||||||
|
if (opcode == REMOVE)
|
||||||
|
{
|
||||||
|
/* remove possible children */
|
||||||
|
if (object->child != NULL)
|
||||||
|
{
|
||||||
|
cJSON_Delete(object->child);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* remove other allocated resources */
|
||||||
|
if (object->string != NULL)
|
||||||
|
{
|
||||||
|
cJSON_free(object->string);
|
||||||
|
}
|
||||||
|
if (object->valuestring != NULL)
|
||||||
|
{
|
||||||
|
cJSON_free(object->valuestring);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* make it invalid */
|
||||||
|
memset(object, '\0', sizeof(cJSON));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((opcode == REPLACE) || (opcode == ADD))
|
||||||
|
{
|
||||||
|
/* remove possible children */
|
||||||
|
if (object->child != NULL)
|
||||||
|
{
|
||||||
|
cJSON_Delete(object->child);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* remove other allocated resources */
|
||||||
|
if (object->string != NULL)
|
||||||
|
{
|
||||||
|
cJSON_free(object->string);
|
||||||
|
}
|
||||||
|
if (object->valuestring != NULL)
|
||||||
|
{
|
||||||
|
cJSON_free(object->valuestring);
|
||||||
|
}
|
||||||
|
|
||||||
|
value = cJSON_GetObjectItem(patch, "value");
|
||||||
|
if (value == NULL)
|
||||||
|
{
|
||||||
|
/* missing "value" for add/replace. */
|
||||||
|
return 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = cJSON_Duplicate(value, 1);
|
||||||
|
if (value == NULL)
|
||||||
|
{
|
||||||
|
/* out of memory for add/replace. */
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
/* the string "value" isn't needed */
|
||||||
|
if (value->string != NULL)
|
||||||
|
{
|
||||||
|
cJSON_free(value->string);
|
||||||
|
value->string = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* copy over the value object */
|
||||||
|
memcpy(object, value, sizeof(cJSON));
|
||||||
|
|
||||||
|
/* delete the duplicated value */
|
||||||
|
cJSON_free(value);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((opcode == REMOVE) || (opcode == REPLACE))
|
if ((opcode == REMOVE) || (opcode == REPLACE))
|
||||||
{
|
{
|
||||||
/* Get rid of old. */
|
/* Get rid of old. */
|
||||||
|
Loading…
Reference in New Issue
Block a user