From eaa90a6b74494c64526cb29f54429672241b7707 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 28 Nov 2017 02:02:55 +0100 Subject: [PATCH] Add cJSON_CreateStringReference --- cJSON.c | 12 ++++++++++++ cJSON.h | 4 ++++ tests/misc_tests.c | 11 +++++++++++ 3 files changed, 27 insertions(+) diff --git a/cJSON.c b/cJSON.c index 8ad32e2..befa6a7 100644 --- a/cJSON.c +++ b/cJSON.c @@ -2198,6 +2198,18 @@ CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string) return item; } +CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item != NULL) + { + item->type = cJSON_String | cJSON_IsReference; + item->valuestring = cast_away_const_from_string(string); + } + + return item; +} + CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw) { cJSON *item = cJSON_New_Item(&global_hooks); diff --git a/cJSON.h b/cJSON.h index c865000..c1ba032 100644 --- a/cJSON.h +++ b/cJSON.h @@ -192,6 +192,10 @@ CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw); CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void); CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void); +/* Create a string where valuestring references a string so + * it will not be freed by cJSON_Delete */ +CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string); + /* These utilities create an Array of count items. */ CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count); CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count); diff --git a/tests/misc_tests.c b/tests/misc_tests.c index af0cc7f..1b09a87 100644 --- a/tests/misc_tests.c +++ b/tests/misc_tests.c @@ -463,6 +463,16 @@ static void cjson_get_string_value_should_get_a_string(void) cJSON_Delete(string); } +static void cjson_create_string_reference_should_create_a_string_reference(void) { + const char *string = "I am a string!"; + + cJSON *string_reference = cJSON_CreateStringReference(string); + TEST_ASSERT_TRUE(string_reference->valuestring == string); + TEST_ASSERT_EQUAL_INT(cJSON_IsReference | cJSON_String, string_reference->type); + + cJSON_Delete(string_reference); +} + int main(void) { UNITY_BEGIN(); @@ -482,6 +492,7 @@ int main(void) RUN_TEST(skip_utf8_bom_should_skip_bom); RUN_TEST(skip_utf8_bom_should_not_skip_bom_if_not_at_beginning); RUN_TEST(cjson_get_string_value_should_get_a_string); + RUN_TEST(cjson_create_string_reference_should_create_a_string_reference); return UNITY_END(); }