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
|
||||
=====
|
||||
Fixes:
|
||||
|
||||
@@ -7,7 +7,7 @@ project(cJSON C)
|
||||
|
||||
set(PROJECT_VERSION_MAJOR 1)
|
||||
set(PROJECT_VERSION_MINOR 5)
|
||||
set(PROJECT_VERSION_PATCH 7)
|
||||
set(PROJECT_VERSION_PATCH 9)
|
||||
set(CJSON_VERSION_SO 1)
|
||||
set(CJSON_UTILS_VERSION_SO 1)
|
||||
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
|
||||
|
||||
@@ -30,6 +30,7 @@ Contributors
|
||||
* [Pawel Winogrodzki](https://github.com/PawelWMS)
|
||||
* [prefetchnta](https://github.com/prefetchnta)
|
||||
* [Rafael Leal Dias](https://github.com/rafaeldias)
|
||||
* [Robin Mallinson](https://github.com/rmallins)
|
||||
* [Rod Vagg](https://github.com/rvagg)
|
||||
* [Roland Meertens](https://github.com/rmeertens)
|
||||
* [Romain Porte](https://github.com/MicroJoe)
|
||||
|
||||
7
Makefile
7
Makefile
@@ -8,7 +8,7 @@ CJSON_TEST_SRC = cJSON.c test.c
|
||||
|
||||
LDLIBS = -lm
|
||||
|
||||
LIBVERSION = 1.5.7
|
||||
LIBVERSION = 1.5.9
|
||||
CJSON_SOVERSION = 1
|
||||
UTILS_SOVERSION = 1
|
||||
|
||||
@@ -66,11 +66,10 @@ shared: $(CJSON_SHARED) $(UTILS_SHARED)
|
||||
|
||||
static: $(CJSON_STATIC) $(UTILS_STATIC)
|
||||
|
||||
tests: $(CJSON_TEST) $(UTILS_TEST)
|
||||
tests: $(CJSON_TEST)
|
||||
|
||||
test: tests
|
||||
./$(CJSON_TEST)
|
||||
./$(UTILS_TEST)
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(R_CFLAGS) $<
|
||||
@@ -150,4 +149,4 @@ clean:
|
||||
$(RM) $(CJSON_OBJ) $(UTILS_OBJ) #delete object files
|
||||
$(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) $(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 */
|
||||
#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.
|
||||
#endif
|
||||
|
||||
@@ -1006,10 +1006,8 @@ fail:
|
||||
{
|
||||
*return_parse_end = (const char*)local_error.json + local_error.position;
|
||||
}
|
||||
else
|
||||
{
|
||||
global_error = local_error;
|
||||
}
|
||||
|
||||
global_error = local_error;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
||||
4
cJSON.h
4
cJSON.h
@@ -31,7 +31,7 @@ extern "C"
|
||||
/* project version */
|
||||
#define CJSON_VERSION_MAJOR 1
|
||||
#define CJSON_VERSION_MINOR 5
|
||||
#define CJSON_VERSION_PATCH 7
|
||||
#define CJSON_VERSION_PATCH 9
|
||||
|
||||
#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. */
|
||||
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. */
|
||||
/* 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);
|
||||
|
||||
/* Render a cJSON entity to text for transfer/storage. */
|
||||
|
||||
@@ -58,7 +58,7 @@ if(ENABLE_CJSON_TEST)
|
||||
message(WARNING "Valgrind couldn't be found.")
|
||||
unset(MEMORYCHECK_COMMAND)
|
||||
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()
|
||||
|
||||
|
||||
@@ -142,7 +142,7 @@ static void file_test6_should_not_be_parsed(void)
|
||||
tree = cJSON_Parse(test6);
|
||||
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)
|
||||
{
|
||||
@@ -179,6 +179,22 @@ static void file_test11_should_be_parsed_and_printed(void)
|
||||
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)
|
||||
{
|
||||
UNITY_BEGIN();
|
||||
@@ -193,5 +209,6 @@ int main(void)
|
||||
RUN_TEST(file_test9_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(test12_should_not_be_parsed);
|
||||
return UNITY_END();
|
||||
}
|
||||
|
||||
@@ -40,11 +40,23 @@ static void parse_with_opts_should_handle_empty_strings(void)
|
||||
{
|
||||
const char empty_string[] = "";
|
||||
const char *error_pointer = NULL;
|
||||
|
||||
TEST_ASSERT_NULL(cJSON_ParseWithOpts(empty_string, NULL, false));
|
||||
error_pointer = cJSON_GetErrorPtr();
|
||||
TEST_ASSERT_EQUAL_INT(0, error_pointer - empty_string);
|
||||
TEST_ASSERT_EQUAL_PTR(empty_string, cJSON_GetErrorPtr());
|
||||
|
||||
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)
|
||||
@@ -65,7 +77,7 @@ static void parse_with_opts_should_return_parse_end(void)
|
||||
|
||||
cJSON *item = cJSON_ParseWithOpts(json, &parse_end, false);
|
||||
TEST_ASSERT_NOT_NULL(item);
|
||||
TEST_ASSERT_EQUAL_INT(2, parse_end - json);
|
||||
TEST_ASSERT_EQUAL_PTR(json + 2, parse_end);
|
||||
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_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_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