2017-03-22 11:46:42 +00:00
|
|
|
/*
|
|
|
|
Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
|
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
|
|
in the Software without restriction, including without limitation the rights
|
|
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
|
|
all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
THE SOFTWARE.
|
|
|
|
*/
|
|
|
|
|
2015-02-09 18:29:05 +00:00
|
|
|
#include "cJSON.h"
|
|
|
|
|
2016-10-12 17:18:44 +00:00
|
|
|
/* Implement RFC6901 (https://tools.ietf.org/html/rfc6901) JSON Pointer spec. */
|
2017-04-30 10:57:49 +00:00
|
|
|
CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *pointer);
|
2017-04-30 17:58:00 +00:00
|
|
|
CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointerCaseSensitive(cJSON * const object, const char *pointer);
|
2015-02-09 18:29:05 +00:00
|
|
|
|
2016-10-12 17:18:44 +00:00
|
|
|
/* Implement RFC6902 (https://tools.ietf.org/html/rfc6902) JSON Patch spec. */
|
2017-04-30 11:15:18 +00:00
|
|
|
/* NOTE: This modifies objects in 'from' and 'to' by sorting the elements by their key */
|
|
|
|
CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON * const from, cJSON * const to);
|
2017-04-30 17:59:05 +00:00
|
|
|
CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatchesCaseSensitive(cJSON * const from, cJSON * const to);
|
2016-10-12 17:18:44 +00:00
|
|
|
/* Utility for generating patch array entries. */
|
2017-04-30 11:13:17 +00:00
|
|
|
CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * const operation, const char * const path, const cJSON * const value);
|
2016-10-12 17:18:44 +00:00
|
|
|
/* Returns 0 for success. */
|
2017-04-30 11:12:32 +00:00
|
|
|
CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * const patches);
|
2017-04-30 18:01:56 +00:00
|
|
|
CJSON_PUBLIC(int) cJSONUtils_ApplyPatchesCaseSensitive(cJSON * const object, const cJSON * const patches);
|
2015-02-10 14:17:59 +00:00
|
|
|
|
2015-02-13 19:19:26 +00:00
|
|
|
/*
|
2015-02-10 14:17:59 +00:00
|
|
|
// Note that ApplyPatches is NOT atomic on failure. To implement an atomic ApplyPatches, use:
|
|
|
|
//int cJSONUtils_AtomicApplyPatches(cJSON **object, cJSON *patches)
|
|
|
|
//{
|
2016-10-12 17:18:44 +00:00
|
|
|
// cJSON *modme = cJSON_Duplicate(*object, 1);
|
|
|
|
// int error = cJSONUtils_ApplyPatches(modme, patches);
|
|
|
|
// if (!error)
|
|
|
|
// {
|
|
|
|
// cJSON_Delete(*object);
|
|
|
|
// *object = modme;
|
|
|
|
// }
|
|
|
|
// else
|
|
|
|
// {
|
|
|
|
// cJSON_Delete(modme);
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// return error;
|
2015-02-10 14:17:59 +00:00
|
|
|
//}
|
|
|
|
// Code not added to library since this strategy is a LOT slower.
|
2015-02-13 19:19:26 +00:00
|
|
|
*/
|
2015-02-11 01:29:40 +00:00
|
|
|
|
2016-05-29 16:39:54 +00:00
|
|
|
/* Implement RFC7386 (https://tools.ietf.org/html/rfc7396) JSON Merge Patch spec. */
|
2016-10-12 17:18:44 +00:00
|
|
|
/* target will be modified by patch. return value is new ptr for target. */
|
2017-04-30 11:17:39 +00:00
|
|
|
CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch);
|
2017-05-01 20:41:19 +00:00
|
|
|
CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatchCaseSensitive(cJSON *target, const cJSON * const patch);
|
2016-10-12 17:18:44 +00:00
|
|
|
/* generates a patch to move from -> to */
|
2017-04-30 11:18:25 +00:00
|
|
|
/* NOTE: This modifies objects in 'from' and 'to' by sorting the elements by their key */
|
|
|
|
CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * const to);
|
2017-04-30 18:04:44 +00:00
|
|
|
CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatchCaseSensitive(cJSON * const from, cJSON * const to);
|
2016-05-29 16:39:54 +00:00
|
|
|
|
2016-10-12 17:18:44 +00:00
|
|
|
/* Given a root object and a target object, construct a pointer from one to the other. */
|
2017-04-30 10:56:02 +00:00
|
|
|
CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const object, const cJSON * const target);
|
2015-02-13 19:19:26 +00:00
|
|
|
|
2016-10-12 17:18:44 +00:00
|
|
|
/* Sorts the members of the object into alphabetical order. */
|
2017-04-30 11:16:58 +00:00
|
|
|
CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object);
|
2017-04-30 18:09:54 +00:00
|
|
|
CJSON_PUBLIC(void) cJSONUtils_SortObjectCaseSensitive(cJSON * const object);
|