Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
afd5d186b7 | ||
|
|
7456637793 | ||
|
|
d92754cd30 | ||
|
|
e4980b65b9 | ||
|
|
629c354390 | ||
|
|
1b2236a9a6 | ||
|
|
1925d1bbe5 | ||
|
|
76b705576f |
@@ -1,3 +1,11 @@
|
|||||||
|
1.5.9
|
||||||
|
=====
|
||||||
|
* Set the global error pointer even if `return_parse_end` is passed to `cJSON_ParseWithOpts`. See #200, thanks @rmallins
|
||||||
|
|
||||||
|
1.5.8
|
||||||
|
=====
|
||||||
|
* Fix `make test` in the Makefile, thanks @YanhaoMo for reporting this (#195)
|
||||||
|
|
||||||
1.5.7
|
1.5.7
|
||||||
=====
|
=====
|
||||||
Fixes:
|
Fixes:
|
||||||
|
|||||||
@@ -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 7)
|
set(PROJECT_VERSION_PATCH 9)
|
||||||
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}")
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ Contributors
|
|||||||
* [Pawel Winogrodzki](https://github.com/PawelWMS)
|
* [Pawel Winogrodzki](https://github.com/PawelWMS)
|
||||||
* [prefetchnta](https://github.com/prefetchnta)
|
* [prefetchnta](https://github.com/prefetchnta)
|
||||||
* [Rafael Leal Dias](https://github.com/rafaeldias)
|
* [Rafael Leal Dias](https://github.com/rafaeldias)
|
||||||
|
* [Robin Mallinson](https://github.com/rmallins)
|
||||||
* [Rod Vagg](https://github.com/rvagg)
|
* [Rod Vagg](https://github.com/rvagg)
|
||||||
* [Roland Meertens](https://github.com/rmeertens)
|
* [Roland Meertens](https://github.com/rmeertens)
|
||||||
* [Romain Porte](https://github.com/MicroJoe)
|
* [Romain Porte](https://github.com/MicroJoe)
|
||||||
|
|||||||
7
Makefile
7
Makefile
@@ -8,7 +8,7 @@ CJSON_TEST_SRC = cJSON.c test.c
|
|||||||
|
|
||||||
LDLIBS = -lm
|
LDLIBS = -lm
|
||||||
|
|
||||||
LIBVERSION = 1.5.7
|
LIBVERSION = 1.5.9
|
||||||
CJSON_SOVERSION = 1
|
CJSON_SOVERSION = 1
|
||||||
UTILS_SOVERSION = 1
|
UTILS_SOVERSION = 1
|
||||||
|
|
||||||
@@ -66,11 +66,10 @@ shared: $(CJSON_SHARED) $(UTILS_SHARED)
|
|||||||
|
|
||||||
static: $(CJSON_STATIC) $(UTILS_STATIC)
|
static: $(CJSON_STATIC) $(UTILS_STATIC)
|
||||||
|
|
||||||
tests: $(CJSON_TEST) $(UTILS_TEST)
|
tests: $(CJSON_TEST)
|
||||||
|
|
||||||
test: tests
|
test: tests
|
||||||
./$(CJSON_TEST)
|
./$(CJSON_TEST)
|
||||||
./$(UTILS_TEST)
|
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
$(CC) -c $(R_CFLAGS) $<
|
$(CC) -c $(R_CFLAGS) $<
|
||||||
@@ -150,4 +149,4 @@ clean:
|
|||||||
$(RM) $(CJSON_OBJ) $(UTILS_OBJ) #delete object files
|
$(RM) $(CJSON_OBJ) $(UTILS_OBJ) #delete object files
|
||||||
$(RM) $(CJSON_SHARED) $(CJSON_SHARED_VERSION) $(CJSON_SHARED_SO) $(CJSON_STATIC) #delete cJSON
|
$(RM) $(CJSON_SHARED) $(CJSON_SHARED_VERSION) $(CJSON_SHARED_SO) $(CJSON_STATIC) #delete cJSON
|
||||||
$(RM) $(UTILS_SHARED) $(UTILS_SHARED_VERSION) $(UTILS_SHARED_SO) $(UTILS_STATIC) #delete cJSON_Utils
|
$(RM) $(UTILS_SHARED) $(UTILS_SHARED_VERSION) $(UTILS_SHARED_SO) $(UTILS_STATIC) #delete cJSON_Utils
|
||||||
$(RM) $(CJSON_TEST) $(UTILS_TEST) #delete tests
|
$(RM) $(CJSON_TEST) #delete test
|
||||||
|
|||||||
8
cJSON.c
8
cJSON.c
@@ -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 != 7)
|
#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 5) || (CJSON_VERSION_PATCH != 9)
|
||||||
#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
|
||||||
|
|
||||||
@@ -1006,10 +1006,8 @@ fail:
|
|||||||
{
|
{
|
||||||
*return_parse_end = (const char*)local_error.json + local_error.position;
|
*return_parse_end = (const char*)local_error.json + local_error.position;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
global_error = local_error;
|
||||||
global_error = local_error;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
4
cJSON.h
4
cJSON.h
@@ -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 7
|
#define CJSON_VERSION_PATCH 9
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);
|
|||||||
/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */
|
/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */
|
||||||
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
|
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
|
||||||
/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
|
/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
|
||||||
/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error. If not, then cJSON_GetErrorPtr() does the job. */
|
/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */
|
||||||
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);
|
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);
|
||||||
|
|
||||||
/* Render a cJSON entity to text for transfer/storage. */
|
/* Render a cJSON entity to text for transfer/storage. */
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ if(ENABLE_CJSON_TEST)
|
|||||||
message(WARNING "Valgrind couldn't be found.")
|
message(WARNING "Valgrind couldn't be found.")
|
||||||
unset(MEMORYCHECK_COMMAND)
|
unset(MEMORYCHECK_COMMAND)
|
||||||
else()
|
else()
|
||||||
set(MEMORYCHECK_COMMAND_OPTIONS --trace-children=yes --leak-check=full --error-exitcode=1)
|
set(MEMORYCHECK_COMMAND_OPTIONS --trace-children=yes --leak-check=full --error-exitcode=1 --suppressions=${CMAKE_CURRENT_SOURCE_DIR}/../valgrind.supp)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ static void file_test6_should_not_be_parsed(void)
|
|||||||
tree = cJSON_Parse(test6);
|
tree = cJSON_Parse(test6);
|
||||||
TEST_ASSERT_NULL_MESSAGE(tree, "Should fail to parse what is not JSON.");
|
TEST_ASSERT_NULL_MESSAGE(tree, "Should fail to parse what is not JSON.");
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_STRING_MESSAGE(test6, cJSON_GetErrorPtr(), "Error pointer is incorrect.");
|
TEST_ASSERT_EQUAL_PTR_MESSAGE(test6, cJSON_GetErrorPtr(), "Error pointer is incorrect.");
|
||||||
|
|
||||||
if (test6 != NULL)
|
if (test6 != NULL)
|
||||||
{
|
{
|
||||||
@@ -179,6 +179,22 @@ static void file_test11_should_be_parsed_and_printed(void)
|
|||||||
do_test("test11");
|
do_test("test11");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test12_should_not_be_parsed(void)
|
||||||
|
{
|
||||||
|
const char *test12 = "{ \"name\": ";
|
||||||
|
cJSON *tree = NULL;
|
||||||
|
|
||||||
|
tree = cJSON_Parse(test12);
|
||||||
|
TEST_ASSERT_NULL_MESSAGE(tree, "Should fail to parse incomplete JSON.");
|
||||||
|
|
||||||
|
TEST_ASSERT_EQUAL_PTR_MESSAGE(test12 + strlen(test12), cJSON_GetErrorPtr(), "Error pointer is incorrect.");
|
||||||
|
|
||||||
|
if (tree != NULL)
|
||||||
|
{
|
||||||
|
cJSON_Delete(tree);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
UNITY_BEGIN();
|
UNITY_BEGIN();
|
||||||
@@ -193,5 +209,6 @@ int main(void)
|
|||||||
RUN_TEST(file_test9_should_be_parsed_and_printed);
|
RUN_TEST(file_test9_should_be_parsed_and_printed);
|
||||||
RUN_TEST(file_test10_should_be_parsed_and_printed);
|
RUN_TEST(file_test10_should_be_parsed_and_printed);
|
||||||
RUN_TEST(file_test11_should_be_parsed_and_printed);
|
RUN_TEST(file_test11_should_be_parsed_and_printed);
|
||||||
|
RUN_TEST(test12_should_not_be_parsed);
|
||||||
return UNITY_END();
|
return UNITY_END();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,11 +40,23 @@ static void parse_with_opts_should_handle_empty_strings(void)
|
|||||||
{
|
{
|
||||||
const char empty_string[] = "";
|
const char empty_string[] = "";
|
||||||
const char *error_pointer = NULL;
|
const char *error_pointer = NULL;
|
||||||
|
|
||||||
TEST_ASSERT_NULL(cJSON_ParseWithOpts(empty_string, NULL, false));
|
TEST_ASSERT_NULL(cJSON_ParseWithOpts(empty_string, NULL, false));
|
||||||
error_pointer = cJSON_GetErrorPtr();
|
TEST_ASSERT_EQUAL_PTR(empty_string, cJSON_GetErrorPtr());
|
||||||
TEST_ASSERT_EQUAL_INT(0, error_pointer - empty_string);
|
|
||||||
TEST_ASSERT_NULL(cJSON_ParseWithOpts(empty_string, &error_pointer, false));
|
TEST_ASSERT_NULL(cJSON_ParseWithOpts(empty_string, &error_pointer, false));
|
||||||
TEST_ASSERT_EQUAL_INT(0, error_pointer - empty_string);
|
TEST_ASSERT_EQUAL_PTR(empty_string, error_pointer);
|
||||||
|
TEST_ASSERT_EQUAL_PTR(empty_string, cJSON_GetErrorPtr());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void parse_with_opts_should_handle_incomplete_json(void)
|
||||||
|
{
|
||||||
|
const char json[] = "{ \"name\": ";
|
||||||
|
const char *parse_end = NULL;
|
||||||
|
|
||||||
|
TEST_ASSERT_NULL(cJSON_ParseWithOpts(json, &parse_end, false));
|
||||||
|
TEST_ASSERT_EQUAL_PTR(json + strlen(json), parse_end);
|
||||||
|
TEST_ASSERT_EQUAL_PTR(json + strlen(json), cJSON_GetErrorPtr());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void parse_with_opts_should_require_null_if_requested(void)
|
static void parse_with_opts_should_require_null_if_requested(void)
|
||||||
@@ -65,7 +77,7 @@ static void parse_with_opts_should_return_parse_end(void)
|
|||||||
|
|
||||||
cJSON *item = cJSON_ParseWithOpts(json, &parse_end, false);
|
cJSON *item = cJSON_ParseWithOpts(json, &parse_end, false);
|
||||||
TEST_ASSERT_NOT_NULL(item);
|
TEST_ASSERT_NOT_NULL(item);
|
||||||
TEST_ASSERT_EQUAL_INT(2, parse_end - json);
|
TEST_ASSERT_EQUAL_PTR(json + 2, parse_end);
|
||||||
cJSON_Delete(item);
|
cJSON_Delete(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,6 +87,7 @@ int main(void)
|
|||||||
|
|
||||||
RUN_TEST(parse_with_opts_should_handle_null);
|
RUN_TEST(parse_with_opts_should_handle_null);
|
||||||
RUN_TEST(parse_with_opts_should_handle_empty_strings);
|
RUN_TEST(parse_with_opts_should_handle_empty_strings);
|
||||||
|
RUN_TEST(parse_with_opts_should_handle_incomplete_json);
|
||||||
RUN_TEST(parse_with_opts_should_require_null_if_requested);
|
RUN_TEST(parse_with_opts_should_require_null_if_requested);
|
||||||
RUN_TEST(parse_with_opts_should_return_parse_end);
|
RUN_TEST(parse_with_opts_should_return_parse_end);
|
||||||
|
|
||||||
|
|||||||
6
valgrind.supp
Normal file
6
valgrind.supp
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
suppress_ld_on_armv7
|
||||||
|
Memcheck:Cond
|
||||||
|
...
|
||||||
|
obj:*/ld-*.so
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user