mirror of
https://github.com/DaveGamble/cJSON.git
synced 2026-11-14 19:03:32 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a2a2411b12 | ||
|
|
03ba72faec | ||
|
|
569aa060c6 | ||
|
|
b9cc911831 | ||
|
|
9abe75e072 |
No files matched your search
@@ -1,3 +1,11 @@
|
|||||||
|
1.5.5
|
||||||
|
=====
|
||||||
|
Fixes:
|
||||||
|
------
|
||||||
|
* Fix pointers to nested arrays in cJSON_Utils (9abe75e072050f34732a7169740989a082b65134)
|
||||||
|
* Fix an error with case sensitivity handling in cJSON_Utils (b9cc911831b0b3e1bb72f142389428e59f882b38)
|
||||||
|
* Fix cJSON_Compare for arrays that are prefixes of the other and objects that are a subset of the other (03ba72faec115160d1f3aea5582d9b6af5d3e473) See #180, thanks @zhengqb for reporting
|
||||||
|
|
||||||
1.5.4
|
1.5.4
|
||||||
=====
|
=====
|
||||||
Fixes:
|
Fixes:
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@ project(cJSON C)
|
|||||||
|
|
||||||
set(PROJECT_VERSION_MAJOR 1)
|
set(PROJECT_VERSION_MAJOR 1)
|
||||||
set(PROJECT_VERSION_MINOR 5)
|
set(PROJECT_VERSION_MINOR 5)
|
||||||
set(PROJECT_VERSION_PATCH 4)
|
set(PROJECT_VERSION_PATCH 5)
|
||||||
set(CJSON_VERSION_SO 1)
|
set(CJSON_VERSION_SO 1)
|
||||||
set(CJSON_UTILS_VERSION_SO 1)
|
set(CJSON_UTILS_VERSION_SO 1)
|
||||||
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
|
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ CJSON_TEST_SRC = cJSON.c test.c
|
|||||||
|
|
||||||
LDLIBS = -lm
|
LDLIBS = -lm
|
||||||
|
|
||||||
LIBVERSION = 1.5.4
|
LIBVERSION = 1.5.5
|
||||||
CJSON_SOVERSION = 1
|
CJSON_SOVERSION = 1
|
||||||
UTILS_SOVERSION = 1
|
UTILS_SOVERSION = 1
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */
|
/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */
|
||||||
#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 5) || (CJSON_VERSION_PATCH != 4)
|
#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 5) || (CJSON_VERSION_PATCH != 5)
|
||||||
#error cJSON.h and cJSON.c have different versions. Make sure that both have the same.
|
#error cJSON.h and cJSON.c have different versions. Make sure that both have the same.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -2594,16 +2594,22 @@ CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * cons
|
|||||||
b_element = b_element->next;
|
b_element = b_element->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* one of the arrays is longer than the other */
|
||||||
|
if (a_element != b_element) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
case cJSON_Object:
|
case cJSON_Object:
|
||||||
{
|
{
|
||||||
cJSON *a_element = NULL;
|
cJSON *a_element = NULL;
|
||||||
|
cJSON *b_element = NULL;
|
||||||
cJSON_ArrayForEach(a_element, a)
|
cJSON_ArrayForEach(a_element, a)
|
||||||
{
|
{
|
||||||
/* TODO This has O(n^2) runtime, which is horrible! */
|
/* TODO This has O(n^2) runtime, which is horrible! */
|
||||||
cJSON *b_element = get_object_item(b, a_element->string, case_sensitive);
|
b_element = get_object_item(b, a_element->string, case_sensitive);
|
||||||
if (b_element == NULL)
|
if (b_element == NULL)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@@ -2615,6 +2621,22 @@ CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * cons
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* doing this twice, once on a and b to prevent true comparison if a subset of b
|
||||||
|
* TODO: Do this the proper way, this is just a fix for now */
|
||||||
|
cJSON_ArrayForEach(b_element, b)
|
||||||
|
{
|
||||||
|
a_element = get_object_item(a, b_element->string, case_sensitive);
|
||||||
|
if (a_element == NULL)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cJSON_Compare(b_element, a_element, case_sensitive))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ extern "C"
|
|||||||
/* project version */
|
/* project version */
|
||||||
#define CJSON_VERSION_MAJOR 1
|
#define CJSON_VERSION_MAJOR 1
|
||||||
#define CJSON_VERSION_MINOR 5
|
#define CJSON_VERSION_MINOR 5
|
||||||
#define CJSON_VERSION_PATCH 4
|
#define CJSON_VERSION_PATCH 5
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
|||||||
+13
-5
@@ -279,16 +279,17 @@ static cJSON *get_item_from_pointer(cJSON * const object, const char * pointer,
|
|||||||
{
|
{
|
||||||
current_element = current_element->next;
|
current_element = current_element->next;
|
||||||
}
|
}
|
||||||
/* skip to the next path token or end of string */
|
|
||||||
while ((pointer[0] != '\0') && (pointer[0] != '/'))
|
|
||||||
{
|
|
||||||
pointer++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* skip to the next path token or end of string */
|
||||||
|
while ((pointer[0] != '\0') && (pointer[0] != '/'))
|
||||||
|
{
|
||||||
|
pointer++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return current_element;
|
return current_element;
|
||||||
@@ -941,8 +942,15 @@ static int apply_patch(cJSON *object, const cJSON *patch, const cJSON_bool case_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (cJSON_IsObject(parent))
|
else if (cJSON_IsObject(parent))
|
||||||
|
{
|
||||||
|
if (case_sensitive)
|
||||||
|
{
|
||||||
|
cJSON_DeleteItemFromObjectCaseSensitive(parent, (char*)child_pointer);
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
cJSON_DeleteItemFromObject(parent, (char*)child_pointer);
|
cJSON_DeleteItemFromObject(parent, (char*)child_pointer);
|
||||||
|
}
|
||||||
cJSON_AddItemToObject(parent, (char*)child_pointer, value);
|
cJSON_AddItemToObject(parent, (char*)child_pointer, value);
|
||||||
value = NULL;
|
value = NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -148,6 +148,10 @@ static void cjson_compare_should_compare_arrays(void)
|
|||||||
|
|
||||||
TEST_ASSERT_FALSE(compare_from_string("[true,null,42,\"string\",[],{}]", "[false, true, null, 42, \"string\", [], {}]", true));
|
TEST_ASSERT_FALSE(compare_from_string("[true,null,42,\"string\",[],{}]", "[false, true, null, 42, \"string\", [], {}]", true));
|
||||||
TEST_ASSERT_FALSE(compare_from_string("[true,null,42,\"string\",[],{}]", "[false, true, null, 42, \"string\", [], {}]", false));
|
TEST_ASSERT_FALSE(compare_from_string("[true,null,42,\"string\",[],{}]", "[false, true, null, 42, \"string\", [], {}]", false));
|
||||||
|
|
||||||
|
/* Arrays that are a prefix of another array */
|
||||||
|
TEST_ASSERT_FALSE(compare_from_string("[1,2,3]", "[1,2]", true));
|
||||||
|
TEST_ASSERT_FALSE(compare_from_string("[1,2,3]", "[1,2]", false));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cjson_compare_should_compare_objects(void)
|
static void cjson_compare_should_compare_objects(void)
|
||||||
@@ -171,6 +175,15 @@ static void cjson_compare_should_compare_objects(void)
|
|||||||
"{\"Flse\": false, \"true\": true, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
|
"{\"Flse\": false, \"true\": true, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
|
||||||
"{\"true\": true, \"false\": false, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
|
"{\"true\": true, \"false\": false, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
|
||||||
false));
|
false));
|
||||||
|
/* test objects that are a subset of each other */
|
||||||
|
TEST_ASSERT_FALSE(compare_from_string(
|
||||||
|
"{\"one\": 1, \"two\": 2}",
|
||||||
|
"{\"one\": 1, \"two\": 2, \"three\": 3}",
|
||||||
|
true))
|
||||||
|
TEST_ASSERT_FALSE(compare_from_string(
|
||||||
|
"{\"one\": 1, \"two\": 2}",
|
||||||
|
"{\"one\": 1, \"two\": 2, \"three\": 3}",
|
||||||
|
false))
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
|
|||||||
Reference in new issue
Block a user