From 11131b9ced29a754bac88cbed6a911daff4e2ffa Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 21 Mar 2017 20:18:03 +0100 Subject: [PATCH 001/126] cJSON_ParseWithOptions: Improve variable names and intent --- cJSON.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cJSON.c b/cJSON.c index fca22c67..cf276fce 100644 --- a/cJSON.c +++ b/cJSON.c @@ -903,19 +903,19 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return { const unsigned char *end = NULL; /* use global error pointer if no specific one was given */ - const unsigned char **ep = return_parse_end ? (const unsigned char**)return_parse_end : &global_ep; - cJSON *c = cJSON_New_Item(&global_hooks); - *ep = NULL; - if (!c) /* memory fail */ + const unsigned char **error_pointer = (return_parse_end != NULL) ? (const unsigned char**)return_parse_end : &global_ep; + cJSON *item = cJSON_New_Item(&global_hooks); + *error_pointer = NULL; + if (item == NULL) /* memory fail */ { return NULL; } - end = parse_value(c, skip_whitespace((const unsigned char*)value), ep, &global_hooks); - if (!end) + end = parse_value(item, skip_whitespace((const unsigned char*)value), error_pointer, &global_hooks); + if (end == NULL) { /* parse failure. ep is set. */ - cJSON_Delete(c); + cJSON_Delete(item); return NULL; } @@ -923,10 +923,10 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return if (require_null_terminated) { end = skip_whitespace(end); - if (*end) + if (*end != '\0') { - cJSON_Delete(c); - *ep = end; + cJSON_Delete(item); + *error_pointer = end; return NULL; } } @@ -935,7 +935,7 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return *return_parse_end = (const char*)end; } - return c; + return item; } /* Default options for cJSON_Parse */ From 06a2326e3b5389d0908a64d910aea581cd7444fb Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 21 Mar 2017 20:25:10 +0100 Subject: [PATCH 002/126] cJSON_ParseWithOpts: Use goto fail --- cJSON.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/cJSON.c b/cJSON.c index cf276fce..a64f835e 100644 --- a/cJSON.c +++ b/cJSON.c @@ -904,19 +904,26 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return const unsigned char *end = NULL; /* use global error pointer if no specific one was given */ const unsigned char **error_pointer = (return_parse_end != NULL) ? (const unsigned char**)return_parse_end : &global_ep; - cJSON *item = cJSON_New_Item(&global_hooks); + cJSON *item = NULL; + *error_pointer = NULL; + + item = cJSON_New_Item(&global_hooks); if (item == NULL) /* memory fail */ { - return NULL; + goto fail; + } + + if (value == NULL) + { + goto fail; } end = parse_value(item, skip_whitespace((const unsigned char*)value), error_pointer, &global_hooks); if (end == NULL) { /* parse failure. ep is set. */ - cJSON_Delete(item); - return NULL; + goto fail; } /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ @@ -925,9 +932,8 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return end = skip_whitespace(end); if (*end != '\0') { - cJSON_Delete(item); *error_pointer = end; - return NULL; + goto fail; } } if (return_parse_end) @@ -936,6 +942,14 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return } return item; + +fail: + if (item != NULL) + { + cJSON_Delete(item); + } + + return NULL; } /* Default options for cJSON_Parse */ From 0f98214e71604c685312e7afc2d5e01921326edf Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 14 Mar 2017 10:08:33 +0100 Subject: [PATCH 003/126] parsebuffer: type and macros --- cJSON.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cJSON.c b/cJSON.c index a64f835e..b57efe96 100644 --- a/cJSON.c +++ b/cJSON.c @@ -185,6 +185,22 @@ static unsigned char get_decimal_point(void) return (unsigned char) lconv->decimal_point[0]; } +typedef struct +{ + const unsigned char *content; + size_t length; + size_t offset; +} parse_buffer; + +/* check if the given size is left to read in a given parse buffer (starting with 1) */ +#define can_read(buffer, size) ((buffer != NULL) && (((buffer)->offset + size) <= (buffer)->length)) +#define cannot_read(buffer, size) (!can_read(buffer, size)) +/* check if the buffer can be accessed at the given index (starting with 0) */ +#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length)) +#define cannot_access_at_index(buffer, index) (!can_access_at_index(buffer, index)) +/* get a pointer to the buffer at the position */ +#define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset) + /* Parse the input text to generate a number, and populate the result into item. */ static const unsigned char *parse_number(cJSON * const item, const unsigned char * const input) { From fd0320cf54ec62ce2cc9bdb154a016371da946c8 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 14 Mar 2017 10:15:57 +0100 Subject: [PATCH 004/126] parse_value: Use parse_buffer --- cJSON.c | 85 ++++++++++++++++++++++++++++++++++----------- tests/parse_value.c | 6 +++- tests/print_value.c | 7 +++- 3 files changed, 75 insertions(+), 23 deletions(-) diff --git a/cJSON.c b/cJSON.c index b57efe96..400821a6 100644 --- a/cJSON.c +++ b/cJSON.c @@ -896,7 +896,7 @@ static cJSON_bool print_string(const cJSON * const item, printbuffer * const p, } /* Predeclare these prototypes. */ -static const unsigned char *parse_value(cJSON * const item, const unsigned char * const input, const unsigned char ** const ep, const internal_hooks * const hooks); +static const unsigned char *parse_value(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const ep, const internal_hooks * const hooks); static cJSON_bool print_value(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); static const unsigned char *parse_array(cJSON * const item, const unsigned char *input, const unsigned char ** const ep, const internal_hooks * const hooks); static cJSON_bool print_array(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); @@ -914,9 +914,25 @@ static const unsigned char *skip_whitespace(const unsigned char *in) return in; } +static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) +{ + const unsigned char *skipped_pointer = NULL; + + if ((buffer == NULL) || (buffer->content == NULL)) + { + return NULL; + } + + skipped_pointer = skip_whitespace(buffer_at_offset(buffer)); + buffer->offset = (size_t)(skipped_pointer - buffer->content); + + return buffer; +} + /* Parse an object - create a new root, and populate. */ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) { + parse_buffer buffer; const unsigned char *end = NULL; /* use global error pointer if no specific one was given */ const unsigned char **error_pointer = (return_parse_end != NULL) ? (const unsigned char**)return_parse_end : &global_ep; @@ -935,7 +951,11 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return goto fail; } - end = parse_value(item, skip_whitespace((const unsigned char*)value), error_pointer, &global_hooks); + buffer.content = (const unsigned char*)value; + buffer.length = strlen((const char*)value) + sizeof(""); + buffer.offset = 0; + + end = parse_value(item, buffer_skip_whitespace(&buffer), error_pointer, &global_hooks); if (end == NULL) { /* parse failure. ep is set. */ @@ -1080,56 +1100,71 @@ CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const i } /* Parser core - when encountering text, process appropriately. */ -static const unsigned char *parse_value(cJSON * const item, const unsigned char * const input, const unsigned char ** const error_pointer, const internal_hooks * const hooks) +static const unsigned char *parse_value(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) { - if (input == NULL) + if ((input_buffer == NULL) || (input_buffer->content == NULL)) { return NULL; /* no input */ } /* parse the different types of values */ /* null */ - if (!strncmp((const char*)input, "null", 4)) + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0)) { item->type = cJSON_NULL; - return input + 4; + input_buffer->offset += 4; + return buffer_at_offset(input_buffer); } /* false */ - if (!strncmp((const char*)input, "false", 5)) + if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0)) { item->type = cJSON_False; - return input + 5; + input_buffer->offset += 5; + return buffer_at_offset(input_buffer); } /* true */ - if (!strncmp((const char*)input, "true", 4)) + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0)) { item->type = cJSON_True; item->valueint = 1; - return input + 4; + input_buffer->offset += 4; + return buffer_at_offset(input_buffer); } /* string */ - if (*input == '\"') + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) { - return parse_string(item, input, error_pointer, hooks); + return parse_string(item, buffer_at_offset(input_buffer), error_pointer, hooks); } /* number */ - if ((*input == '-') || ((*input >= '0') && (*input <= '9'))) + if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) { - return parse_number(item, input); + return parse_number(item, buffer_at_offset(input_buffer)); } /* array */ - if (*input == '[') + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) { - return parse_array(item, input, error_pointer, hooks); + return parse_array(item, buffer_at_offset(input_buffer), error_pointer, hooks); } /* object */ - if (*input == '{') + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) { - return parse_object(item, input, error_pointer, hooks); + return parse_object(item, buffer_at_offset(input_buffer), error_pointer, hooks); } /* failure. */ - *error_pointer = input; + if (can_access_at_index(input_buffer, 0)) + { + *error_pointer = buffer_at_offset(input_buffer); + } + else if (input_buffer->length > 0) + { + *error_pointer = input_buffer->content + input_buffer->length - 1; + } + else + { + *error_pointer = input_buffer->content; + } + return NULL; } @@ -1216,6 +1251,7 @@ static const unsigned char *parse_array(cJSON * const item, const unsigned char { cJSON *head = NULL; /* head of the linked list */ cJSON *current_item = NULL; + parse_buffer input_buffer; if (*input != '[') { @@ -1259,7 +1295,10 @@ static const unsigned char *parse_array(cJSON * const item, const unsigned char /* parse next value */ input = skip_whitespace(input + 1); - input = parse_value(current_item, input, error_pointer, hooks); + input_buffer.content = (const unsigned char*)input; + input_buffer.offset = 0; + input_buffer.length = strlen((const char*)input) + sizeof(""); + input = parse_value(current_item, &input_buffer, error_pointer, hooks); input = skip_whitespace(input); if (input == NULL) { @@ -1354,6 +1393,7 @@ static const unsigned char *parse_object(cJSON * const item, const unsigned char { cJSON *head = NULL; /* linked list head */ cJSON *current_item = NULL; + parse_buffer input_buffer; if (*input != '{') { @@ -1414,7 +1454,10 @@ static const unsigned char *parse_object(cJSON * const item, const unsigned char /* parse the value */ input = skip_whitespace(input + 1); - input = parse_value(current_item, input, error_pointer, hooks); + input_buffer.content = (const unsigned char*)input; + input_buffer.offset = 0; + input_buffer.length = strlen((const char*)input) + sizeof(""); + input = parse_value(current_item, &input_buffer, error_pointer, hooks); input = skip_whitespace(input); if (input == NULL) { diff --git a/tests/parse_value.c b/tests/parse_value.c index 9db967f2..3c518822 100644 --- a/tests/parse_value.c +++ b/tests/parse_value.c @@ -44,7 +44,11 @@ static void assert_is_value(cJSON *value_item, int type) static void assert_parse_value(const char *string, int type) { - TEST_ASSERT_NOT_NULL(parse_value(item, (const unsigned char*)string, &error_pointer, &global_hooks)); + parse_buffer buffer; + buffer.content = (const unsigned char*) string; + buffer.length = strlen(string) + sizeof(""); + buffer.offset = 0; + TEST_ASSERT_NOT_NULL(parse_value(item, &buffer, &error_pointer, &global_hooks)); assert_is_value(item, type); } diff --git a/tests/print_value.c b/tests/print_value.c index 7e0f52fe..628b373b 100644 --- a/tests/print_value.c +++ b/tests/print_value.c @@ -34,14 +34,19 @@ static void assert_print_value(const char *input) const unsigned char *error_pointer = NULL; cJSON item[1]; printbuffer buffer; + parse_buffer parsebuffer; buffer.buffer = printed; buffer.length = sizeof(printed); buffer.offset = 0; buffer.noalloc = true; + parsebuffer.content = (const unsigned char*)input; + parsebuffer.length = strlen(input) + sizeof(""); + parsebuffer.offset = 0; + memset(item, 0, sizeof(item)); - TEST_ASSERT_NOT_NULL_MESSAGE(parse_value(item, (const unsigned char*)input, &error_pointer, &global_hooks), "Failed to parse value."); + TEST_ASSERT_NOT_NULL_MESSAGE(parse_value(item, &parsebuffer, &error_pointer, &global_hooks), "Failed to parse value."); TEST_ASSERT_TRUE_MESSAGE(print_value(item, 0, false, &buffer, &global_hooks), "Failed to print value."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, buffer.buffer, "Printed value is not as expected."); From 033a5425323fb9ea7921cfc0a01c78c465e51368 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 14 Mar 2017 10:27:57 +0100 Subject: [PATCH 005/126] parse_array: Use parsebuffer --- cJSON.c | 88 +++++++++++++++++++++++++++++++-------------- tests/parse_array.c | 14 ++++++-- tests/print_array.c | 7 +++- 3 files changed, 79 insertions(+), 30 deletions(-) diff --git a/cJSON.c b/cJSON.c index 400821a6..a839c429 100644 --- a/cJSON.c +++ b/cJSON.c @@ -898,7 +898,7 @@ static cJSON_bool print_string(const cJSON * const item, printbuffer * const p, /* Predeclare these prototypes. */ static const unsigned char *parse_value(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const ep, const internal_hooks * const hooks); static cJSON_bool print_value(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); -static const unsigned char *parse_array(cJSON * const item, const unsigned char *input, const unsigned char ** const ep, const internal_hooks * const hooks); +static const unsigned char *parse_array(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const ep, const internal_hooks * const hooks); static cJSON_bool print_array(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); static const unsigned char *parse_object(cJSON * const item, const unsigned char *input, const unsigned char ** const ep, const internal_hooks * const hooks); static cJSON_bool print_object(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); @@ -916,15 +916,20 @@ static const unsigned char *skip_whitespace(const unsigned char *in) static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) { - const unsigned char *skipped_pointer = NULL; - if ((buffer == NULL) || (buffer->content == NULL)) { return NULL; } - skipped_pointer = skip_whitespace(buffer_at_offset(buffer)); - buffer->offset = (size_t)(skipped_pointer - buffer->content); + while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32)) + { + buffer->offset++; + } + + if (buffer->offset == buffer->length) + { + buffer->offset--; + } return buffer; } @@ -1102,6 +1107,7 @@ CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const i /* Parser core - when encountering text, process appropriately. */ static const unsigned char *parse_value(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) { + const unsigned char *content_pointer = NULL; if ((input_buffer == NULL) || (input_buffer->content == NULL)) { return NULL; /* no input */ @@ -1133,22 +1139,43 @@ static const unsigned char *parse_value(cJSON * const item, parse_buffer * cons /* string */ if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) { - return parse_string(item, buffer_at_offset(input_buffer), error_pointer, hooks); + content_pointer = parse_string(item, buffer_at_offset(input_buffer), error_pointer, hooks); + if (content_pointer == NULL) + { + return NULL; + } + + input_buffer->offset = (size_t)(content_pointer - input_buffer->content); + return buffer_at_offset(input_buffer); } /* number */ if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) { - return parse_number(item, buffer_at_offset(input_buffer)); + content_pointer = parse_number(item, buffer_at_offset(input_buffer)); + if (content_pointer == NULL) + { + return NULL; + } + + input_buffer->offset = (size_t)(content_pointer - input_buffer->content); + return buffer_at_offset(input_buffer); } /* array */ if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) { - return parse_array(item, buffer_at_offset(input_buffer), error_pointer, hooks); + return parse_array(item, input_buffer, error_pointer, hooks); } /* object */ if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) { - return parse_object(item, buffer_at_offset(input_buffer), error_pointer, hooks); + content_pointer = parse_object(item, buffer_at_offset(input_buffer), error_pointer, hooks); + if (content_pointer == NULL) + { + return NULL; + } + + input_buffer->offset = (size_t)(content_pointer - input_buffer->content); + return buffer_at_offset(input_buffer); } /* failure. */ @@ -1247,28 +1274,36 @@ static cJSON_bool print_value(const cJSON * const item, const size_t depth, cons } /* Build an array from input text. */ -static const unsigned char *parse_array(cJSON * const item, const unsigned char *input, const unsigned char ** const error_pointer, const internal_hooks * const hooks) +static const unsigned char *parse_array(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) { cJSON *head = NULL; /* head of the linked list */ cJSON *current_item = NULL; - parse_buffer input_buffer; - if (*input != '[') + if (buffer_at_offset(input_buffer)[0] != '[') { /* not an array */ - *error_pointer = input; + *error_pointer = buffer_at_offset(input_buffer); goto fail; } - input = skip_whitespace(input + 1); - if (*input == ']') + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']')) { /* empty array */ goto success; } + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + *error_pointer = buffer_at_offset(input_buffer); + goto fail; + } + /* step back to character in front of the first element */ - input--; + input_buffer->offset--; /* loop through the comma separated array elements */ do { @@ -1294,22 +1329,19 @@ static const unsigned char *parse_array(cJSON * const item, const unsigned char } /* parse next value */ - input = skip_whitespace(input + 1); - input_buffer.content = (const unsigned char*)input; - input_buffer.offset = 0; - input_buffer.length = strlen((const char*)input) + sizeof(""); - input = parse_value(current_item, &input_buffer, error_pointer, hooks); - input = skip_whitespace(input); - if (input == NULL) + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (parse_value(current_item, input_buffer, error_pointer, hooks) == NULL) { goto fail; /* failed to parse value */ } + buffer_skip_whitespace(input_buffer); } - while (*input == ','); + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); - if (*input != ']') + if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']') { - *error_pointer = input; + *error_pointer = buffer_at_offset(input_buffer); goto fail; /* expected end of array */ } @@ -1317,7 +1349,9 @@ static const unsigned char *parse_array(cJSON * const item, const unsigned char item->type = cJSON_Array; item->child = head; - return input + 1; + input_buffer->offset++; + + return buffer_at_offset(input_buffer); fail: if (head != NULL) diff --git a/tests/parse_array.c b/tests/parse_array.c index 47dd44f8..c35f5ffb 100644 --- a/tests/parse_array.c +++ b/tests/parse_array.c @@ -46,13 +46,23 @@ static void assert_is_array(cJSON *array_item) static void assert_not_array(const char *json) { - TEST_ASSERT_NULL(parse_array(item, (const unsigned char*)json, &error_pointer, &global_hooks)); + parse_buffer buffer; + buffer.content = (const unsigned char*)json; + buffer.length = strlen(json) + sizeof(""); + buffer.offset = 0; + + TEST_ASSERT_NULL(parse_array(item, &buffer, &error_pointer, &global_hooks)); assert_is_invalid(item); } static void assert_parse_array(const char *json) { - TEST_ASSERT_NOT_NULL(parse_array(item, (const unsigned char*)json, &error_pointer, &global_hooks)); + parse_buffer buffer; + buffer.content = (const unsigned char*)json; + buffer.length = strlen(json) + sizeof(""); + buffer.offset = 0; + + TEST_ASSERT_NOT_NULL(parse_array(item, &buffer, &error_pointer, &global_hooks)); assert_is_array(item); } diff --git a/tests/print_array.c b/tests/print_array.c index df32be67..128a1062 100644 --- a/tests/print_array.c +++ b/tests/print_array.c @@ -35,6 +35,11 @@ static void assert_print_array(const char * const expected, const char * const i printbuffer formatted_buffer; printbuffer unformatted_buffer; + parse_buffer parsebuffer; + parsebuffer.content = (const unsigned char*)input; + parsebuffer.length = strlen(input) + sizeof(""); + parsebuffer.offset = 0; + /* buffer for formatted printing */ formatted_buffer.buffer = printed_formatted; formatted_buffer.length = sizeof(printed_formatted); @@ -48,7 +53,7 @@ static void assert_print_array(const char * const expected, const char * const i unformatted_buffer.noalloc = true; memset(item, 0, sizeof(item)); - TEST_ASSERT_NOT_NULL_MESSAGE(parse_array(item, (const unsigned char*)input, &error_pointer, &global_hooks), "Failed to parse array."); + TEST_ASSERT_NOT_NULL_MESSAGE(parse_array(item, &parsebuffer, &error_pointer, &global_hooks), "Failed to parse array."); TEST_ASSERT_TRUE_MESSAGE(print_array(item, 0, false, &unformatted_buffer, &global_hooks), "Failed to print unformatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, printed_unformatted, "Unformatted array is not correct."); From fef1c45b92d6b3837328b6933af7363f00e73939 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 14 Mar 2017 10:39:38 +0100 Subject: [PATCH 006/126] parse_object: Use parse_buffer --- cJSON.c | 61 +++++++++++++++++++++++++------------------- tests/parse_object.c | 14 ++++++++-- tests/print_object.c | 8 +++++- 3 files changed, 54 insertions(+), 29 deletions(-) diff --git a/cJSON.c b/cJSON.c index a839c429..c81fd7d2 100644 --- a/cJSON.c +++ b/cJSON.c @@ -900,7 +900,7 @@ static const unsigned char *parse_value(cJSON * const item, parse_buffer * const static cJSON_bool print_value(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); static const unsigned char *parse_array(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const ep, const internal_hooks * const hooks); static cJSON_bool print_array(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); -static const unsigned char *parse_object(cJSON * const item, const unsigned char *input, const unsigned char ** const ep, const internal_hooks * const hooks); +static const unsigned char *parse_object(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const ep, const internal_hooks * const hooks); static cJSON_bool print_object(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); /* Utility to jump whitespace and cr/lf */ @@ -1168,7 +1168,7 @@ static const unsigned char *parse_value(cJSON * const item, parse_buffer * cons /* object */ if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) { - content_pointer = parse_object(item, buffer_at_offset(input_buffer), error_pointer, hooks); + content_pointer = parse_object(item, input_buffer, error_pointer, hooks); if (content_pointer == NULL) { return NULL; @@ -1423,26 +1423,35 @@ static cJSON_bool print_array(const cJSON * const item, const size_t depth, cons } /* Build an object from the text. */ -static const unsigned char *parse_object(cJSON * const item, const unsigned char *input, const unsigned char ** const error_pointer, const internal_hooks * const hooks) +static const unsigned char *parse_object(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) { cJSON *head = NULL; /* linked list head */ cJSON *current_item = NULL; - parse_buffer input_buffer; + const unsigned char *content_pointer = NULL; - if (*input != '{') + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) { - *error_pointer = input; + *error_pointer = buffer_at_offset(input_buffer); goto fail; /* not an object */ } - input = skip_whitespace(input + 1); - if (*input == '}') + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}')) { goto success; /* empty object */ } + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + *error_pointer = buffer_at_offset(input_buffer); + goto fail; + } + /* step back to character in front of the first element */ - input--; + input_buffer->offset--; /* loop through the comma separated array elements */ do { @@ -1468,41 +1477,40 @@ static const unsigned char *parse_object(cJSON * const item, const unsigned char } /* parse the name of the child */ - input = skip_whitespace(input + 1); - input = parse_string(current_item, input, error_pointer, hooks); - input = skip_whitespace(input); - if (input == NULL) + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + content_pointer = parse_string(current_item, buffer_at_offset(input_buffer), error_pointer, hooks); + if (content_pointer == NULL) { goto fail; /* faile to parse name */ } + input_buffer->offset = (size_t)(content_pointer - input_buffer->content); + buffer_skip_whitespace(input_buffer); /* swap valuestring and string, because we parsed the name */ current_item->string = current_item->valuestring; current_item->valuestring = NULL; - if (*input != ':') + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':')) { - *error_pointer = input; + *error_pointer = buffer_at_offset(input_buffer); goto fail; /* invalid object */ } /* parse the value */ - input = skip_whitespace(input + 1); - input_buffer.content = (const unsigned char*)input; - input_buffer.offset = 0; - input_buffer.length = strlen((const char*)input) + sizeof(""); - input = parse_value(current_item, &input_buffer, error_pointer, hooks); - input = skip_whitespace(input); - if (input == NULL) + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (parse_value(current_item, input_buffer, error_pointer, hooks) == NULL) { goto fail; /* failed to parse value */ } + buffer_skip_whitespace(input_buffer); } - while (*input == ','); + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); - if (*input != '}') + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}')) { - *error_pointer = input; + *error_pointer = buffer_at_offset(input_buffer); goto fail; /* expected end of object */ } @@ -1510,7 +1518,8 @@ static const unsigned char *parse_object(cJSON * const item, const unsigned char item->type = cJSON_Object; item->child = head; - return input + 1; + input_buffer->offset++; + return buffer_at_offset(input_buffer); fail: if (head != NULL) diff --git a/tests/parse_object.c b/tests/parse_object.c index 0f8569cd..283de822 100644 --- a/tests/parse_object.c +++ b/tests/parse_object.c @@ -54,14 +54,24 @@ static void assert_is_child(cJSON *child_item, const char *name, int type) static void assert_not_object(const char *json) { - TEST_ASSERT_NULL(parse_object(item, (const unsigned char*)json, &error_pointer, &global_hooks)); + parse_buffer parsebuffer; + parsebuffer.content = (const unsigned char*)json; + parsebuffer.length = strlen(json) + sizeof(""); + parsebuffer.offset = 0; + + TEST_ASSERT_NULL(parse_object(item, &parsebuffer, &error_pointer, &global_hooks)); assert_is_invalid(item); reset(item); } static void assert_parse_object(const char *json) { - TEST_ASSERT_NOT_NULL(parse_object(item, (const unsigned char*)json, &error_pointer, &global_hooks)); + parse_buffer parsebuffer; + parsebuffer.content = (const unsigned char*)json; + parsebuffer.length = strlen(json) + sizeof(""); + parsebuffer.offset = 0; + + TEST_ASSERT_NOT_NULL(parse_object(item, &parsebuffer, &error_pointer, &global_hooks)); assert_is_object(item); } diff --git a/tests/print_object.c b/tests/print_object.c index f7f53444..53fe8f24 100644 --- a/tests/print_object.c +++ b/tests/print_object.c @@ -34,6 +34,12 @@ static void assert_print_object(const char * const expected, const char * const printbuffer formatted_buffer; printbuffer unformatted_buffer; + parse_buffer parsebuffer; + + /* buffer for parsing */ + parsebuffer.content = (const unsigned char*)input; + parsebuffer.length = strlen(input) + sizeof(""); + parsebuffer.offset = 0; /* buffer for formatted printing */ formatted_buffer.buffer = printed_formatted; @@ -48,7 +54,7 @@ static void assert_print_object(const char * const expected, const char * const unformatted_buffer.noalloc = true; memset(item, 0, sizeof(item)); - TEST_ASSERT_NOT_NULL_MESSAGE(parse_object(item, (const unsigned char*)input, &error_pointer, &global_hooks), "Failed to parse object."); + TEST_ASSERT_NOT_NULL_MESSAGE(parse_object(item, &parsebuffer, &error_pointer, &global_hooks), "Failed to parse object."); TEST_ASSERT_TRUE_MESSAGE(print_object(item, 0, false, &unformatted_buffer, &global_hooks), "Failed to print unformatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, printed_unformatted, "Unformatted object is not correct."); From f69b109c9faf6fba0dcbdda5d570e996b3a99ac2 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 14 Mar 2017 10:47:10 +0100 Subject: [PATCH 007/126] parse_number: Use parse_buffer --- cJSON.c | 25 ++++++++++--------------- tests/parse_number.c | 7 ++++++- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/cJSON.c b/cJSON.c index c81fd7d2..0568c052 100644 --- a/cJSON.c +++ b/cJSON.c @@ -202,7 +202,7 @@ typedef struct #define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset) /* Parse the input text to generate a number, and populate the result into item. */ -static const unsigned char *parse_number(cJSON * const item, const unsigned char * const input) +static const unsigned char *parse_number(cJSON * const item, parse_buffer * const input_buffer) { double number = 0; unsigned char *after_end = NULL; @@ -210,16 +210,17 @@ static const unsigned char *parse_number(cJSON * const item, const unsigned char unsigned char decimal_point = get_decimal_point(); size_t i = 0; - if (input == NULL) + if ((input_buffer == NULL) || (input_buffer->content == NULL)) { return NULL; } /* copy the number into a temporary buffer and replace '.' with the decimal point - * of the current locale (for strtod) */ - for (i = 0; (i < (sizeof(number_c_string) - 1)) && (input[i] != '\0'); i++) + * of the current locale (for strtod) + * This also takes care of '\0' not necessarily being available for marking the end of the input */ + for (i = 0; (i < (sizeof(number_c_string) - 1)) && can_access_at_index(input_buffer, i); i++) { - switch (input[i]) + switch (buffer_at_offset(input_buffer)[i]) { case '0': case '1': @@ -235,7 +236,7 @@ static const unsigned char *parse_number(cJSON * const item, const unsigned char case '-': case 'e': case 'E': - number_c_string[i] = input[i]; + number_c_string[i] = buffer_at_offset(input_buffer)[i]; break; case '.': @@ -273,7 +274,8 @@ static const unsigned char *parse_number(cJSON * const item, const unsigned char item->type = cJSON_Number; - return input + (after_end - number_c_string); + input_buffer->offset += (size_t)(after_end - number_c_string); + return buffer_at_offset(input_buffer); } /* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */ @@ -1151,14 +1153,7 @@ static const unsigned char *parse_value(cJSON * const item, parse_buffer * cons /* number */ if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) { - content_pointer = parse_number(item, buffer_at_offset(input_buffer)); - if (content_pointer == NULL) - { - return NULL; - } - - input_buffer->offset = (size_t)(content_pointer - input_buffer->content); - return buffer_at_offset(input_buffer); + return parse_number(item, input_buffer); } /* array */ if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) diff --git a/tests/parse_number.c b/tests/parse_number.c index 73f5538e..d89da147 100644 --- a/tests/parse_number.c +++ b/tests/parse_number.c @@ -45,7 +45,12 @@ static void assert_is_number(cJSON *number_item) static void assert_parse_number(const char *string, int integer, double real) { - TEST_ASSERT_NOT_NULL(parse_number(item, (const unsigned char*)string)); + parse_buffer buffer; + buffer.content = (const unsigned char*)string; + buffer.length = strlen(string) + sizeof(""); + buffer.offset = 0; + + TEST_ASSERT_NOT_NULL(parse_number(item, &buffer)); assert_is_number(item); TEST_ASSERT_EQUAL_INT(integer, item->valueint); TEST_ASSERT_EQUAL_DOUBLE(real, item->valuedouble); From 778a0c146f6f00f502ae49cbf39855f2a068df65 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 12 Mar 2017 21:44:28 +0100 Subject: [PATCH 008/126] parse_string: Use parsebuffer --- cJSON.c | 42 ++++++++++++++++++++---------------------- tests/parse_string.c | 20 ++++++++++++++++---- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/cJSON.c b/cJSON.c index 0568c052..3ccdac25 100644 --- a/cJSON.c +++ b/cJSON.c @@ -662,17 +662,17 @@ static unsigned char utf16_literal_to_utf8(const unsigned char * const input_poi } /* Parse the input text into an unescaped cinput, and populate item. */ -static const unsigned char *parse_string(cJSON * const item, const unsigned char * const input, const unsigned char ** const error_pointer, const internal_hooks * const hooks) +static const unsigned char *parse_string(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) { - const unsigned char *input_pointer = input + 1; - const unsigned char *input_end = input + 1; + const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1; + const unsigned char *input_end = buffer_at_offset(input_buffer) + 1; unsigned char *output_pointer = NULL; unsigned char *output = NULL; /* not a string */ - if (*input != '\"') + if (buffer_at_offset(input_buffer)[0] != '\"') { - *error_pointer = input; + *error_pointer = buffer_at_offset(input_buffer); goto fail; } @@ -680,12 +680,12 @@ static const unsigned char *parse_string(cJSON * const item, const unsigned char /* calculate approximate size of the output (overestimate) */ size_t allocation_length = 0; size_t skipped_bytes = 0; - while ((*input_end != '\"') && (*input_end != '\0')) + while ((*input_end != '\"') && ((size_t)(input_end - input_buffer->content) < input_buffer->length)) { /* is escape sequence */ if (input_end[0] == '\\') { - if (input_end[1] == '\0') + if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length) { /* prevent buffer overflow when last input character is a backslash */ goto fail; @@ -695,13 +695,13 @@ static const unsigned char *parse_string(cJSON * const item, const unsigned char } input_end++; } - if (*input_end == '\0') + if (*input_end != '\"') { goto fail; /* string ended unexpectedly */ } /* This is at most how much we need for the output */ - allocation_length = (size_t) (input_end - input) - skipped_bytes; + allocation_length = (size_t) (input_end - buffer_at_offset(input_buffer)) - skipped_bytes; output = (unsigned char*)hooks->allocate(allocation_length + sizeof("")); if (output == NULL) { @@ -721,6 +721,11 @@ static const unsigned char *parse_string(cJSON * const item, const unsigned char else { unsigned char sequence_length = 2; + if ((input_end - input_pointer) < 1) + { + goto fail; + } + switch (input_pointer[1]) { case 'b': @@ -768,7 +773,10 @@ static const unsigned char *parse_string(cJSON * const item, const unsigned char item->type = cJSON_String; item->valuestring = (char*)output; - return input_end + 1; + input_buffer->offset = (size_t) (input_end - input_buffer->content); + input_buffer->offset++; + + return buffer_at_offset(input_buffer); fail: if (output != NULL) @@ -1141,14 +1149,7 @@ static const unsigned char *parse_value(cJSON * const item, parse_buffer * cons /* string */ if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) { - content_pointer = parse_string(item, buffer_at_offset(input_buffer), error_pointer, hooks); - if (content_pointer == NULL) - { - return NULL; - } - - input_buffer->offset = (size_t)(content_pointer - input_buffer->content); - return buffer_at_offset(input_buffer); + return content_pointer = parse_string(item, input_buffer, error_pointer, hooks); } /* number */ if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) @@ -1422,7 +1423,6 @@ static const unsigned char *parse_object(cJSON * const item, parse_buffer * cons { cJSON *head = NULL; /* linked list head */ cJSON *current_item = NULL; - const unsigned char *content_pointer = NULL; if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) { @@ -1474,12 +1474,10 @@ static const unsigned char *parse_object(cJSON * const item, parse_buffer * cons /* parse the name of the child */ input_buffer->offset++; buffer_skip_whitespace(input_buffer); - content_pointer = parse_string(current_item, buffer_at_offset(input_buffer), error_pointer, hooks); - if (content_pointer == NULL) + if (parse_string(current_item, input_buffer, error_pointer, hooks) == NULL) { goto fail; /* faile to parse name */ } - input_buffer->offset = (size_t)(content_pointer - input_buffer->content); buffer_skip_whitespace(input_buffer); /* swap valuestring and string, because we parsed the name */ diff --git a/tests/parse_string.c b/tests/parse_string.c index f1352a00..97098440 100644 --- a/tests/parse_string.c +++ b/tests/parse_string.c @@ -47,16 +47,28 @@ static void assert_is_string(cJSON *string_item) static void assert_parse_string(const char *string, const char *expected) { - TEST_ASSERT_NOT_NULL_MESSAGE(parse_string(item, (const unsigned char*)string, &error_pointer, &global_hooks), "Couldn't parse string."); + parse_buffer buffer; + buffer.content = (const unsigned char*)string; + buffer.length = strlen(string) + sizeof(""); + buffer.offset = 0; + + TEST_ASSERT_NOT_NULL_MESSAGE(parse_string(item, &buffer, &error_pointer, &global_hooks), "Couldn't parse string."); assert_is_string(item); TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, item->valuestring, "The parsed result isn't as expected."); global_hooks.deallocate(item->valuestring); item->valuestring = NULL; } -#define assert_not_parse_string(string) \ - TEST_ASSERT_NULL_MESSAGE(parse_string(item, (const unsigned char*)string, &error_pointer, &global_hooks), "Malformed string should not be accepted");\ - assert_is_invalid(item) +static void assert_not_parse_string(const char * const string) +{ + parse_buffer buffer; + buffer.content = (const unsigned char*)string; + buffer.length = strlen(string) + sizeof(""); + buffer.offset = 0; + + TEST_ASSERT_NULL_MESSAGE(parse_string(item, &buffer, &error_pointer, &global_hooks), "Malformed string should not be accepted."); + assert_is_invalid(item); +} From c9739c59fd900e388e305e0eb1113664e97cbb74 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 14 Mar 2017 11:19:27 +0100 Subject: [PATCH 009/126] Replace strchr with switch case This should improve performance and improve readability. --- cJSON.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/cJSON.c b/cJSON.c index 3ccdac25..9acb77c9 100644 --- a/cJSON.c +++ b/cJSON.c @@ -818,15 +818,25 @@ static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffe /* set "flag" to 1 if something needs to be escaped */ for (input_pointer = input; *input_pointer; input_pointer++) { - if (strchr("\"\\\b\f\n\r\t", *input_pointer)) - { - /* one character escape sequence */ - escape_characters++; - } - else if (*input_pointer < 32) - { - /* UTF-16 escape sequence uXXXX */ - escape_characters += 5; + switch (*input_pointer) + { + case '\"': + case '\\': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + /* one character escape sequence */ + escape_characters++; + break; + default: + if (*input_pointer < 32) + { + /* UTF-16 escape sequence uXXXX */ + escape_characters += 5; + } + break; } } output_length = (size_t)(input_pointer - input) + escape_characters; From 87a204ed0b85ae142dd1c7f9b34c7d0129b2f9b5 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 14 Mar 2017 14:17:35 +0100 Subject: [PATCH 010/126] parse_functions: Return booleans instead of pointers --- cJSON.c | 67 ++++++++++++++++++++------------------------ tests/parse_array.c | 4 +-- tests/parse_number.c | 2 +- tests/parse_object.c | 4 +-- tests/parse_string.c | 4 +-- tests/parse_value.c | 2 +- tests/print_array.c | 2 +- tests/print_object.c | 2 +- tests/print_value.c | 2 +- 9 files changed, 41 insertions(+), 48 deletions(-) diff --git a/cJSON.c b/cJSON.c index 9acb77c9..ee4aebc7 100644 --- a/cJSON.c +++ b/cJSON.c @@ -202,7 +202,7 @@ typedef struct #define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset) /* Parse the input text to generate a number, and populate the result into item. */ -static const unsigned char *parse_number(cJSON * const item, parse_buffer * const input_buffer) +static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer) { double number = 0; unsigned char *after_end = NULL; @@ -212,7 +212,7 @@ static const unsigned char *parse_number(cJSON * const item, parse_buffer * cons if ((input_buffer == NULL) || (input_buffer->content == NULL)) { - return NULL; + return false; } /* copy the number into a temporary buffer and replace '.' with the decimal point @@ -253,7 +253,7 @@ static const unsigned char *parse_number(cJSON * const item, parse_buffer * cons number = strtod((const char*)number_c_string, (char**)&after_end); if (number_c_string == after_end) { - return NULL; /* parse_error */ + return false; /* parse_error */ } item->valuedouble = number; @@ -275,7 +275,7 @@ static const unsigned char *parse_number(cJSON * const item, parse_buffer * cons item->type = cJSON_Number; input_buffer->offset += (size_t)(after_end - number_c_string); - return buffer_at_offset(input_buffer); + return true; } /* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */ @@ -662,7 +662,7 @@ static unsigned char utf16_literal_to_utf8(const unsigned char * const input_poi } /* Parse the input text into an unescaped cinput, and populate item. */ -static const unsigned char *parse_string(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) +static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) { const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1; const unsigned char *input_end = buffer_at_offset(input_buffer) + 1; @@ -776,7 +776,7 @@ static const unsigned char *parse_string(cJSON * const item, parse_buffer * cons input_buffer->offset = (size_t) (input_end - input_buffer->content); input_buffer->offset++; - return buffer_at_offset(input_buffer); + return true; fail: if (output != NULL) @@ -784,7 +784,7 @@ static const unsigned char *parse_string(cJSON * const item, parse_buffer * cons hooks->deallocate(output); } - return NULL; + return false; } /* Render the cstring provided to an escaped version that can be printed. */ @@ -916,11 +916,11 @@ static cJSON_bool print_string(const cJSON * const item, printbuffer * const p, } /* Predeclare these prototypes. */ -static const unsigned char *parse_value(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const ep, const internal_hooks * const hooks); +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const ep, const internal_hooks * const hooks); static cJSON_bool print_value(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); -static const unsigned char *parse_array(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const ep, const internal_hooks * const hooks); +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const ep, const internal_hooks * const hooks); static cJSON_bool print_array(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); -static const unsigned char *parse_object(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const ep, const internal_hooks * const hooks); +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const ep, const internal_hooks * const hooks); static cJSON_bool print_object(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); /* Utility to jump whitespace and cr/lf */ @@ -980,13 +980,14 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return buffer.length = strlen((const char*)value) + sizeof(""); buffer.offset = 0; - end = parse_value(item, buffer_skip_whitespace(&buffer), error_pointer, &global_hooks); - if (end == NULL) + if (!parse_value(item, buffer_skip_whitespace(&buffer), error_pointer, &global_hooks)) { /* parse failure. ep is set. */ goto fail; } + end = buffer_at_offset(&buffer); + /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ if (require_null_terminated) { @@ -1125,12 +1126,11 @@ CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const i } /* Parser core - when encountering text, process appropriately. */ -static const unsigned char *parse_value(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) { - const unsigned char *content_pointer = NULL; if ((input_buffer == NULL) || (input_buffer->content == NULL)) { - return NULL; /* no input */ + return false; /* no input */ } /* parse the different types of values */ @@ -1139,14 +1139,14 @@ static const unsigned char *parse_value(cJSON * const item, parse_buffer * cons { item->type = cJSON_NULL; input_buffer->offset += 4; - return buffer_at_offset(input_buffer); + return true; } /* false */ if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0)) { item->type = cJSON_False; input_buffer->offset += 5; - return buffer_at_offset(input_buffer); + return true; } /* true */ if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0)) @@ -1154,12 +1154,12 @@ static const unsigned char *parse_value(cJSON * const item, parse_buffer * cons item->type = cJSON_True; item->valueint = 1; input_buffer->offset += 4; - return buffer_at_offset(input_buffer); + return true; } /* string */ if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) { - return content_pointer = parse_string(item, input_buffer, error_pointer, hooks); + return parse_string(item, input_buffer, error_pointer, hooks); } /* number */ if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) @@ -1174,14 +1174,7 @@ static const unsigned char *parse_value(cJSON * const item, parse_buffer * cons /* object */ if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) { - content_pointer = parse_object(item, input_buffer, error_pointer, hooks); - if (content_pointer == NULL) - { - return NULL; - } - - input_buffer->offset = (size_t)(content_pointer - input_buffer->content); - return buffer_at_offset(input_buffer); + return parse_object(item, input_buffer, error_pointer, hooks); } /* failure. */ @@ -1198,7 +1191,7 @@ static const unsigned char *parse_value(cJSON * const item, parse_buffer * cons *error_pointer = input_buffer->content; } - return NULL; + return false; } /* Render a value to text. */ @@ -1280,7 +1273,7 @@ static cJSON_bool print_value(const cJSON * const item, const size_t depth, cons } /* Build an array from input text. */ -static const unsigned char *parse_array(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) { cJSON *head = NULL; /* head of the linked list */ cJSON *current_item = NULL; @@ -1337,7 +1330,7 @@ static const unsigned char *parse_array(cJSON * const item, parse_buffer * const /* parse next value */ input_buffer->offset++; buffer_skip_whitespace(input_buffer); - if (parse_value(current_item, input_buffer, error_pointer, hooks) == NULL) + if (!parse_value(current_item, input_buffer, error_pointer, hooks)) { goto fail; /* failed to parse value */ } @@ -1357,7 +1350,7 @@ static const unsigned char *parse_array(cJSON * const item, parse_buffer * const input_buffer->offset++; - return buffer_at_offset(input_buffer); + return true; fail: if (head != NULL) @@ -1365,7 +1358,7 @@ static const unsigned char *parse_array(cJSON * const item, parse_buffer * const cJSON_Delete(head); } - return NULL; + return false; } /* Render an array to text */ @@ -1429,7 +1422,7 @@ static cJSON_bool print_array(const cJSON * const item, const size_t depth, cons } /* Build an object from the text. */ -static const unsigned char *parse_object(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) { cJSON *head = NULL; /* linked list head */ cJSON *current_item = NULL; @@ -1484,7 +1477,7 @@ static const unsigned char *parse_object(cJSON * const item, parse_buffer * cons /* parse the name of the child */ input_buffer->offset++; buffer_skip_whitespace(input_buffer); - if (parse_string(current_item, input_buffer, error_pointer, hooks) == NULL) + if (!parse_string(current_item, input_buffer, error_pointer, hooks)) { goto fail; /* faile to parse name */ } @@ -1503,7 +1496,7 @@ static const unsigned char *parse_object(cJSON * const item, parse_buffer * cons /* parse the value */ input_buffer->offset++; buffer_skip_whitespace(input_buffer); - if (parse_value(current_item, input_buffer, error_pointer, hooks) == NULL) + if (!parse_value(current_item, input_buffer, error_pointer, hooks)) { goto fail; /* failed to parse value */ } @@ -1522,7 +1515,7 @@ static const unsigned char *parse_object(cJSON * const item, parse_buffer * cons item->child = head; input_buffer->offset++; - return buffer_at_offset(input_buffer); + return true; fail: if (head != NULL) @@ -1530,7 +1523,7 @@ static const unsigned char *parse_object(cJSON * const item, parse_buffer * cons cJSON_Delete(head); } - return NULL; + return false; } /* Render an object to text. */ diff --git a/tests/parse_array.c b/tests/parse_array.c index c35f5ffb..a328af43 100644 --- a/tests/parse_array.c +++ b/tests/parse_array.c @@ -51,7 +51,7 @@ static void assert_not_array(const char *json) buffer.length = strlen(json) + sizeof(""); buffer.offset = 0; - TEST_ASSERT_NULL(parse_array(item, &buffer, &error_pointer, &global_hooks)); + TEST_ASSERT_FALSE(parse_array(item, &buffer, &error_pointer, &global_hooks)); assert_is_invalid(item); } @@ -62,7 +62,7 @@ static void assert_parse_array(const char *json) buffer.length = strlen(json) + sizeof(""); buffer.offset = 0; - TEST_ASSERT_NOT_NULL(parse_array(item, &buffer, &error_pointer, &global_hooks)); + TEST_ASSERT_TRUE(parse_array(item, &buffer, &error_pointer, &global_hooks)); assert_is_array(item); } diff --git a/tests/parse_number.c b/tests/parse_number.c index d89da147..aeaa0c77 100644 --- a/tests/parse_number.c +++ b/tests/parse_number.c @@ -50,7 +50,7 @@ static void assert_parse_number(const char *string, int integer, double real) buffer.length = strlen(string) + sizeof(""); buffer.offset = 0; - TEST_ASSERT_NOT_NULL(parse_number(item, &buffer)); + TEST_ASSERT_TRUE(parse_number(item, &buffer)); assert_is_number(item); TEST_ASSERT_EQUAL_INT(integer, item->valueint); TEST_ASSERT_EQUAL_DOUBLE(real, item->valuedouble); diff --git a/tests/parse_object.c b/tests/parse_object.c index 283de822..ad6fd83f 100644 --- a/tests/parse_object.c +++ b/tests/parse_object.c @@ -59,7 +59,7 @@ static void assert_not_object(const char *json) parsebuffer.length = strlen(json) + sizeof(""); parsebuffer.offset = 0; - TEST_ASSERT_NULL(parse_object(item, &parsebuffer, &error_pointer, &global_hooks)); + TEST_ASSERT_FALSE(parse_object(item, &parsebuffer, &error_pointer, &global_hooks)); assert_is_invalid(item); reset(item); } @@ -71,7 +71,7 @@ static void assert_parse_object(const char *json) parsebuffer.length = strlen(json) + sizeof(""); parsebuffer.offset = 0; - TEST_ASSERT_NOT_NULL(parse_object(item, &parsebuffer, &error_pointer, &global_hooks)); + TEST_ASSERT_TRUE(parse_object(item, &parsebuffer, &error_pointer, &global_hooks)); assert_is_object(item); } diff --git a/tests/parse_string.c b/tests/parse_string.c index 97098440..54b3adf1 100644 --- a/tests/parse_string.c +++ b/tests/parse_string.c @@ -52,7 +52,7 @@ static void assert_parse_string(const char *string, const char *expected) buffer.length = strlen(string) + sizeof(""); buffer.offset = 0; - TEST_ASSERT_NOT_NULL_MESSAGE(parse_string(item, &buffer, &error_pointer, &global_hooks), "Couldn't parse string."); + TEST_ASSERT_TRUE_MESSAGE(parse_string(item, &buffer, &error_pointer, &global_hooks), "Couldn't parse string."); assert_is_string(item); TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, item->valuestring, "The parsed result isn't as expected."); global_hooks.deallocate(item->valuestring); @@ -66,7 +66,7 @@ static void assert_not_parse_string(const char * const string) buffer.length = strlen(string) + sizeof(""); buffer.offset = 0; - TEST_ASSERT_NULL_MESSAGE(parse_string(item, &buffer, &error_pointer, &global_hooks), "Malformed string should not be accepted."); + TEST_ASSERT_FALSE_MESSAGE(parse_string(item, &buffer, &error_pointer, &global_hooks), "Malformed string should not be accepted."); assert_is_invalid(item); } diff --git a/tests/parse_value.c b/tests/parse_value.c index 3c518822..3766f971 100644 --- a/tests/parse_value.c +++ b/tests/parse_value.c @@ -48,7 +48,7 @@ static void assert_parse_value(const char *string, int type) buffer.content = (const unsigned char*) string; buffer.length = strlen(string) + sizeof(""); buffer.offset = 0; - TEST_ASSERT_NOT_NULL(parse_value(item, &buffer, &error_pointer, &global_hooks)); + TEST_ASSERT_TRUE(parse_value(item, &buffer, &error_pointer, &global_hooks)); assert_is_value(item, type); } diff --git a/tests/print_array.c b/tests/print_array.c index 128a1062..e326dc62 100644 --- a/tests/print_array.c +++ b/tests/print_array.c @@ -53,7 +53,7 @@ static void assert_print_array(const char * const expected, const char * const i unformatted_buffer.noalloc = true; memset(item, 0, sizeof(item)); - TEST_ASSERT_NOT_NULL_MESSAGE(parse_array(item, &parsebuffer, &error_pointer, &global_hooks), "Failed to parse array."); + TEST_ASSERT_TRUE_MESSAGE(parse_array(item, &parsebuffer, &error_pointer, &global_hooks), "Failed to parse array."); TEST_ASSERT_TRUE_MESSAGE(print_array(item, 0, false, &unformatted_buffer, &global_hooks), "Failed to print unformatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, printed_unformatted, "Unformatted array is not correct."); diff --git a/tests/print_object.c b/tests/print_object.c index 53fe8f24..dbde0698 100644 --- a/tests/print_object.c +++ b/tests/print_object.c @@ -54,7 +54,7 @@ static void assert_print_object(const char * const expected, const char * const unformatted_buffer.noalloc = true; memset(item, 0, sizeof(item)); - TEST_ASSERT_NOT_NULL_MESSAGE(parse_object(item, &parsebuffer, &error_pointer, &global_hooks), "Failed to parse object."); + TEST_ASSERT_TRUE_MESSAGE(parse_object(item, &parsebuffer, &error_pointer, &global_hooks), "Failed to parse object."); TEST_ASSERT_TRUE_MESSAGE(print_object(item, 0, false, &unformatted_buffer, &global_hooks), "Failed to print unformatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, printed_unformatted, "Unformatted object is not correct."); diff --git a/tests/print_value.c b/tests/print_value.c index 628b373b..bb892b22 100644 --- a/tests/print_value.c +++ b/tests/print_value.c @@ -46,7 +46,7 @@ static void assert_print_value(const char *input) memset(item, 0, sizeof(item)); - TEST_ASSERT_NOT_NULL_MESSAGE(parse_value(item, &parsebuffer, &error_pointer, &global_hooks), "Failed to parse value."); + TEST_ASSERT_TRUE_MESSAGE(parse_value(item, &parsebuffer, &error_pointer, &global_hooks), "Failed to parse value."); TEST_ASSERT_TRUE_MESSAGE(print_value(item, 0, false, &buffer, &global_hooks), "Failed to print value."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, buffer.buffer, "Printed value is not as expected."); From 80bc7652aed2b37c5afc3016704b8a3ddc3fbcc8 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 21 Mar 2017 18:35:22 +0100 Subject: [PATCH 011/126] cJSON_ParseWithOptions: Remove end pointer --- cJSON.c | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/cJSON.c b/cJSON.c index ee4aebc7..8129a67d 100644 --- a/cJSON.c +++ b/cJSON.c @@ -924,16 +924,6 @@ static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_bu static cJSON_bool print_object(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); /* Utility to jump whitespace and cr/lf */ -static const unsigned char *skip_whitespace(const unsigned char *in) -{ - while (in && *in && (*in <= 32)) - { - in++; - } - - return in; -} - static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) { if ((buffer == NULL) || (buffer->content == NULL)) @@ -958,7 +948,6 @@ static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) { parse_buffer buffer; - const unsigned char *end = NULL; /* use global error pointer if no specific one was given */ const unsigned char **error_pointer = (return_parse_end != NULL) ? (const unsigned char**)return_parse_end : &global_ep; cJSON *item = NULL; @@ -986,21 +975,19 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return goto fail; } - end = buffer_at_offset(&buffer); - /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ if (require_null_terminated) { - end = skip_whitespace(end); - if (*end != '\0') + buffer_skip_whitespace(&buffer); + if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0') { - *error_pointer = end; + *error_pointer = buffer_at_offset(&buffer); goto fail; } } if (return_parse_end) { - *return_parse_end = (const char*)end; + *return_parse_end = (const char*)buffer_at_offset(&buffer); } return item; From c837177a56c1fe05b3fbcb3687144b6de089dcdc Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 21 Mar 2017 21:14:37 +0100 Subject: [PATCH 012/126] utf16_literal_to_utf8: Support \u0000 --- cJSON.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cJSON.c b/cJSON.c index 8129a67d..c1a2e24b 100644 --- a/cJSON.c +++ b/cJSON.c @@ -556,7 +556,7 @@ static unsigned char utf16_literal_to_utf8(const unsigned char * const input_poi first_code = parse_hex4(first_sequence + 2); /* check that the code is valid */ - if (((first_code >= 0xDC00) && (first_code <= 0xDFFF)) || (first_code == 0)) + if (((first_code >= 0xDC00) && (first_code <= 0xDFFF))) { *error_pointer = first_sequence; goto fail; From 2683589d93d85a1a2559b43c66498edab7ac269d Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 21 Mar 2017 21:41:37 +0100 Subject: [PATCH 013/126] parser: Construct error pointer from buffer offset --- cJSON.c | 91 +++++++++++++++++++------------------------- tests/parse_array.c | 6 +-- tests/parse_object.c | 6 +-- tests/parse_string.c | 6 +-- tests/parse_value.c | 3 +- tests/print_array.c | 3 +- tests/print_object.c | 3 +- tests/print_value.c | 3 +- 8 files changed, 49 insertions(+), 72 deletions(-) diff --git a/cJSON.c b/cJSON.c index c1a2e24b..ada428a9 100644 --- a/cJSON.c +++ b/cJSON.c @@ -535,7 +535,7 @@ static unsigned parse_hex4(const unsigned char * const input) /* converts a UTF-16 literal to UTF-8 * A literal can be one or two sequences of the form \uXXXX */ -static unsigned char utf16_literal_to_utf8(const unsigned char * const input_pointer, const unsigned char * const input_end, unsigned char **output_pointer, const unsigned char **error_pointer) +static unsigned char utf16_literal_to_utf8(const unsigned char * const input_pointer, const unsigned char * const input_end, unsigned char **output_pointer) { long unsigned int codepoint = 0; unsigned int first_code = 0; @@ -548,7 +548,6 @@ static unsigned char utf16_literal_to_utf8(const unsigned char * const input_poi if ((input_end - first_sequence) < 6) { /* input ends unexpectedly */ - *error_pointer = first_sequence; goto fail; } @@ -558,7 +557,6 @@ static unsigned char utf16_literal_to_utf8(const unsigned char * const input_poi /* check that the code is valid */ if (((first_code >= 0xDC00) && (first_code <= 0xDFFF))) { - *error_pointer = first_sequence; goto fail; } @@ -572,14 +570,12 @@ static unsigned char utf16_literal_to_utf8(const unsigned char * const input_poi if ((input_end - second_sequence) < 6) { /* input ends unexpectedly */ - *error_pointer = first_sequence; goto fail; } if ((second_sequence[0] != '\\') || (second_sequence[1] != 'u')) { /* missing second half of the surrogate pair */ - *error_pointer = first_sequence; goto fail; } @@ -589,7 +585,6 @@ static unsigned char utf16_literal_to_utf8(const unsigned char * const input_poi if ((second_code < 0xDC00) || (second_code > 0xDFFF)) { /* invalid second half of the surrogate pair */ - *error_pointer = first_sequence; goto fail; } @@ -632,7 +627,6 @@ static unsigned char utf16_literal_to_utf8(const unsigned char * const input_poi else { /* invalid unicode codepoint */ - *error_pointer = first_sequence; goto fail; } @@ -662,7 +656,7 @@ static unsigned char utf16_literal_to_utf8(const unsigned char * const input_poi } /* Parse the input text into an unescaped cinput, and populate item. */ -static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) +static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks) { const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1; const unsigned char *input_end = buffer_at_offset(input_buffer) + 1; @@ -672,7 +666,6 @@ static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_bu /* not a string */ if (buffer_at_offset(input_buffer)[0] != '\"') { - *error_pointer = buffer_at_offset(input_buffer); goto fail; } @@ -751,7 +744,7 @@ static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_bu /* UTF-16 literal */ case 'u': - sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer, error_pointer); + sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer); if (sequence_length == 0) { /* failed to convert UTF16-literal to UTF-8 */ @@ -760,7 +753,6 @@ static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_bu break; default: - *error_pointer = input_pointer; goto fail; } input_pointer += sequence_length; @@ -784,6 +776,11 @@ static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_bu hooks->deallocate(output); } + if (input_pointer != NULL) + { + input_buffer->offset = (size_t)(input_pointer - input_buffer->content); + } + return false; } @@ -916,11 +913,11 @@ static cJSON_bool print_string(const cJSON * const item, printbuffer * const p, } /* Predeclare these prototypes. */ -static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const ep, const internal_hooks * const hooks); +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks); static cJSON_bool print_value(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); -static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const ep, const internal_hooks * const hooks); +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks); static cJSON_bool print_array(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); -static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const ep, const internal_hooks * const hooks); +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks); static cJSON_bool print_object(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); /* Utility to jump whitespace and cr/lf */ @@ -951,15 +948,8 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return /* use global error pointer if no specific one was given */ const unsigned char **error_pointer = (return_parse_end != NULL) ? (const unsigned char**)return_parse_end : &global_ep; cJSON *item = NULL; - *error_pointer = NULL; - item = cJSON_New_Item(&global_hooks); - if (item == NULL) /* memory fail */ - { - goto fail; - } - if (value == NULL) { goto fail; @@ -969,7 +959,13 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return buffer.length = strlen((const char*)value) + sizeof(""); buffer.offset = 0; - if (!parse_value(item, buffer_skip_whitespace(&buffer), error_pointer, &global_hooks)) + item = cJSON_New_Item(&global_hooks); + if (item == NULL) /* memory fail */ + { + goto fail; + } + + if (!parse_value(item, buffer_skip_whitespace(&buffer), &global_hooks)) { /* parse failure. ep is set. */ goto fail; @@ -981,7 +977,6 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return buffer_skip_whitespace(&buffer); if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0') { - *error_pointer = buffer_at_offset(&buffer); goto fail; } } @@ -998,6 +993,18 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return cJSON_Delete(item); } + if (value != NULL) + { + if (buffer.offset < buffer.length) + { + *error_pointer = buffer_at_offset(&buffer); + } + else if (buffer.length > 0) + { + *error_pointer = buffer.content + buffer.length - 1; + } + } + return NULL; } @@ -1113,7 +1120,7 @@ CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const i } /* Parser core - when encountering text, process appropriately. */ -static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks) { if ((input_buffer == NULL) || (input_buffer->content == NULL)) { @@ -1146,7 +1153,7 @@ static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buf /* string */ if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) { - return parse_string(item, input_buffer, error_pointer, hooks); + return parse_string(item, input_buffer, hooks); } /* number */ if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) @@ -1156,27 +1163,14 @@ static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buf /* array */ if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) { - return parse_array(item, input_buffer, error_pointer, hooks); + return parse_array(item, input_buffer, hooks); } /* object */ if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) { - return parse_object(item, input_buffer, error_pointer, hooks); + return parse_object(item, input_buffer, hooks); } - /* failure. */ - if (can_access_at_index(input_buffer, 0)) - { - *error_pointer = buffer_at_offset(input_buffer); - } - else if (input_buffer->length > 0) - { - *error_pointer = input_buffer->content + input_buffer->length - 1; - } - else - { - *error_pointer = input_buffer->content; - } return false; } @@ -1260,7 +1254,7 @@ static cJSON_bool print_value(const cJSON * const item, const size_t depth, cons } /* Build an array from input text. */ -static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks) { cJSON *head = NULL; /* head of the linked list */ cJSON *current_item = NULL; @@ -1268,7 +1262,6 @@ static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buf if (buffer_at_offset(input_buffer)[0] != '[') { /* not an array */ - *error_pointer = buffer_at_offset(input_buffer); goto fail; } @@ -1284,7 +1277,6 @@ static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buf if (cannot_access_at_index(input_buffer, 0)) { input_buffer->offset--; - *error_pointer = buffer_at_offset(input_buffer); goto fail; } @@ -1317,7 +1309,7 @@ static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buf /* parse next value */ input_buffer->offset++; buffer_skip_whitespace(input_buffer); - if (!parse_value(current_item, input_buffer, error_pointer, hooks)) + if (!parse_value(current_item, input_buffer, hooks)) { goto fail; /* failed to parse value */ } @@ -1327,7 +1319,6 @@ static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buf if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']') { - *error_pointer = buffer_at_offset(input_buffer); goto fail; /* expected end of array */ } @@ -1409,14 +1400,13 @@ static cJSON_bool print_array(const cJSON * const item, const size_t depth, cons } /* Build an object from the text. */ -static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer, const unsigned char ** const error_pointer, const internal_hooks * const hooks) +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks) { cJSON *head = NULL; /* linked list head */ cJSON *current_item = NULL; if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) { - *error_pointer = buffer_at_offset(input_buffer); goto fail; /* not an object */ } @@ -1431,7 +1421,6 @@ static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_bu if (cannot_access_at_index(input_buffer, 0)) { input_buffer->offset--; - *error_pointer = buffer_at_offset(input_buffer); goto fail; } @@ -1464,7 +1453,7 @@ static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_bu /* parse the name of the child */ input_buffer->offset++; buffer_skip_whitespace(input_buffer); - if (!parse_string(current_item, input_buffer, error_pointer, hooks)) + if (!parse_string(current_item, input_buffer, hooks)) { goto fail; /* faile to parse name */ } @@ -1476,14 +1465,13 @@ static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_bu if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':')) { - *error_pointer = buffer_at_offset(input_buffer); goto fail; /* invalid object */ } /* parse the value */ input_buffer->offset++; buffer_skip_whitespace(input_buffer); - if (!parse_value(current_item, input_buffer, error_pointer, hooks)) + if (!parse_value(current_item, input_buffer, hooks)) { goto fail; /* failed to parse value */ } @@ -1493,7 +1481,6 @@ static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_bu if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}')) { - *error_pointer = buffer_at_offset(input_buffer); goto fail; /* expected end of object */ } diff --git a/tests/parse_array.c b/tests/parse_array.c index a328af43..a089db57 100644 --- a/tests/parse_array.c +++ b/tests/parse_array.c @@ -30,8 +30,6 @@ static cJSON item[1]; -static const unsigned char *error_pointer = NULL; - static void assert_is_array(cJSON *array_item) { TEST_ASSERT_NOT_NULL_MESSAGE(array_item, "Item is NULL."); @@ -51,7 +49,7 @@ static void assert_not_array(const char *json) buffer.length = strlen(json) + sizeof(""); buffer.offset = 0; - TEST_ASSERT_FALSE(parse_array(item, &buffer, &error_pointer, &global_hooks)); + TEST_ASSERT_FALSE(parse_array(item, &buffer, &global_hooks)); assert_is_invalid(item); } @@ -62,7 +60,7 @@ static void assert_parse_array(const char *json) buffer.length = strlen(json) + sizeof(""); buffer.offset = 0; - TEST_ASSERT_TRUE(parse_array(item, &buffer, &error_pointer, &global_hooks)); + TEST_ASSERT_TRUE(parse_array(item, &buffer, &global_hooks)); assert_is_array(item); } diff --git a/tests/parse_object.c b/tests/parse_object.c index ad6fd83f..4973b936 100644 --- a/tests/parse_object.c +++ b/tests/parse_object.c @@ -30,8 +30,6 @@ static cJSON item[1]; -static const unsigned char *error_pointer = NULL; - static void assert_is_object(cJSON *object_item) { TEST_ASSERT_NOT_NULL_MESSAGE(object_item, "Item is NULL."); @@ -59,7 +57,7 @@ static void assert_not_object(const char *json) parsebuffer.length = strlen(json) + sizeof(""); parsebuffer.offset = 0; - TEST_ASSERT_FALSE(parse_object(item, &parsebuffer, &error_pointer, &global_hooks)); + TEST_ASSERT_FALSE(parse_object(item, &parsebuffer, &global_hooks)); assert_is_invalid(item); reset(item); } @@ -71,7 +69,7 @@ static void assert_parse_object(const char *json) parsebuffer.length = strlen(json) + sizeof(""); parsebuffer.offset = 0; - TEST_ASSERT_TRUE(parse_object(item, &parsebuffer, &error_pointer, &global_hooks)); + TEST_ASSERT_TRUE(parse_object(item, &parsebuffer, &global_hooks)); assert_is_object(item); } diff --git a/tests/parse_string.c b/tests/parse_string.c index 54b3adf1..a95e078f 100644 --- a/tests/parse_string.c +++ b/tests/parse_string.c @@ -30,8 +30,6 @@ static cJSON item[1]; -static const unsigned char *error_pointer = NULL; - static void assert_is_string(cJSON *string_item) { TEST_ASSERT_NOT_NULL_MESSAGE(string_item, "Item is NULL."); @@ -52,7 +50,7 @@ static void assert_parse_string(const char *string, const char *expected) buffer.length = strlen(string) + sizeof(""); buffer.offset = 0; - TEST_ASSERT_TRUE_MESSAGE(parse_string(item, &buffer, &error_pointer, &global_hooks), "Couldn't parse string."); + TEST_ASSERT_TRUE_MESSAGE(parse_string(item, &buffer, &global_hooks), "Couldn't parse string."); assert_is_string(item); TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, item->valuestring, "The parsed result isn't as expected."); global_hooks.deallocate(item->valuestring); @@ -66,7 +64,7 @@ static void assert_not_parse_string(const char * const string) buffer.length = strlen(string) + sizeof(""); buffer.offset = 0; - TEST_ASSERT_FALSE_MESSAGE(parse_string(item, &buffer, &error_pointer, &global_hooks), "Malformed string should not be accepted."); + TEST_ASSERT_FALSE_MESSAGE(parse_string(item, &buffer, &global_hooks), "Malformed string should not be accepted."); assert_is_invalid(item); } diff --git a/tests/parse_value.c b/tests/parse_value.c index 3766f971..7a10dbf0 100644 --- a/tests/parse_value.c +++ b/tests/parse_value.c @@ -29,7 +29,6 @@ #include "common.h" static cJSON item[1]; -const unsigned char *error_pointer = NULL; static void assert_is_value(cJSON *value_item, int type) { @@ -48,7 +47,7 @@ static void assert_parse_value(const char *string, int type) buffer.content = (const unsigned char*) string; buffer.length = strlen(string) + sizeof(""); buffer.offset = 0; - TEST_ASSERT_TRUE(parse_value(item, &buffer, &error_pointer, &global_hooks)); + TEST_ASSERT_TRUE(parse_value(item, &buffer, &global_hooks)); assert_is_value(item, type); } diff --git a/tests/print_array.c b/tests/print_array.c index e326dc62..c0b4e05d 100644 --- a/tests/print_array.c +++ b/tests/print_array.c @@ -29,7 +29,6 @@ static void assert_print_array(const char * const expected, const char * const i unsigned char printed_unformatted[1024]; unsigned char printed_formatted[1024]; - const unsigned char *error_pointer; cJSON item[1]; printbuffer formatted_buffer; @@ -53,7 +52,7 @@ static void assert_print_array(const char * const expected, const char * const i unformatted_buffer.noalloc = true; memset(item, 0, sizeof(item)); - TEST_ASSERT_TRUE_MESSAGE(parse_array(item, &parsebuffer, &error_pointer, &global_hooks), "Failed to parse array."); + TEST_ASSERT_TRUE_MESSAGE(parse_array(item, &parsebuffer, &global_hooks), "Failed to parse array."); TEST_ASSERT_TRUE_MESSAGE(print_array(item, 0, false, &unformatted_buffer, &global_hooks), "Failed to print unformatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, printed_unformatted, "Unformatted array is not correct."); diff --git a/tests/print_object.c b/tests/print_object.c index dbde0698..5b4e34b9 100644 --- a/tests/print_object.c +++ b/tests/print_object.c @@ -29,7 +29,6 @@ static void assert_print_object(const char * const expected, const char * const unsigned char printed_unformatted[1024]; unsigned char printed_formatted[1024]; - const unsigned char *error_pointer; cJSON item[1]; printbuffer formatted_buffer; @@ -54,7 +53,7 @@ static void assert_print_object(const char * const expected, const char * const unformatted_buffer.noalloc = true; memset(item, 0, sizeof(item)); - TEST_ASSERT_TRUE_MESSAGE(parse_object(item, &parsebuffer, &error_pointer, &global_hooks), "Failed to parse object."); + TEST_ASSERT_TRUE_MESSAGE(parse_object(item, &parsebuffer, &global_hooks), "Failed to parse object."); TEST_ASSERT_TRUE_MESSAGE(print_object(item, 0, false, &unformatted_buffer, &global_hooks), "Failed to print unformatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, printed_unformatted, "Unformatted object is not correct."); diff --git a/tests/print_value.c b/tests/print_value.c index bb892b22..56614d07 100644 --- a/tests/print_value.c +++ b/tests/print_value.c @@ -31,7 +31,6 @@ static void assert_print_value(const char *input) { unsigned char printed[1024]; - const unsigned char *error_pointer = NULL; cJSON item[1]; printbuffer buffer; parse_buffer parsebuffer; @@ -46,7 +45,7 @@ static void assert_print_value(const char *input) memset(item, 0, sizeof(item)); - TEST_ASSERT_TRUE_MESSAGE(parse_value(item, &parsebuffer, &error_pointer, &global_hooks), "Failed to parse value."); + TEST_ASSERT_TRUE_MESSAGE(parse_value(item, &parsebuffer, &global_hooks), "Failed to parse value."); TEST_ASSERT_TRUE_MESSAGE(print_value(item, 0, false, &buffer, &global_hooks), "Failed to print value."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, buffer.buffer, "Printed value is not as expected."); From 770e8263a5a63f345d64d6e4d88559c46e6244d4 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 21 Mar 2017 23:40:50 +0100 Subject: [PATCH 014/126] tests for cJSON_ParseWithOpts --- tests/CMakeLists.txt | 1 + tests/parse_with_opts.c | 70 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 tests/parse_with_opts.c diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6e9ed047..0cf17d3c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -45,6 +45,7 @@ if(ENABLE_CJSON_TEST) print_object print_value misc_tests + parse_with_opts ) add_library(test-common common.c) diff --git a/tests/parse_with_opts.c b/tests/parse_with_opts.c new file mode 100644 index 00000000..fe95bb69 --- /dev/null +++ b/tests/parse_with_opts.c @@ -0,0 +1,70 @@ +/* + 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. +*/ + +#include "unity/examples/unity_config.h" +#include "unity/src/unity.h" +#include "common.h" + +static void parse_with_opts_should_handle_null(void) +{ + const char *error_pointer = NULL; + cJSON *item = NULL; + TEST_ASSERT_NULL_MESSAGE(cJSON_ParseWithOpts(NULL, &error_pointer, false), "Failed to handle NULL input."); + item = cJSON_ParseWithOpts("{}", NULL, false); + TEST_ASSERT_NOT_NULL_MESSAGE(item, "Failed to handle NULL error pointer."); + cJSON_Delete(item); + TEST_ASSERT_NULL_MESSAGE(cJSON_ParseWithOpts(NULL, NULL, false), "Failed to handle both NULL."); + TEST_ASSERT_NULL_MESSAGE(cJSON_ParseWithOpts("{", NULL, false), "Failed to handle NULL error pointer with parse error."); +} + +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_NULL(cJSON_ParseWithOpts(empty_string, &error_pointer, false)); + TEST_ASSERT_EQUAL_INT(0, error_pointer - empty_string); +} + +static void parse_with_opts_should_require_null_if_requested(void) +{ + cJSON *item = cJSON_ParseWithOpts("{}", NULL, true); + TEST_ASSERT_NOT_NULL(item); + cJSON_Delete(item); + item = cJSON_ParseWithOpts("{} \n", NULL, true); + TEST_ASSERT_NOT_NULL(item); + cJSON_Delete(item); + TEST_ASSERT_NULL(cJSON_ParseWithOpts("{}x", NULL, true)); +} + +int main(void) +{ + UNITY_BEGIN(); + + RUN_TEST(parse_with_opts_should_handle_null); + RUN_TEST(parse_with_opts_should_handle_empty_strings); + RUN_TEST(parse_with_opts_should_require_null_if_requested); + + return UNITY_END(); +} From 56a32f9ecc93c08e4f99a0c15d5bce8708e6dd13 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 22 Mar 2017 00:50:32 +0100 Subject: [PATCH 015/126] Use error_position instead of error pointer internally --- cJSON.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/cJSON.c b/cJSON.c index ada428a9..71476b54 100644 --- a/cJSON.c +++ b/cJSON.c @@ -40,11 +40,15 @@ #define true ((cJSON_bool)1) #define false ((cJSON_bool)0) -static const unsigned char *global_ep = NULL; +typedef struct { + const unsigned char *json; + size_t position; +} error; +static error global_error = { NULL, 0 }; CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void) { - return (const char*) global_ep; + return (const char*) (global_error.json + global_error.position); } /* This is a safeguard to prevent copy-pasters from using incompatible C and header files */ @@ -945,10 +949,11 @@ static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) { parse_buffer buffer; - /* use global error pointer if no specific one was given */ - const unsigned char **error_pointer = (return_parse_end != NULL) ? (const unsigned char**)return_parse_end : &global_ep; cJSON *item = NULL; - *error_pointer = NULL; + + /* reset error position */ + global_error.json = NULL; + global_error.position = 0; if (value == NULL) { @@ -995,13 +1000,26 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return if (value != NULL) { + error local_error; + local_error.json = (const unsigned char*)value; + local_error.position = 0; + if (buffer.offset < buffer.length) { - *error_pointer = buffer_at_offset(&buffer); + local_error.position = buffer.offset; } else if (buffer.length > 0) { - *error_pointer = buffer.content + buffer.length - 1; + local_error.position = buffer.length - 1; + } + + if (return_parse_end != NULL) + { + *return_parse_end = (const char*)local_error.json + local_error.position; + } + else + { + global_error = local_error; } } From bc0bb7c224e420c3836795b0a5646c204d5f04e9 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 22 Mar 2017 01:05:03 +0100 Subject: [PATCH 016/126] parse_with_opts: test return_parse_end --- tests/parse_with_opts.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/parse_with_opts.c b/tests/parse_with_opts.c index fe95bb69..05574676 100644 --- a/tests/parse_with_opts.c +++ b/tests/parse_with_opts.c @@ -58,6 +58,17 @@ static void parse_with_opts_should_require_null_if_requested(void) TEST_ASSERT_NULL(cJSON_ParseWithOpts("{}x", NULL, true)); } +static void parse_with_opts_should_return_parse_end(void) +{ + const char json[] = "[] empty array XD"; + const char *parse_end = NULL; + + cJSON *item = cJSON_ParseWithOpts(json, &parse_end, false); + TEST_ASSERT_NOT_NULL(item); + TEST_ASSERT_EQUAL_INT(2, parse_end - json); + cJSON_Delete(item); +} + int main(void) { UNITY_BEGIN(); @@ -65,6 +76,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_require_null_if_requested); + RUN_TEST(parse_with_opts_should_return_parse_end); return UNITY_END(); } From 281df6997c9e710804c8028d5fd0f64ed869e1a7 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 22 Mar 2017 12:46:42 +0100 Subject: [PATCH 017/126] Update copyright --- README.md | 4 +++- cJSON.c | 2 +- cJSON.h | 2 +- cJSON_Utils.c | 22 ++++++++++++++++++++++ cJSON_Utils.h | 22 ++++++++++++++++++++++ test.c | 2 +- test_utils.c | 22 ++++++++++++++++++++++ 7 files changed, 72 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 29381787..16d056db 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,9 @@ Ultralightweight JSON parser in ANSI C. ## License -> Copyright (c) 2009-2016 Dave Gamble +MIT License + +> 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 diff --git a/cJSON.c b/cJSON.c index 71476b54..d1439dd0 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1,5 +1,5 @@ /* - Copyright (c) 2009 Dave Gamble + 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 diff --git a/cJSON.h b/cJSON.h index 040511ef..3d621e48 100644 --- a/cJSON.h +++ b/cJSON.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2009 Dave Gamble + 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 diff --git a/cJSON_Utils.c b/cJSON_Utils.c index b39e432e..92bb0b4e 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -1,3 +1,25 @@ +/* + 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. +*/ + #pragma GCC visibility push(default) #include #include diff --git a/cJSON_Utils.h b/cJSON_Utils.h index 6baf9c62..e7cec143 100644 --- a/cJSON_Utils.h +++ b/cJSON_Utils.h @@ -1,3 +1,25 @@ +/* + 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. +*/ + #include "cJSON.h" /* Implement RFC6901 (https://tools.ietf.org/html/rfc6901) JSON Pointer spec. */ diff --git a/test.c b/test.c index e902c71c..66154e04 100644 --- a/test.c +++ b/test.c @@ -1,5 +1,5 @@ /* - Copyright (c) 2009 Dave Gamble + 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 diff --git a/test_utils.c b/test_utils.c index 6a836880..4e0091c6 100644 --- a/test_utils.c +++ b/test_utils.c @@ -1,3 +1,25 @@ +/* + 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. +*/ + #include #include #include From 218b0c8dcf4f5bec9019ade5beda9ff6ff36ad6b Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 22 Mar 2017 17:31:44 +0100 Subject: [PATCH 018/126] cJSON_Print: Use reallocate if available This can reduce worst case peak memory usage by 30% depending on the realloc implementation. --- cJSON.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/cJSON.c b/cJSON.c index d1439dd0..77b148bb 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1055,17 +1055,28 @@ static unsigned char *print(const cJSON * const item, cJSON_bool format, const i } update_offset(buffer); - /* copy the buffer over to a new one */ - printed = (unsigned char*) hooks->allocate(buffer->offset + 1); - if (printed == NULL) + /* check if reallocate is available */ + if (hooks->reallocate != NULL) { - goto fail; + printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->length); + buffer->buffer = NULL; + if (printed == NULL) { + goto fail; + } } - strncpy((char*)printed, (char*)buffer->buffer, min(buffer->length, buffer->offset + 1)); - printed[buffer->offset] = '\0'; /* just to be sure */ + else /* otherwise copy the JSON over to a new buffer */ + { + printed = (unsigned char*) hooks->allocate(buffer->offset + 1); + if (printed == NULL) + { + goto fail; + } + memcpy(printed, buffer->buffer, min(buffer->length, buffer->offset + 1)); + printed[buffer->offset] = '\0'; /* just to be sure */ - /* free the buffer */ - hooks->deallocate(buffer->buffer); + /* free the buffer */ + hooks->deallocate(buffer->buffer); + } return printed; From 655c26ada1726fec7cc0fee74aa475daed2e6ec5 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sat, 25 Mar 2017 14:06:45 +0100 Subject: [PATCH 019/126] cJSON_strcasecmp: Improve readability --- cJSON.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/cJSON.c b/cJSON.c index 77b148bb..30ef3782 100644 --- a/cJSON.c +++ b/cJSON.c @@ -65,25 +65,33 @@ CJSON_PUBLIC(const char*) cJSON_Version(void) } /* case insensitive strcmp */ -static int cJSON_strcasecmp(const unsigned char *s1, const unsigned char *s2) +static int cJSON_strcasecmp(const unsigned char *string1, const unsigned char *string2) { - if (!s1) + if (string1 == NULL) { - return (s1 == s2) ? 0 : 1; /* both NULL? */ + if (string2 == NULL) + { + /* both NULL */ + return 0; + } + + return 1; } - if (!s2) + + if (string2 == NULL) { return 1; } - for(; tolower(*s1) == tolower(*s2); (void)++s1, ++s2) + + for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) { - if (*s1 == '\0') + if (*string1 == '\0') { return 0; } } - return tolower(*s1) - tolower(*s2); + return tolower(string1[0]) - tolower(string2[0]); } typedef struct internal_hooks From eb5000ba61a033c5e6012bc37cef88351560eadb Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sat, 25 Mar 2017 14:08:58 +0100 Subject: [PATCH 020/126] cJSON_strdup: improve readability --- cJSON.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cJSON.c b/cJSON.c index 30ef3782..ff584cfd 100644 --- a/cJSON.c +++ b/cJSON.c @@ -103,22 +103,22 @@ typedef struct internal_hooks static internal_hooks global_hooks = { malloc, free, realloc }; -static unsigned char* cJSON_strdup(const unsigned char* str, const internal_hooks * const hooks) +static unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks * const hooks) { - size_t len = 0; + size_t length = 0; unsigned char *copy = NULL; - if (str == NULL) + if (string == NULL) { return NULL; } - len = strlen((const char*)str) + sizeof(""); - if (!(copy = (unsigned char*)hooks->allocate(len))) + length = strlen((const char*)string) + sizeof(""); + if (!(copy = (unsigned char*)hooks->allocate(length))) { return NULL; } - memcpy(copy, str, len); + memcpy(copy, string, length); return copy; } From 6702037b6849d3f75ac9448995639d77650aaf09 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sat, 25 Mar 2017 14:09:26 +0100 Subject: [PATCH 021/126] cJSON_Delete: Improve readability --- cJSON.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cJSON.c b/cJSON.c index ff584cfd..47cc198d 100644 --- a/cJSON.c +++ b/cJSON.c @@ -167,26 +167,26 @@ static cJSON *cJSON_New_Item(const internal_hooks * const hooks) } /* Delete a cJSON structure. */ -CJSON_PUBLIC(void) cJSON_Delete(cJSON *c) +CJSON_PUBLIC(void) cJSON_Delete(cJSON *item) { cJSON *next = NULL; - while (c) + while (item != NULL) { - next = c->next; - if (!(c->type & cJSON_IsReference) && c->child) + next = item->next; + if (!(item->type & cJSON_IsReference) && (item->child != NULL)) { - cJSON_Delete(c->child); + cJSON_Delete(item->child); } - if (!(c->type & cJSON_IsReference) && c->valuestring) + if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL)) { - global_hooks.deallocate(c->valuestring); + global_hooks.deallocate(item->valuestring); } - if (!(c->type & cJSON_StringIsConst) && c->string) + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) { - global_hooks.deallocate(c->string); + global_hooks.deallocate(item->string); } - global_hooks.deallocate(c); - c = next; + global_hooks.deallocate(item); + item = next; } } From 238ceec175cf0c2209282f1f68518f5e772d12da Mon Sep 17 00:00:00 2001 From: Pawel Winogrodzki Date: Wed, 29 Mar 2017 13:03:38 -0700 Subject: [PATCH 022/126] Fixing all W4-level warnings. --- cJSON.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/cJSON.c b/cJSON.c index 47cc198d..3d1ec17b 100644 --- a/cJSON.c +++ b/cJSON.c @@ -23,7 +23,10 @@ /* cJSON */ /* JSON parser in C. */ +#ifdef __GNUC__ #pragma GCC visibility push(default) +#endif + #include #include #include @@ -32,7 +35,10 @@ #include #include #include + +#ifdef __GNUC__ #pragma GCC visibility pop +#endif #include "cJSON.h" @@ -956,7 +962,7 @@ static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) /* Parse an object - create a new root, and populate. */ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) { - parse_buffer buffer; + parse_buffer buffer = { 0 }; cJSON *item = NULL; /* reset error position */ @@ -1040,7 +1046,9 @@ CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value) return cJSON_ParseWithOpts(value, 0, 0); } +#ifndef min #define min(a, b) ((a < b) ? a : b) +#endif static unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks) { @@ -1687,7 +1695,7 @@ CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON *object, const char *strin return c; } -CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string) +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * object, const char * string) { cJSON *current_element = NULL; @@ -1771,7 +1779,10 @@ CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSO #if defined (__clang__) || ((__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) #pragma GCC diagnostic push #endif +#ifdef __GNUC__ #pragma GCC diagnostic ignored "-Wcast-qual" +#endif + /* Add an item to an object with constant string as key */ CJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item) { From c786cd9714d63bc723b9e9250b0663bf789d0758 Mon Sep 17 00:00:00 2001 From: Pawel Winogrodzki Date: Thu, 30 Mar 2017 15:41:27 -0700 Subject: [PATCH 023/126] Adding back "const". --- cJSON.c | 2 +- cJSON.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cJSON.c b/cJSON.c index 3d1ec17b..9a503266 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1695,7 +1695,7 @@ CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON *object, const char *strin return c; } -CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * object, const char * string) +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string) { cJSON *current_element = NULL; diff --git a/cJSON.h b/cJSON.h index 3d621e48..7199520c 100644 --- a/cJSON.h +++ b/cJSON.h @@ -150,7 +150,7 @@ CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array); CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int item); /* Get item "string" from object. Case insensitive. */ CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON *object, const char *string); -CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON *object, const char *string); +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string); CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string); /* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void); From 2148e3277a00afc139ede78fdc076984b40258c6 Mon Sep 17 00:00:00 2001 From: Pawel Winogrodzki Date: Thu, 30 Mar 2017 15:47:06 -0700 Subject: [PATCH 024/126] Renaming "min" to "cjson_min". --- cJSON.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cJSON.c b/cJSON.c index 9a503266..d1f1e9b4 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1046,9 +1046,7 @@ CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value) return cJSON_ParseWithOpts(value, 0, 0); } -#ifndef min -#define min(a, b) ((a < b) ? a : b) -#endif +#define cjson_min(a, b) ((a < b) ? a : b) static unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks) { @@ -1087,7 +1085,7 @@ static unsigned char *print(const cJSON * const item, cJSON_bool format, const i { goto fail; } - memcpy(printed, buffer->buffer, min(buffer->length, buffer->offset + 1)); + memcpy(printed, buffer->buffer, cjson_min(buffer->length, buffer->offset + 1)); printed[buffer->offset] = '\0'; /* just to be sure */ /* free the buffer */ From a99d254e4fa13ba48eee8cd1c1255d1750f8b989 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Fri, 31 Mar 2017 01:21:53 +0200 Subject: [PATCH 025/126] License: Add other contributors --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index fa0a438e..b15182d0 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ - Copyright (c) 2009 Dave Gamble + 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 From 6c3df7eb59d480fbf45211ecf9aaf96a691b8e60 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Fri, 31 Mar 2017 01:26:22 +0200 Subject: [PATCH 026/126] cJSON_ParseWithOpts: Fix -Wmissing-field-initializers --- cJSON.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cJSON.c b/cJSON.c index d1f1e9b4..edd9310d 100644 --- a/cJSON.c +++ b/cJSON.c @@ -962,7 +962,7 @@ static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) /* Parse an object - create a new root, and populate. */ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) { - parse_buffer buffer = { 0 }; + parse_buffer buffer = { 0, 0, 0 }; cJSON *item = NULL; /* reset error position */ From 31400affab60b8a9bf0a053bb6b481edaa511fd0 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Fri, 31 Mar 2017 01:40:01 +0200 Subject: [PATCH 027/126] Contributors: Add Pawel Winogrodzki --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index e0f4473a..80cc3b75 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -23,6 +23,7 @@ Contributors * Mike Pontillo * [Mike Jerris](https://github.com/mjerris) * Paulo Antonio Alvarez +* [Pawel Winogrodzki](https://github.com/PawelWMS) * [Rafael Leal Dias](https://github.com/rafaeldias) * [Rod Vagg](https://github.com/rvagg) * [Roland Meertens](https://github.com/rmeertens) From e9803341d5ce2c79548cc4791551115e38503223 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 5 Apr 2017 19:30:06 +0200 Subject: [PATCH 028/126] simplify and rename cJSON_strcasecmp Two NULL strings should not be considered equal for the purpose of cJSON. --- cJSON.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/cJSON.c b/cJSON.c index edd9310d..c73ff03a 100644 --- a/cJSON.c +++ b/cJSON.c @@ -70,23 +70,17 @@ CJSON_PUBLIC(const char*) cJSON_Version(void) return version; } -/* case insensitive strcmp */ -static int cJSON_strcasecmp(const unsigned char *string1, const unsigned char *string2) +/* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ +static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2) { - if (string1 == NULL) + if ((string1 == NULL) || (string2 == NULL)) { - if (string2 == NULL) - { - /* both NULL */ - return 0; - } - return 1; } - if (string2 == NULL) + if (string1 == string2) { - return 1; + return 0; } for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) @@ -97,7 +91,7 @@ static int cJSON_strcasecmp(const unsigned char *string1, const unsigned char *s } } - return tolower(string1[0]) - tolower(string2[0]); + return tolower(*string1) - tolower(*string2); } typedef struct internal_hooks @@ -1686,7 +1680,7 @@ CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int item) CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON *object, const char *string) { cJSON *c = object ? object->child : NULL; - while (c && cJSON_strcasecmp((unsigned char*)c->string, (const unsigned char*)string)) + while (c && !case_insensitive_strcmp((unsigned char*)c->string, (const unsigned char*)string)) { c = c->next; } @@ -1860,7 +1854,7 @@ CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *stri { size_t i = 0; cJSON *c = object->child; - while (c && cJSON_strcasecmp((unsigned char*)c->string, (const unsigned char*)string)) + while (c && !case_insensitive_strcmp((unsigned char*)c->string, (const unsigned char*)string)) { i++; c = c->next; @@ -1948,7 +1942,7 @@ CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object, const char *string, { size_t i = 0; cJSON *c = object->child; - while(c && cJSON_strcasecmp((unsigned char*)c->string, (const unsigned char*)string)) + while(c && !case_insensitive_strcmp((unsigned char*)c->string, (const unsigned char*)string)) { i++; c = c->next; From 2a25abbf2a1735cbf481356fa72a91b28fa83e7a Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 5 Apr 2017 19:37:00 +0200 Subject: [PATCH 029/126] Deduplicate code for cJSON_GetObjectItem --- cJSON.c | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/cJSON.c b/cJSON.c index c73ff03a..471cdf31 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1677,34 +1677,44 @@ CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int item) return c; } -CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON *object, const char *string) -{ - cJSON *c = object ? object->child : NULL; - while (c && !case_insensitive_strcmp((unsigned char*)c->string, (const unsigned char*)string)) - { - c = c->next; - } - return c; -} - -CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string) +static cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive) { cJSON *current_element = NULL; - if ((object == NULL) || (string == NULL)) + if ((object == NULL) || (name == NULL)) { return NULL; } current_element = object->child; - while ((current_element != NULL) && (strcmp(string, current_element->string) != 0)) + if (case_sensitive) { - current_element = current_element->next; + while ((current_element != NULL) && (strcmp(name, current_element->string) != 0)) + { + current_element = current_element->next; + } + } + else + { + while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0)) + { + current_element = current_element->next; + } } return current_element; } +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON *object, const char *string) +{ + return get_object_item(object, string, false); +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, true); +} + CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string) { return cJSON_GetObjectItem(object, string) ? 1 : 0; @@ -1854,7 +1864,7 @@ CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *stri { size_t i = 0; cJSON *c = object->child; - while (c && !case_insensitive_strcmp((unsigned char*)c->string, (const unsigned char*)string)) + while (c && (case_insensitive_strcmp((unsigned char*)c->string, (const unsigned char*)string) != 0)) { i++; c = c->next; @@ -1942,7 +1952,7 @@ CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object, const char *string, { size_t i = 0; cJSON *c = object->child; - while(c && !case_insensitive_strcmp((unsigned char*)c->string, (const unsigned char*)string)) + while(c && (case_insensitive_strcmp((unsigned char*)c->string, (const unsigned char*)string) != 0)) { i++; c = c->next; From 6ac896d8d28b4a0d88ab13010d0c3de8210fbd13 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Thu, 6 Apr 2017 13:02:38 +0200 Subject: [PATCH 030/126] cJSON_Compare: New function to compare json --- cJSON.c | 101 ++++++++++++++++++++++ cJSON.h | 4 + tests/CMakeLists.txt | 1 + tests/compare_tests.c | 192 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 298 insertions(+) create mode 100644 tests/compare_tests.c diff --git a/cJSON.c b/cJSON.c index 471cdf31..bc343ba3 100644 --- a/cJSON.c +++ b/cJSON.c @@ -2484,3 +2484,104 @@ CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item) return (item->type & 0xFF) == cJSON_Raw; } + +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive) +{ + if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF)) || cJSON_IsInvalid(a)) + { + return false; + } + + /* check if type is valid */ + switch (a->type & 0xFF) + { + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + case cJSON_Number: + case cJSON_String: + case cJSON_Raw: + case cJSON_Array: + case cJSON_Object: + break; + + default: + return false; + } + + /* identical objects are equal */ + if (a == b) + { + return true; + } + + switch (a->type & 0xFF) + { + /* in these cases and equal type is enough */ + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + return true; + + case cJSON_Number: + if (a->valuedouble == b->valuedouble) + { + return true; + } + return false; + + case cJSON_String: + case cJSON_Raw: + if ((a->valuestring == NULL) || (b->valuestring == NULL)) + { + return false; + } + if (strcmp(a->valuestring, b->valuestring) == 0) + { + return true; + } + + return false; + + case cJSON_Array: + { + cJSON *a_element = NULL; + cJSON *b_element = NULL; + for (a_element = a->child, b_element = b->child; + (a_element != NULL) && (b_element != NULL); + a_element = a_element->next, b_element = b_element->next) + { + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + } + + return true; + } + + case cJSON_Object: + { + cJSON *a_element = NULL; + cJSON_ArrayForEach(a_element, a) + { + /* TODO This has O(n^2) runtime, which is horrible! */ + cJSON *b_element = get_object_item(b, a_element->string, case_sensitive); + if (b_element == NULL) + { + return false; + } + + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + } + + return true; + } + + default: + return false; + } +} diff --git a/cJSON.h b/cJSON.h index 7199520c..c29ba172 100644 --- a/cJSON.h +++ b/cJSON.h @@ -212,6 +212,10 @@ CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse); /* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will need to be released. With recurse!=0, it will duplicate any children connected to the item. The item->next and ->prev pointers are always zero on return from Duplicate. */ +/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal. + * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */ +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive); + /* 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. */ diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0cf17d3c..bb7c6fa3 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -46,6 +46,7 @@ if(ENABLE_CJSON_TEST) print_value misc_tests parse_with_opts + compare_tests ) add_library(test-common common.c) diff --git a/tests/compare_tests.c b/tests/compare_tests.c new file mode 100644 index 00000000..654e14e7 --- /dev/null +++ b/tests/compare_tests.c @@ -0,0 +1,192 @@ +/* + 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. +*/ + +#include "unity/examples/unity_config.h" +#include "unity/src/unity.h" +#include "common.h" + +static cJSON_bool compare_from_string(const char * const a, const char * const b, const cJSON_bool case_sensitive) +{ + cJSON *a_json = NULL; + cJSON *b_json = NULL; + cJSON_bool result = false; + + a_json = cJSON_Parse(a); + TEST_ASSERT_NOT_NULL_MESSAGE(a_json, "Failed to parse a."); + b_json = cJSON_Parse(b); + TEST_ASSERT_NOT_NULL_MESSAGE(b_json, "Failed to parse b."); + + result = cJSON_Compare(a_json, b_json, case_sensitive); + + cJSON_Delete(a_json); + cJSON_Delete(b_json); + + return result; +} + +static void cjson_compare_should_compare_null_pointer_as_not_equal(void) +{ + TEST_ASSERT_FALSE(cJSON_Compare(NULL, NULL, true)); + TEST_ASSERT_FALSE(cJSON_Compare(NULL, NULL, false)); +} + +static void cjson_compare_should_compare_invalid_as_not_equal(void) +{ + cJSON invalid[1]; + memset(invalid, '\0', sizeof(invalid)); + + TEST_ASSERT_FALSE(cJSON_Compare(invalid, invalid, false)); + TEST_ASSERT_FALSE(cJSON_Compare(invalid, invalid, true)); +} + +static void cjson_compare_should_compare_numbers(void) +{ + TEST_ASSERT_TRUE(compare_from_string("1", "1", true)); + TEST_ASSERT_TRUE(compare_from_string("1", "1", false)); + TEST_ASSERT_TRUE(compare_from_string("0.0001", "0.0001", true)); + TEST_ASSERT_TRUE(compare_from_string("0.0001", "0.0001", false)); + + TEST_ASSERT_FALSE(compare_from_string("1", "2", true)); + TEST_ASSERT_FALSE(compare_from_string("1", "2", false)); +} + +static void cjson_compare_should_compare_booleans(void) +{ + /* true */ + TEST_ASSERT_TRUE(compare_from_string("true", "true", true)); + TEST_ASSERT_TRUE(compare_from_string("true", "true", false)); + + /* false */ + TEST_ASSERT_TRUE(compare_from_string("false", "false", true)); + TEST_ASSERT_TRUE(compare_from_string("false", "false", false)); + + /* mixed */ + TEST_ASSERT_FALSE(compare_from_string("true", "false", true)); + TEST_ASSERT_FALSE(compare_from_string("true", "false", false)); + TEST_ASSERT_FALSE(compare_from_string("false", "true", true)); + TEST_ASSERT_FALSE(compare_from_string("false", "true", false)); +} + +static void cjson_compare_should_compare_null(void) +{ + TEST_ASSERT_TRUE(compare_from_string("null", "null", true)); + TEST_ASSERT_TRUE(compare_from_string("null", "null", false)); + + TEST_ASSERT_FALSE(compare_from_string("null", "true", true)); + TEST_ASSERT_FALSE(compare_from_string("null", "true", false)); +} + +static void cjson_compare_should_not_accept_invalid_types(void) +{ + cJSON invalid[1]; + memset(invalid, '\0', sizeof(invalid)); + + invalid->type = cJSON_Number | cJSON_String; + + TEST_ASSERT_FALSE(cJSON_Compare(invalid, invalid, true)); + TEST_ASSERT_FALSE(cJSON_Compare(invalid, invalid, false)); +} + +static void cjson_compare_should_compare_strings(void) +{ + TEST_ASSERT_TRUE(compare_from_string("\"abcdefg\"", "\"abcdefg\"", true)); + TEST_ASSERT_TRUE(compare_from_string("\"abcdefg\"", "\"abcdefg\"", false)); + + TEST_ASSERT_FALSE(compare_from_string("\"ABCDEFG\"", "\"abcdefg\"", true)); + TEST_ASSERT_FALSE(compare_from_string("\"ABCDEFG\"", "\"abcdefg\"", false)); +} + +static void cjson_compare_should_compare_raw(void) +{ + cJSON *raw1 = NULL; + cJSON *raw2 = NULL; + + raw1 = cJSON_Parse("\"[true, false]\""); + TEST_ASSERT_NOT_NULL(raw1); + raw2 = cJSON_Parse("\"[true, false]\""); + TEST_ASSERT_NOT_NULL(raw2); + + raw1->type = cJSON_Raw; + raw2->type = cJSON_Raw; + + TEST_ASSERT_TRUE(cJSON_Compare(raw1, raw2, true)); + TEST_ASSERT_TRUE(cJSON_Compare(raw1, raw2, false)); + + cJSON_Delete(raw1); + cJSON_Delete(raw2); +} + +static void cjson_compare_should_compare_arrays(void) +{ + TEST_ASSERT_TRUE(compare_from_string("[]", "[]", true)); + TEST_ASSERT_TRUE(compare_from_string("[]", "[]", false)); + + TEST_ASSERT_TRUE(compare_from_string("[false,true,null,42,\"string\",[],{}]", "[false, true, null, 42, \"string\", [], {}]", true)); + TEST_ASSERT_TRUE(compare_from_string("[false,true,null,42,\"string\",[],{}]", "[false, true, null, 42, \"string\", [], {}]", false)); + + TEST_ASSERT_TRUE(compare_from_string("[[[1], 2]]", "[[[1], 2]]", true)); + TEST_ASSERT_TRUE(compare_from_string("[[[1], 2]]", "[[[1], 2]]", false)); + + 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)); +} + +static void cjson_compare_should_compare_objects(void) +{ + TEST_ASSERT_TRUE(compare_from_string("{}", "{}", true)); + TEST_ASSERT_TRUE(compare_from_string("{}", "{}", false)); + + TEST_ASSERT_TRUE(compare_from_string( + "{\"false\": false, \"true\": true, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}", + "{\"true\": true, \"false\": false, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}", + true)); + TEST_ASSERT_FALSE(compare_from_string( + "{\"False\": false, \"true\": true, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}", + "{\"true\": true, \"false\": false, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}", + true)); + TEST_ASSERT_TRUE(compare_from_string( + "{\"False\": false, \"true\": true, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}", + "{\"true\": true, \"false\": false, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}", + false)); + TEST_ASSERT_FALSE(compare_from_string( + "{\"Flse\": false, \"true\": true, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}", + "{\"true\": true, \"false\": false, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}", + false)); +} + +int main(void) +{ + UNITY_BEGIN(); + + RUN_TEST(cjson_compare_should_compare_null_pointer_as_not_equal); + RUN_TEST(cjson_compare_should_compare_invalid_as_not_equal); + RUN_TEST(cjson_compare_should_compare_numbers); + RUN_TEST(cjson_compare_should_compare_booleans); + RUN_TEST(cjson_compare_should_compare_null); + RUN_TEST(cjson_compare_should_not_accept_invalid_types); + RUN_TEST(cjson_compare_should_compare_strings); + RUN_TEST(cjson_compare_should_compare_raw); + RUN_TEST(cjson_compare_should_compare_arrays); + RUN_TEST(cjson_compare_should_compare_objects); + + return UNITY_END(); +} From 7276f4df051bc58af8a2da7d3199517d43d37582 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 11 Apr 2017 14:45:28 +0200 Subject: [PATCH 031/126] Squashed 'tests/json-patch-tests/' content from commit 716417e git-subtree-dir: tests/json-patch-tests git-subtree-split: 716417e71e328e116dc1e98b903b434578bc1a1c --- .editorconfig | 10 ++ .gitignore | 4 + .npmignore | 2 + README.md | 75 +++++++++ package.json | 15 ++ spec_tests.json | 233 +++++++++++++++++++++++++++ tests.json | 408 ++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 747 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .npmignore create mode 100644 README.md create mode 100644 package.json create mode 100644 spec_tests.json create mode 100644 tests.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..dc79da48 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +# EditorConfig is awesome: http://EditorConfig.org + +root = true + +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +trim_trailing_whitespace = true +indent_style = space diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..cd2b23de --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*~ +\#* +!.editorconfig +!.gitignore diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000..2d6cdcb2 --- /dev/null +++ b/.npmignore @@ -0,0 +1,2 @@ +.editorconfig +.gitignore diff --git a/README.md b/README.md new file mode 100644 index 00000000..fb9e4478 --- /dev/null +++ b/README.md @@ -0,0 +1,75 @@ +JSON Patch Tests +================ + +These are test cases for implementations of [IETF JSON Patch (RFC6902)](http://tools.ietf.org/html/rfc6902). + +Some implementations can be found at [jsonpatch.com](http://jsonpatch.com). + + +Test Format +----------- + +Each test file is a JSON document that contains an array of test records. A +test record is an object with the following members: + +- doc: The JSON document to test against +- patch: The patch(es) to apply +- expected: The expected resulting document, OR +- error: A string describing an expected error +- comment: A string describing the test +- disabled: True if the test should be skipped + +All fields except 'doc' and 'patch' are optional. Test records consisting only +of a comment are also OK. + + +Files +----- + +- tests.json: the main test file +- spec_tests.json: tests from the RFC6902 spec + + +Writing Tests +------------- + +All tests should have a descriptive comment. Tests should be as +simple as possible - just what's required to test a specific piece of +behavior. If you want to test interacting behaviors, create tests for +each behavior as well as the interaction. + +If an 'error' member is specified, the error text should describe the +error the implementation should raise - *not* what's being tested. +Implementation error strings will vary, but the suggested error should +be easily matched to the implementation error string. Try to avoid +creating error tests that might pass because an incorrect error was +reported. + +Please feel free to contribute! + + +Credits +------- + +The seed test set was adapted from Byron Ruth's +[jsonpatch-js](https://github.com/bruth/jsonpatch-js/blob/master/test.js) and +extended by [Mike McCabe](https://github.com/mikemccabe). + + +License +------- + + Copyright 2014 The Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/package.json b/package.json new file mode 100644 index 00000000..256f9368 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "json-patch-test-suite", + "version": "1.1.0", + "description": "JSON Patch RFC 6902 test suite", + "repository": "github:json-patch/json-patch-tests", + "homepage": "https://github.com/json-patch/json-patch-tests", + "bugs": "https://github.com/json-patch/json-patch-tests/issues", + "keywords": [ + "JSON", + "Patch", + "test", + "suite" + ], + "license": "Apache-2.0" +} diff --git a/spec_tests.json b/spec_tests.json new file mode 100644 index 00000000..c160535b --- /dev/null +++ b/spec_tests.json @@ -0,0 +1,233 @@ +[ + { + "comment": "4.1. add with missing object", + "doc": { "q": { "bar": 2 } }, + "patch": [ {"op": "add", "path": "/a/b", "value": 1} ], + "error": + "path /a does not exist -- missing objects are not created recursively" + }, + + { + "comment": "A.1. Adding an Object Member", + "doc": { + "foo": "bar" +}, + "patch": [ + { "op": "add", "path": "/baz", "value": "qux" } +], + "expected": { + "baz": "qux", + "foo": "bar" +} + }, + + { + "comment": "A.2. Adding an Array Element", + "doc": { + "foo": [ "bar", "baz" ] +}, + "patch": [ + { "op": "add", "path": "/foo/1", "value": "qux" } +], + "expected": { + "foo": [ "bar", "qux", "baz" ] +} + }, + + { + "comment": "A.3. Removing an Object Member", + "doc": { + "baz": "qux", + "foo": "bar" +}, + "patch": [ + { "op": "remove", "path": "/baz" } +], + "expected": { + "foo": "bar" +} + }, + + { + "comment": "A.4. Removing an Array Element", + "doc": { + "foo": [ "bar", "qux", "baz" ] +}, + "patch": [ + { "op": "remove", "path": "/foo/1" } +], + "expected": { + "foo": [ "bar", "baz" ] +} + }, + + { + "comment": "A.5. Replacing a Value", + "doc": { + "baz": "qux", + "foo": "bar" +}, + "patch": [ + { "op": "replace", "path": "/baz", "value": "boo" } +], + "expected": { + "baz": "boo", + "foo": "bar" +} + }, + + { + "comment": "A.6. Moving a Value", + "doc": { + "foo": { + "bar": "baz", + "waldo": "fred" + }, + "qux": { + "corge": "grault" + } +}, + "patch": [ + { "op": "move", "from": "/foo/waldo", "path": "/qux/thud" } +], + "expected": { + "foo": { + "bar": "baz" + }, + "qux": { + "corge": "grault", + "thud": "fred" + } +} + }, + + { + "comment": "A.7. Moving an Array Element", + "doc": { + "foo": [ "all", "grass", "cows", "eat" ] +}, + "patch": [ + { "op": "move", "from": "/foo/1", "path": "/foo/3" } +], + "expected": { + "foo": [ "all", "cows", "eat", "grass" ] +} + + }, + + { + "comment": "A.8. Testing a Value: Success", + "doc": { + "baz": "qux", + "foo": [ "a", 2, "c" ] +}, + "patch": [ + { "op": "test", "path": "/baz", "value": "qux" }, + { "op": "test", "path": "/foo/1", "value": 2 } +], + "expected": { + "baz": "qux", + "foo": [ "a", 2, "c" ] + } + }, + + { + "comment": "A.9. Testing a Value: Error", + "doc": { + "baz": "qux" +}, + "patch": [ + { "op": "test", "path": "/baz", "value": "bar" } +], + "error": "string not equivalent" + }, + + { + "comment": "A.10. Adding a nested Member Object", + "doc": { + "foo": "bar" +}, + "patch": [ + { "op": "add", "path": "/child", "value": { "grandchild": { } } } +], + "expected": { + "foo": "bar", + "child": { + "grandchild": { + } + } +} + }, + + { + "comment": "A.11. Ignoring Unrecognized Elements", + "doc": { + "foo":"bar" +}, + "patch": [ + { "op": "add", "path": "/baz", "value": "qux", "xyz": 123 } +], + "expected": { + "foo":"bar", + "baz":"qux" +} + }, + + { + "comment": "A.12. Adding to a Non-existent Target", + "doc": { + "foo": "bar" +}, + "patch": [ + { "op": "add", "path": "/baz/bat", "value": "qux" } +], + "error": "add to a non-existent target" + }, + + { + "comment": "A.13 Invalid JSON Patch Document", + "doc": { + "foo": "bar" + }, + "patch": [ + { "op": "add", "path": "/baz", "value": "qux", "op": "remove" } +], + "error": "operation has two 'op' members", + "disabled": true + }, + + { + "comment": "A.14. ~ Escape Ordering", + "doc": { + "/": 9, + "~1": 10 + }, + "patch": [{"op": "test", "path": "/~01", "value": 10}], + "expected": { + "/": 9, + "~1": 10 + } + }, + + { + "comment": "A.15. Comparing Strings and Numbers", + "doc": { + "/": 9, + "~1": 10 + }, + "patch": [{"op": "test", "path": "/~01", "value": "10"}], + "error": "number is not equal to string" + }, + + { + "comment": "A.16. Adding an Array Value", + "doc": { + "foo": ["bar"] + }, + "patch": [{ "op": "add", "path": "/foo/-", "value": ["abc", "def"] }], + "expected": { + "foo": ["bar", ["abc", "def"]] + } + } + +] diff --git a/tests.json b/tests.json new file mode 100644 index 00000000..3a42eab7 --- /dev/null +++ b/tests.json @@ -0,0 +1,408 @@ +[ + { "comment": "empty list, empty docs", + "doc": {}, + "patch": [], + "expected": {} }, + + { "comment": "empty patch list", + "doc": {"foo": 1}, + "patch": [], + "expected": {"foo": 1} }, + + { "comment": "rearrangements OK?", + "doc": {"foo": 1, "bar": 2}, + "patch": [], + "expected": {"bar":2, "foo": 1} }, + + { "comment": "rearrangements OK? How about one level down ... array", + "doc": [{"foo": 1, "bar": 2}], + "patch": [], + "expected": [{"bar":2, "foo": 1}] }, + + { "comment": "rearrangements OK? How about one level down...", + "doc": {"foo":{"foo": 1, "bar": 2}}, + "patch": [], + "expected": {"foo":{"bar":2, "foo": 1}} }, + + { "comment": "add replaces any existing field", + "doc": {"foo": null}, + "patch": [{"op": "add", "path": "/foo", "value":1}], + "expected": {"foo": 1} }, + + { "comment": "toplevel array", + "doc": [], + "patch": [{"op": "add", "path": "/0", "value": "foo"}], + "expected": ["foo"] }, + + { "comment": "toplevel array, no change", + "doc": ["foo"], + "patch": [], + "expected": ["foo"] }, + + { "comment": "toplevel object, numeric string", + "doc": {}, + "patch": [{"op": "add", "path": "/foo", "value": "1"}], + "expected": {"foo":"1"} }, + + { "comment": "toplevel object, integer", + "doc": {}, + "patch": [{"op": "add", "path": "/foo", "value": 1}], + "expected": {"foo":1} }, + + { "comment": "Toplevel scalar values OK?", + "doc": "foo", + "patch": [{"op": "replace", "path": "", "value": "bar"}], + "expected": "bar", + "disabled": true }, + + { "comment": "Add, / target", + "doc": {}, + "patch": [ {"op": "add", "path": "/", "value":1 } ], + "expected": {"":1} }, + + { "comment": "Add, /foo/ deep target (trailing slash)", + "doc": {"foo": {}}, + "patch": [ {"op": "add", "path": "/foo/", "value":1 } ], + "expected": {"foo":{"": 1}} }, + + { "comment": "Add composite value at top level", + "doc": {"foo": 1}, + "patch": [{"op": "add", "path": "/bar", "value": [1, 2]}], + "expected": {"foo": 1, "bar": [1, 2]} }, + + { "comment": "Add into composite value", + "doc": {"foo": 1, "baz": [{"qux": "hello"}]}, + "patch": [{"op": "add", "path": "/baz/0/foo", "value": "world"}], + "expected": {"foo": 1, "baz": [{"qux": "hello", "foo": "world"}]} }, + + { "doc": {"bar": [1, 2]}, + "patch": [{"op": "add", "path": "/bar/8", "value": "5"}], + "error": "Out of bounds (upper)" }, + + { "doc": {"bar": [1, 2]}, + "patch": [{"op": "add", "path": "/bar/-1", "value": "5"}], + "error": "Out of bounds (lower)" }, + + { "doc": {"foo": 1}, + "patch": [{"op": "add", "path": "/bar", "value": true}], + "expected": {"foo": 1, "bar": true} }, + + { "doc": {"foo": 1}, + "patch": [{"op": "add", "path": "/bar", "value": false}], + "expected": {"foo": 1, "bar": false} }, + + { "doc": {"foo": 1}, + "patch": [{"op": "add", "path": "/bar", "value": null}], + "expected": {"foo": 1, "bar": null} }, + + { "comment": "0 can be an array index or object element name", + "doc": {"foo": 1}, + "patch": [{"op": "add", "path": "/0", "value": "bar"}], + "expected": {"foo": 1, "0": "bar" } }, + + { "doc": ["foo"], + "patch": [{"op": "add", "path": "/1", "value": "bar"}], + "expected": ["foo", "bar"] }, + + { "doc": ["foo", "sil"], + "patch": [{"op": "add", "path": "/1", "value": "bar"}], + "expected": ["foo", "bar", "sil"] }, + + { "doc": ["foo", "sil"], + "patch": [{"op": "add", "path": "/0", "value": "bar"}], + "expected": ["bar", "foo", "sil"] }, + + { "comment": "push item to array via last index + 1", + "doc": ["foo", "sil"], + "patch": [{"op":"add", "path": "/2", "value": "bar"}], + "expected": ["foo", "sil", "bar"] }, + + { "comment": "add item to array at index > length should fail", + "doc": ["foo", "sil"], + "patch": [{"op":"add", "path": "/3", "value": "bar"}], + "error": "index is greater than number of items in array" }, + + { "comment": "test against implementation-specific numeric parsing", + "doc": {"1e0": "foo"}, + "patch": [{"op": "test", "path": "/1e0", "value": "foo"}], + "expected": {"1e0": "foo"} }, + + { "comment": "test with bad number should fail", + "doc": ["foo", "bar"], + "patch": [{"op": "test", "path": "/1e0", "value": "bar"}], + "error": "test op shouldn't get array element 1" }, + + { "doc": ["foo", "sil"], + "patch": [{"op": "add", "path": "/bar", "value": 42}], + "error": "Object operation on array target" }, + + { "doc": ["foo", "sil"], + "patch": [{"op": "add", "path": "/1", "value": ["bar", "baz"]}], + "expected": ["foo", ["bar", "baz"], "sil"], + "comment": "value in array add not flattened" }, + + { "doc": {"foo": 1, "bar": [1, 2, 3, 4]}, + "patch": [{"op": "remove", "path": "/bar"}], + "expected": {"foo": 1} }, + + { "doc": {"foo": 1, "baz": [{"qux": "hello"}]}, + "patch": [{"op": "remove", "path": "/baz/0/qux"}], + "expected": {"foo": 1, "baz": [{}]} }, + + { "doc": {"foo": 1, "baz": [{"qux": "hello"}]}, + "patch": [{"op": "replace", "path": "/foo", "value": [1, 2, 3, 4]}], + "expected": {"foo": [1, 2, 3, 4], "baz": [{"qux": "hello"}]} }, + + { "doc": {"foo": [1, 2, 3, 4], "baz": [{"qux": "hello"}]}, + "patch": [{"op": "replace", "path": "/baz/0/qux", "value": "world"}], + "expected": {"foo": [1, 2, 3, 4], "baz": [{"qux": "world"}]} }, + + { "doc": ["foo"], + "patch": [{"op": "replace", "path": "/0", "value": "bar"}], + "expected": ["bar"] }, + + { "doc": [""], + "patch": [{"op": "replace", "path": "/0", "value": 0}], + "expected": [0] }, + + { "doc": [""], + "patch": [{"op": "replace", "path": "/0", "value": true}], + "expected": [true] }, + + { "doc": [""], + "patch": [{"op": "replace", "path": "/0", "value": false}], + "expected": [false] }, + + { "doc": [""], + "patch": [{"op": "replace", "path": "/0", "value": null}], + "expected": [null] }, + + { "doc": ["foo", "sil"], + "patch": [{"op": "replace", "path": "/1", "value": ["bar", "baz"]}], + "expected": ["foo", ["bar", "baz"]], + "comment": "value in array replace not flattened" }, + + { "comment": "replace whole document", + "doc": {"foo": "bar"}, + "patch": [{"op": "replace", "path": "", "value": {"baz": "qux"}}], + "expected": {"baz": "qux"} }, + + { "comment": "spurious patch properties", + "doc": {"foo": 1}, + "patch": [{"op": "test", "path": "/foo", "value": 1, "spurious": 1}], + "expected": {"foo": 1} }, + + { "doc": {"foo": null}, + "patch": [{"op": "test", "path": "/foo", "value": null}], + "comment": "null value should be valid obj property" }, + + { "doc": {"foo": null}, + "patch": [{"op": "replace", "path": "/foo", "value": "truthy"}], + "expected": {"foo": "truthy"}, + "comment": "null value should be valid obj property to be replaced with something truthy" }, + + { "doc": {"foo": null}, + "patch": [{"op": "move", "from": "/foo", "path": "/bar"}], + "expected": {"bar": null}, + "comment": "null value should be valid obj property to be moved" }, + + { "doc": {"foo": null}, + "patch": [{"op": "copy", "from": "/foo", "path": "/bar"}], + "expected": {"foo": null, "bar": null}, + "comment": "null value should be valid obj property to be copied" }, + + { "doc": {"foo": null}, + "patch": [{"op": "remove", "path": "/foo"}], + "expected": {}, + "comment": "null value should be valid obj property to be removed" }, + + { "doc": {"foo": "bar"}, + "patch": [{"op": "replace", "path": "/foo", "value": null}], + "expected": {"foo": null}, + "comment": "null value should still be valid obj property replace other value" }, + + { "doc": {"foo": {"foo": 1, "bar": 2}}, + "patch": [{"op": "test", "path": "/foo", "value": {"bar": 2, "foo": 1}}], + "comment": "test should pass despite rearrangement" }, + + { "doc": {"foo": [{"foo": 1, "bar": 2}]}, + "patch": [{"op": "test", "path": "/foo", "value": [{"bar": 2, "foo": 1}]}], + "comment": "test should pass despite (nested) rearrangement" }, + + { "doc": {"foo": {"bar": [1, 2, 5, 4]}}, + "patch": [{"op": "test", "path": "/foo", "value": {"bar": [1, 2, 5, 4]}}], + "comment": "test should pass - no error" }, + + { "doc": {"foo": {"bar": [1, 2, 5, 4]}}, + "patch": [{"op": "test", "path": "/foo", "value": [1, 2]}], + "error": "test op should fail" }, + + { "comment": "Whole document", + "doc": { "foo": 1 }, + "patch": [{"op": "test", "path": "", "value": {"foo": 1}}], + "disabled": true }, + + { "comment": "Empty-string element", + "doc": { "": 1 }, + "patch": [{"op": "test", "path": "/", "value": 1}] }, + + { "doc": { + "foo": ["bar", "baz"], + "": 0, + "a/b": 1, + "c%d": 2, + "e^f": 3, + "g|h": 4, + "i\\j": 5, + "k\"l": 6, + " ": 7, + "m~n": 8 + }, + "patch": [{"op": "test", "path": "/foo", "value": ["bar", "baz"]}, + {"op": "test", "path": "/foo/0", "value": "bar"}, + {"op": "test", "path": "/", "value": 0}, + {"op": "test", "path": "/a~1b", "value": 1}, + {"op": "test", "path": "/c%d", "value": 2}, + {"op": "test", "path": "/e^f", "value": 3}, + {"op": "test", "path": "/g|h", "value": 4}, + {"op": "test", "path": "/i\\j", "value": 5}, + {"op": "test", "path": "/k\"l", "value": 6}, + {"op": "test", "path": "/ ", "value": 7}, + {"op": "test", "path": "/m~0n", "value": 8}] }, + + { "comment": "Move to same location has no effect", + "doc": {"foo": 1}, + "patch": [{"op": "move", "from": "/foo", "path": "/foo"}], + "expected": {"foo": 1} }, + + { "doc": {"foo": 1, "baz": [{"qux": "hello"}]}, + "patch": [{"op": "move", "from": "/foo", "path": "/bar"}], + "expected": {"baz": [{"qux": "hello"}], "bar": 1} }, + + { "doc": {"baz": [{"qux": "hello"}], "bar": 1}, + "patch": [{"op": "move", "from": "/baz/0/qux", "path": "/baz/1"}], + "expected": {"baz": [{}, "hello"], "bar": 1} }, + + { "doc": {"baz": [{"qux": "hello"}], "bar": 1}, + "patch": [{"op": "copy", "from": "/baz/0", "path": "/boo"}], + "expected": {"baz":[{"qux":"hello"}],"bar":1,"boo":{"qux":"hello"}} }, + + { "comment": "replacing the root of the document is possible with add", + "doc": {"foo": "bar"}, + "patch": [{"op": "add", "path": "", "value": {"baz": "qux"}}], + "expected": {"baz":"qux"}}, + + { "comment": "Adding to \"/-\" adds to the end of the array", + "doc": [ 1, 2 ], + "patch": [ { "op": "add", "path": "/-", "value": { "foo": [ "bar", "baz" ] } } ], + "expected": [ 1, 2, { "foo": [ "bar", "baz" ] } ]}, + + { "comment": "Adding to \"/-\" adds to the end of the array, even n levels down", + "doc": [ 1, 2, [ 3, [ 4, 5 ] ] ], + "patch": [ { "op": "add", "path": "/2/1/-", "value": { "foo": [ "bar", "baz" ] } } ], + "expected": [ 1, 2, [ 3, [ 4, 5, { "foo": [ "bar", "baz" ] } ] ] ]}, + + { "comment": "test remove with bad number should fail", + "doc": {"foo": 1, "baz": [{"qux": "hello"}]}, + "patch": [{"op": "remove", "path": "/baz/1e0/qux"}], + "error": "remove op shouldn't remove from array with bad number" }, + + { "comment": "test remove on array", + "doc": [1, 2, 3, 4], + "patch": [{"op": "remove", "path": "/0"}], + "expected": [2, 3, 4] }, + + { "comment": "test repeated removes", + "doc": [1, 2, 3, 4], + "patch": [{ "op": "remove", "path": "/1" }, + { "op": "remove", "path": "/2" }], + "expected": [1, 3] }, + + { "comment": "test remove with bad index should fail", + "doc": [1, 2, 3, 4], + "patch": [{"op": "remove", "path": "/1e0"}], + "error": "remove op shouldn't remove from array with bad number" }, + + { "comment": "test replace with bad number should fail", + "doc": [""], + "patch": [{"op": "replace", "path": "/1e0", "value": false}], + "error": "replace op shouldn't replace in array with bad number" }, + + { "comment": "test copy with bad number should fail", + "doc": {"baz": [1,2,3], "bar": 1}, + "patch": [{"op": "copy", "from": "/baz/1e0", "path": "/boo"}], + "error": "copy op shouldn't work with bad number" }, + + { "comment": "test move with bad number should fail", + "doc": {"foo": 1, "baz": [1,2,3,4]}, + "patch": [{"op": "move", "from": "/baz/1e0", "path": "/foo"}], + "error": "move op shouldn't work with bad number" }, + + { "comment": "test add with bad number should fail", + "doc": ["foo", "sil"], + "patch": [{"op": "add", "path": "/1e0", "value": "bar"}], + "error": "add op shouldn't add to array with bad number" }, + + { "comment": "missing 'value' parameter to add", + "doc": [ 1 ], + "patch": [ { "op": "add", "path": "/-" } ], + "error": "missing 'value' parameter" }, + + { "comment": "missing 'value' parameter to replace", + "doc": [ 1 ], + "patch": [ { "op": "replace", "path": "/0" } ], + "error": "missing 'value' parameter" }, + + { "comment": "missing 'value' parameter to test", + "doc": [ null ], + "patch": [ { "op": "test", "path": "/0" } ], + "error": "missing 'value' parameter" }, + + { "comment": "missing value parameter to test - where undef is falsy", + "doc": [ false ], + "patch": [ { "op": "test", "path": "/0" } ], + "error": "missing 'value' parameter" }, + + { "comment": "missing from parameter to copy", + "doc": [ 1 ], + "patch": [ { "op": "copy", "path": "/-" } ], + "error": "missing 'from' parameter" }, + + { "comment": "missing from parameter to move", + "doc": { "foo": 1 }, + "patch": [ { "op": "move", "path": "" } ], + "error": "missing 'from' parameter" }, + + { "comment": "duplicate ops", + "doc": { "foo": "bar" }, + "patch": [ { "op": "add", "path": "/baz", "value": "qux", + "op": "move", "from":"/foo" } ], + "error": "patch has two 'op' members", + "disabled": true }, + + { "comment": "unrecognized op should fail", + "doc": {"foo": 1}, + "patch": [{"op": "spam", "path": "/foo", "value": 1}], + "error": "Unrecognized op 'spam'" }, + + { "comment": "test with bad array number that has leading zeros", + "doc": ["foo", "bar"], + "patch": [{"op": "test", "path": "/00", "value": "foo"}], + "error": "test op should reject the array value, it has leading zeros" }, + + { "comment": "test with bad array number that has leading zeros", + "doc": ["foo", "bar"], + "patch": [{"op": "test", "path": "/01", "value": "bar"}], + "error": "test op should reject the array value, it has leading zeros" }, + + { "comment": "Removing nonexistent field", + "doc": {"foo" : "bar"}, + "patch": [{"op": "remove", "path": "/baz"}], + "error": "removing a nonexistent field should fail" }, + + { "comment": "Removing nonexistent index", + "doc": ["foo", "bar"], + "patch": [{"op": "remove", "path": "/2"}], + "error": "removing a nonexistent index should fail" } + +] From 62ba68fc7df3da0e2cd8003b8584d901cdab381f Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 11 Apr 2017 16:38:51 +0200 Subject: [PATCH 032/126] cJSONUtils_ApplyPatches: Fix not accepting arrays This was completely broken, arrays weren't accepted. --- cJSON_Utils.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 92bb0b4e..5d5422de 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -526,12 +526,7 @@ CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON *object, cJSON *patches) { int err = 0; - if (patches == NULL) - { - return 1; - } - - if (cJSON_IsArray(patches)) + if (!cJSON_IsArray(patches)) { /* malformed patches. */ return 1; From d058a9cd8f3314d40bf955aa230e1b943ae83fcb Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 11 Apr 2017 17:40:43 +0200 Subject: [PATCH 033/126] cJSON_ApplyPatches: Don't allow adding to array out of bounds --- cJSON_Utils.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 5d5422de..c193ae5b 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -364,6 +364,44 @@ static int cJSONUtils_Compare(cJSON *a, cJSON *b) return 0; } +/* non broken version of cJSON_InsertItemInArray */ +static cJSON_bool insert_item_in_array(cJSON *array, size_t which, cJSON *newitem) +{ + cJSON *child = array->child; + while (child && (which > 0)) + { + child = child->next; + which--; + } + if (which > 0) + { + /* item is after the end of the array */ + return 0; + } + if (child == NULL) + { + cJSON_AddItemToArray(array, newitem); + return 1; + } + + /* insert into the linked list */ + newitem->next = child; + newitem->prev = child->prev; + child->prev = newitem; + + /* was it at the beginning */ + if (child == array->child) + { + array->child = newitem; + } + else + { + newitem->prev->next = newitem; + } + + return 1; +} + static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) { cJSON *op = NULL; @@ -505,7 +543,12 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) } else { - cJSON_InsertItemInArray(parent, atoi((char*)childptr), value); + if (!insert_item_in_array(parent, (size_t)atoi((char*)childptr), value)) + { + free(parentptr); + cJSON_Delete(value); + return 10; + } } } else if (cJSON_IsObject(parent)) From a1602f484bdb6d2ff25dd09ee08097d757d899d6 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 11 Apr 2017 18:07:19 +0200 Subject: [PATCH 034/126] cJSONUtils_ApplyPatches: Don't accept invalid array indices --- cJSON_Utils.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index c193ae5b..bba3bf3b 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -543,7 +543,25 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) } else { - if (!insert_item_in_array(parent, (size_t)atoi((char*)childptr), value)) + char *end_pointer = NULL; + long int index = strtol((char*)childptr, &end_pointer, 10); + if ((unsigned char*)end_pointer == childptr) + { + /* failed to parse numeric array index */ + free(parentptr); + cJSON_Delete(value); + return 11; + } + + if ((index < 0) || (*end_pointer != '\0')) + { + /* array index is invalid */ + free(parentptr); + cJSON_Delete(value); + return 12; + } + + if (!insert_item_in_array(parent, (size_t)index, value)) { free(parentptr); cJSON_Delete(value); From 8efb287ae214ca98728252025851715d8aa45d4e Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 12 Apr 2017 10:44:29 +0200 Subject: [PATCH 035/126] cJSONUtils_ApplyPatches: Fail if removal failed --- cJSON_Utils.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index bba3bf3b..f089ed47 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -456,10 +456,15 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) if ((opcode == 1) || (opcode == 2)) { /* Get rid of old. */ - cJSON_Delete(cJSONUtils_PatchDetach(object, (unsigned char*)path->valuestring)); + cJSON *old_item = cJSONUtils_PatchDetach(object, (unsigned char*)path->valuestring); + if (old_item == NULL) + { + return 13; + } + cJSON_Delete(old_item); if (opcode == 1) { - /* For Remove, this is job done. */ + /* For Remove, this job is done. */ return 0; } } From b470d918f33c77fe50b5ba85f361fed6ae26e63f Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 12 Apr 2017 11:07:21 +0200 Subject: [PATCH 036/126] cJSONUtils: add decode_array_index_from_pointer as common helper function --- cJSON_Utils.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index f089ed47..b17a2f18 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -262,6 +262,22 @@ static void cJSONUtils_InplaceDecodePointerString(unsigned char *string) *s2 = '\0'; } +static cJSON_bool decode_array_index_from_pointer(const unsigned char * const pointer, size_t * const index) +{ + char *end_pointer = NULL; + long int parsed_index = strtol((const char*)pointer, &end_pointer, 10); + + if (((unsigned char*)end_pointer == pointer) || (parsed_index < 0) || (*end_pointer != '\0')) + { + /* array index is invalid */ + return 0; + } + + *index = (size_t)parsed_index; + + return 1; +} + static cJSON *cJSONUtils_PatchDetach(cJSON *object, const unsigned char *path) { unsigned char *parentptr = NULL; @@ -548,25 +564,15 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) } else { - char *end_pointer = NULL; - long int index = strtol((char*)childptr, &end_pointer, 10); - if ((unsigned char*)end_pointer == childptr) + size_t index = 0; + if (!decode_array_index_from_pointer(childptr, &index)) { - /* failed to parse numeric array index */ free(parentptr); cJSON_Delete(value); return 11; } - if ((index < 0) || (*end_pointer != '\0')) - { - /* array index is invalid */ - free(parentptr); - cJSON_Delete(value); - return 12; - } - - if (!insert_item_in_array(parent, (size_t)index, value)) + if (!insert_item_in_array(parent, index, value)) { free(parentptr); cJSON_Delete(value); From 3056d85f01146ec3f3b4da7a7dd7add010c55e61 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 12 Apr 2017 11:21:21 +0200 Subject: [PATCH 037/126] cJSON_Utils: Use new helper function --- cJSON_Utils.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index b17a2f18..dec06d54 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -278,6 +278,39 @@ static cJSON_bool decode_array_index_from_pointer(const unsigned char * const po return 1; } +/* non-broken cJSON_DetachItemFromArray */ +static cJSON *detach_item_from_array(cJSON *array, size_t which) +{ + cJSON *c = array->child; + while (c && (which > 0)) + { + c = c->next; + which--; + } + if (!c) + { + /* item doesn't exist */ + return NULL; + } + if (c->prev) + { + /* not the first element */ + c->prev->next = c->next; + } + if (c->next) + { + c->next->prev = c->prev; + } + if (c==array->child) + { + array->child = c->next; + } + /* make sure the detached item doesn't point anywhere anymore */ + c->prev = c->next = NULL; + + return c; +} + static cJSON *cJSONUtils_PatchDetach(cJSON *object, const unsigned char *path) { unsigned char *parentptr = NULL; @@ -310,7 +343,13 @@ static cJSON *cJSONUtils_PatchDetach(cJSON *object, const unsigned char *path) } else if (cJSON_IsArray(parent)) { - ret = cJSON_DetachItemFromArray(parent, atoi((char*)childptr)); + size_t index = 0; + if (!decode_array_index_from_pointer(childptr, &index)) + { + free(parentptr); + return NULL; + } + ret = detach_item_from_array(parent, index); } else if (cJSON_IsObject(parent)) { From c960b2b853372bc3dd16b5a182e976df67116953 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 12 Apr 2017 11:21:48 +0200 Subject: [PATCH 038/126] cJSON_Utils: Fix size_t support of cJSONUtils_GetPointer --- cJSON_Utils.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index dec06d54..cb0a9c67 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -194,6 +194,19 @@ CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(cJSON *object, cJSON *ta return NULL; } +/* non broken version of cJSON_GetArrayItem */ +static cJSON *get_array_item(const cJSON *array, size_t item) +{ + cJSON *child = array ? array->child : NULL; + while ((child != NULL) && (item > 0)) + { + item--; + child = child->next; + } + + return child; +} + CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON *object, const char *pointer) { /* follow path of the pointer */ @@ -201,22 +214,18 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON *object, const char *pointer) { if (cJSON_IsArray(object)) { - size_t which = 0; + size_t index = 0; /* parse array index */ while ((*pointer >= '0') && (*pointer <= '9')) { - which = (10 * which) + (size_t)(*pointer++ - '0'); + index = (10 * index) + (size_t)(*pointer++ - '0'); } if (*pointer && (*pointer != '/')) { /* not end of string or new path token */ return NULL; } - if (which > INT_MAX) - { - return NULL; - } - object = cJSON_GetArrayItem(object, (int)which); + object = get_array_item(object, index); } else if (cJSON_IsObject(object)) { From c66342d871ecbae9d644917d8a0f8f8bdabeff62 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 12 Apr 2017 11:36:14 +0200 Subject: [PATCH 039/126] cJSON_Utils: Use enum for opcode --- cJSON_Utils.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index cb0a9c67..e6f8ceb3 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -466,13 +466,15 @@ static cJSON_bool insert_item_in_array(cJSON *array, size_t which, cJSON *newite return 1; } +enum patch_operation { INVALID, ADD, REMOVE, REPLACE, MOVE, COPY, TEST }; + static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) { cJSON *op = NULL; cJSON *path = NULL; cJSON *value = NULL; cJSON *parent = NULL; - int opcode = 0; + enum patch_operation opcode = INVALID; unsigned char *parentptr = NULL; unsigned char *childptr = NULL; @@ -487,23 +489,23 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) /* decode operation */ if (!strcmp(op->valuestring, "add")) { - opcode = 0; + opcode = ADD; } else if (!strcmp(op->valuestring, "remove")) { - opcode = 1; + opcode = REMOVE; } else if (!strcmp(op->valuestring, "replace")) { - opcode = 2; + opcode = REPLACE; } else if (!strcmp(op->valuestring, "move")) { - opcode = 3; + opcode = MOVE; } else if (!strcmp(op->valuestring, "copy")) { - opcode = 4; + opcode = COPY; } else if (!strcmp(op->valuestring, "test")) { @@ -516,8 +518,7 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) return 3; } - /* Remove/Replace */ - if ((opcode == 1) || (opcode == 2)) + if ((opcode == REMOVE) || (opcode == REPLACE)) { /* Get rid of old. */ cJSON *old_item = cJSONUtils_PatchDetach(object, (unsigned char*)path->valuestring); @@ -526,7 +527,7 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) return 13; } cJSON_Delete(old_item); - if (opcode == 1) + if (opcode == REMOVE) { /* For Remove, this job is done. */ return 0; @@ -534,7 +535,7 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) } /* Copy/Move uses "from". */ - if ((opcode == 3) || (opcode == 4)) + if ((opcode == MOVE) || (opcode == COPY)) { cJSON *from = cJSON_GetObjectItem(patch, "from"); if (!from) @@ -543,14 +544,12 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) return 4; } - if (opcode == 3) + if (opcode == MOVE) { - /* move */ value = cJSONUtils_PatchDetach(object, (unsigned char*)from->valuestring); } - if (opcode == 4) + if (opcode == COPY) { - /* copy */ value = cJSONUtils_GetPointer(object, from->valuestring); } if (!value) @@ -558,7 +557,7 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) /* missing "from" for copy/move. */ return 5; } - if (opcode == 4) + if (opcode == COPY) { value = cJSON_Duplicate(value, 1); } From d67b008d4b420a247da269fc5a9c7e4066cbe053 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 12 Apr 2017 12:06:27 +0200 Subject: [PATCH 040/126] decode_array_index_from_pointer: parse manually This allows checking for leading zeroes and invalid characters after the index --- cJSON_Utils.c | 52 ++++++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index e6f8ceb3..da5414ca 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -207,6 +207,33 @@ static cJSON *get_array_item(const cJSON *array, size_t item) return child; } +static cJSON_bool decode_array_index_from_pointer(const unsigned char * const pointer, size_t * const index) +{ + size_t parsed_index = 0; + size_t position = 0; + + if ((pointer[0] == '0') && ((pointer[1] != '\0') && (pointer[1] != '/'))) + { + /* leading zeroes are not permitted */ + return 0; + } + + for (position = 0; (pointer[position] >= '0') && (*pointer <= '9'); position++) + { + parsed_index = (10 * parsed_index) + (size_t)(pointer[position] - '0'); + + } + + if ((pointer[position] != '\0') && (pointer[position] != '/')) + { + return 0; + } + + *index = parsed_index; + + return 1; +} + CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON *object, const char *pointer) { /* follow path of the pointer */ @@ -215,16 +242,11 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON *object, const char *pointer) if (cJSON_IsArray(object)) { size_t index = 0; - /* parse array index */ - while ((*pointer >= '0') && (*pointer <= '9')) - { - index = (10 * index) + (size_t)(*pointer++ - '0'); - } - if (*pointer && (*pointer != '/')) + if (!decode_array_index_from_pointer((const unsigned char*)pointer, &index)) { - /* not end of string or new path token */ return NULL; } + object = get_array_item(object, index); } else if (cJSON_IsObject(object)) @@ -271,22 +293,6 @@ static void cJSONUtils_InplaceDecodePointerString(unsigned char *string) *s2 = '\0'; } -static cJSON_bool decode_array_index_from_pointer(const unsigned char * const pointer, size_t * const index) -{ - char *end_pointer = NULL; - long int parsed_index = strtol((const char*)pointer, &end_pointer, 10); - - if (((unsigned char*)end_pointer == pointer) || (parsed_index < 0) || (*end_pointer != '\0')) - { - /* array index is invalid */ - return 0; - } - - *index = (size_t)parsed_index; - - return 1; -} - /* non-broken cJSON_DetachItemFromArray */ static cJSON *detach_item_from_array(cJSON *array, size_t which) { From 02a05eea4e6ba41811f130b322660bea8918e1a0 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 12 Apr 2017 20:47:59 +0200 Subject: [PATCH 041/126] cJSON: Add cJSON_malloc and cJSON_free --- cJSON.c | 10 ++++++++++ cJSON.h | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/cJSON.c b/cJSON.c index bc343ba3..a25556d5 100644 --- a/cJSON.c +++ b/cJSON.c @@ -2585,3 +2585,13 @@ CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * cons return false; } } + +CJSON_PUBLIC(void *) cJSON_malloc(size_t size) +{ + return global_hooks.allocate(size); +} + +CJSON_PUBLIC(void) cJSON_free(void *object) +{ + global_hooks.deallocate(object); +} diff --git a/cJSON.h b/cJSON.h index c29ba172..0ddab6f3 100644 --- a/cJSON.h +++ b/cJSON.h @@ -241,6 +241,10 @@ CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number); /* Macro for iterating over an array */ #define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next) +/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */ +CJSON_PUBLIC(void *) cJSON_malloc(size_t size); +CJSON_PUBLIC(void) cJSON_free(void *object); + #ifdef __cplusplus } #endif From 134ebf5e891a52503123b88965938c4637890321 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 12 Apr 2017 19:14:07 +0200 Subject: [PATCH 042/126] cJSONUtils_ApplyPatches: Handle replacement of root --- cJSON_Utils.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index da5414ca..aac2b07b 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -486,7 +486,7 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) op = cJSON_GetObjectItem(patch, "op"); path = cJSON_GetObjectItem(patch, "path"); - if (!op || !path) + if (!cJSON_IsString(op) || !cJSON_IsString(path)) { /* malformed patch. */ return 2; @@ -524,6 +524,81 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) return 3; } + /* special case for replacing the root */ + if (path->valuestring[0] == '\0') + { + if (opcode == REMOVE) + { + /* remove possible children */ + if (object->child != NULL) + { + cJSON_Delete(object->child); + } + + /* remove other allocated resources */ + if (object->string != NULL) + { + cJSON_free(object->string); + } + if (object->valuestring != NULL) + { + cJSON_free(object->valuestring); + } + + /* make it invalid */ + memset(object, '\0', sizeof(cJSON)); + + return 0; + } + + if ((opcode == REPLACE) || (opcode == ADD)) + { + /* remove possible children */ + if (object->child != NULL) + { + cJSON_Delete(object->child); + } + + /* remove other allocated resources */ + if (object->string != NULL) + { + cJSON_free(object->string); + } + if (object->valuestring != NULL) + { + cJSON_free(object->valuestring); + } + + value = cJSON_GetObjectItem(patch, "value"); + if (value == NULL) + { + /* missing "value" for add/replace. */ + return 7; + } + + value = cJSON_Duplicate(value, 1); + if (value == NULL) + { + /* out of memory for add/replace. */ + return 8; + } + /* the string "value" isn't needed */ + if (value->string != NULL) + { + cJSON_free(value->string); + value->string = NULL; + } + + /* copy over the value object */ + memcpy(object, value, sizeof(cJSON)); + + /* delete the duplicated value */ + cJSON_free(value); + + return 0; + } + } + if ((opcode == REMOVE) || (opcode == REPLACE)) { /* Get rid of old. */ From ba7b48b3f3a15fe94f4f5a3bf2aa7fc3bafe25e8 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 12 Apr 2017 19:15:53 +0200 Subject: [PATCH 043/126] Enable json-patch-tests tests --- tests/CMakeLists.txt | 24 ++++++ tests/json_patch_tests.c | 162 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 186 insertions(+) create mode 100644 tests/json_patch_tests.c diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index bb7c6fa3..ff56a92b 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -75,4 +75,28 @@ if(ENABLE_CJSON_TEST) endforeach() add_dependencies(check ${unity_tests}) + + if (ENABLE_CJSON_UTILS) + #copy test files + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/json-patch-tests") + file(GLOB test_files "json-patch-tests/*") + file(COPY ${test_files} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/json-patch-tests/") + + set (cjson_utils_tests + json_patch_tests) + + foreach (cjson_utils_test ${cjson_utils_tests}) + add_executable("${cjson_utils_test}" "${cjson_utils_test}.c") + target_link_libraries("${cjson_utils_test}" "${CJSON_LIB}" "${CJSON_UTILS_LIB}" unity test-common) + if(MEMORYCHECK_COMMAND) + add_test(NAME "${cjson_utils_test}" + COMMAND "${MEMORYCHECK_COMMAND}" ${MEMORYCHECK_COMMAND_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}/${cjson_utils_test}") + else() + add_test(NAME "${cjson_utils_test}" + COMMAND "./${cjson_utils_test}") + endif() + endforeach() + + add_dependencies(check ${cjson_utils_tests}) + endif() endif() diff --git a/tests/json_patch_tests.c b/tests/json_patch_tests.c new file mode 100644 index 00000000..a1c03ebb --- /dev/null +++ b/tests/json_patch_tests.c @@ -0,0 +1,162 @@ +/* + 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. +*/ + +#include +#include +#include + +#include "unity/examples/unity_config.h" +#include "unity/src/unity.h" +#include "common.h" +#include "../cJSON_Utils.h" + +static cJSON *parse_test_file(const char * const filename) +{ + char *file = NULL; + cJSON *json = NULL; + + file = read_file(filename); + TEST_ASSERT_NOT_NULL_MESSAGE(file, "Failed to read file."); + + json = cJSON_Parse(file); + TEST_ASSERT_NOT_NULL_MESSAGE(json, "Failed to parse test json."); + TEST_ASSERT_TRUE_MESSAGE(cJSON_IsArray(json), "Json is not an array."); + + free(file); + + return json; +} + +static cJSON_bool test_apply_patch(const cJSON * const test) +{ + cJSON *doc = NULL; + cJSON *patch = NULL; + cJSON *expected = NULL; + cJSON *error_element = NULL; + cJSON *comment = NULL; + cJSON *disabled = NULL; + + cJSON *object = NULL; + cJSON_bool successful = false; + + /* extract all the data out of the test */ + comment = cJSON_GetObjectItem(test, "comment"); + if (cJSON_IsString(comment)) + { + printf("Testing \"%s\"\n", comment->valuestring); + } + else + { + printf("Testing unkown\n"); + } + + disabled = cJSON_GetObjectItem(test, "disabled"); + if (cJSON_IsTrue(disabled)) + { + printf("SKIPPED\n"); + return true; + } + + doc = cJSON_GetObjectItem(test, "doc"); + TEST_ASSERT_NOT_NULL_MESSAGE(doc, "No \"doc\" in the test."); + patch = cJSON_GetObjectItem(test, "patch"); + TEST_ASSERT_NOT_NULL_MESSAGE(patch, "No \"patch\"in the test."); + /* Make a working copy of 'doc' */ + object = cJSON_Duplicate(doc, true); + TEST_ASSERT_NOT_NULL(object); + + expected = cJSON_GetObjectItem(test, "expected"); + error_element = cJSON_GetObjectItem(test, "error"); + if (error_element != NULL) + { + /* excepting an error */ + TEST_ASSERT_TRUE_MESSAGE(0 != cJSONUtils_ApplyPatches(object, patch), "Test didn't fail as it's supposed to."); + + successful = true; + } + else + { + /* apply the patch */ + TEST_ASSERT_EQUAL_INT_MESSAGE(0, cJSONUtils_ApplyPatches(object, patch), "Failed to apply patches."); + successful = true; + + if (expected != NULL) + { + successful = cJSON_Compare(object, expected, true); + } + } + + cJSON_Delete(object); + + if (successful) + { + printf("OK\n"); + } + else + { + printf("FAILED\n"); + } + + return successful; +} + +static void cjson_utils_should_pass_json_patch_test_tests(void) +{ + cJSON *tests = parse_test_file("json-patch-tests/tests.json"); + cJSON *test = NULL; + + cJSON_bool failed = false; + cJSON_ArrayForEach(test, tests) + { + failed |= !test_apply_patch(test); + } + + cJSON_Delete(tests); + + TEST_ASSERT_FALSE_MESSAGE(failed, "Some tests failed."); +} + +static void cjson_utils_should_pass_json_patch_test_spec_tests(void) +{ + cJSON *tests = parse_test_file("json-patch-tests/spec_tests.json"); + cJSON *test = NULL; + + cJSON_bool failed = false; + cJSON_ArrayForEach(test, tests) + { + failed |= !test_apply_patch(test); + } + + cJSON_Delete(tests); + + TEST_ASSERT_FALSE_MESSAGE(failed, "Some tests failed."); +} + +int main(void) +{ + UNITY_BEGIN(); + + RUN_TEST(cjson_utils_should_pass_json_patch_test_tests); + RUN_TEST(cjson_utils_should_pass_json_patch_test_spec_tests); + + return UNITY_END(); +} From 609bb754217da5e3563888d0db1ff8c45c3a53bf Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 12 Apr 2017 21:28:31 +0200 Subject: [PATCH 044/126] cJSON_Utils: Use cJSON_free and cJSON_malloc --- cJSON_Utils.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index aac2b07b..5b8476cc 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -36,7 +36,7 @@ static unsigned char* cJSONUtils_strdup(const unsigned char* str) unsigned char *copy = NULL; len = strlen((const char*)str) + 1; - if (!(copy = (unsigned char*)malloc(len))) + if (!(copy = (unsigned char*)cJSON_malloc(len))) { return NULL; } @@ -159,33 +159,33 @@ CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(cJSON *object, cJSON *ta if (cJSON_IsArray(object)) { /* reserve enough memory for a 64 bit integer + '/' and '\0' */ - unsigned char *ret = (unsigned char*)malloc(strlen((char*)found) + 23); + unsigned char *ret = (unsigned char*)cJSON_malloc(strlen((char*)found) + 23); /* check if conversion to unsigned long is valid * This should be eliminated at compile time by dead code elimination * if size_t is an alias of unsigned long, or if it is bigger */ if (c > ULONG_MAX) { - free(found); + cJSON_free(found); return NULL; } sprintf((char*)ret, "/%lu%s", (unsigned long)c, found); /* / */ - free(found); + cJSON_free(found); return (char*)ret; } else if (cJSON_IsObject(object)) { - unsigned char *ret = (unsigned char*)malloc(strlen((char*)found) + cJSONUtils_PointerEncodedstrlen((unsigned char*)obj->string) + 2); + unsigned char *ret = (unsigned char*)cJSON_malloc(strlen((char*)found) + cJSONUtils_PointerEncodedstrlen((unsigned char*)obj->string) + 2); *ret = '/'; cJSONUtils_PointerEncodedstrcpy(ret + 1, (unsigned char*)obj->string); strcat((char*)ret, (char*)found); - free(found); + cJSON_free(found); return (char*)ret; } /* reached leaf of the tree, found nothing */ - free(found); + cJSON_free(found); return NULL; } } @@ -342,7 +342,7 @@ static cJSON *cJSONUtils_PatchDetach(cJSON *object, const unsigned char *path) childptr = (unsigned char*)strrchr((char*)parentptr, '/'); /* last '/' */ if (childptr == NULL) { - free(parentptr); + cJSON_free(parentptr); return NULL; } /* split strings */ @@ -361,7 +361,7 @@ static cJSON *cJSONUtils_PatchDetach(cJSON *object, const unsigned char *path) size_t index = 0; if (!decode_array_index_from_pointer(childptr, &index)) { - free(parentptr); + cJSON_free(parentptr); return NULL; } ret = detach_item_from_array(parent, index); @@ -370,7 +370,7 @@ static cJSON *cJSONUtils_PatchDetach(cJSON *object, const unsigned char *path) { ret = cJSON_DetachItemFromObject(parent, (char*)childptr); } - free(parentptr); + cJSON_free(parentptr); /* return the detachted item */ return ret; @@ -753,7 +753,7 @@ static void cJSONUtils_GeneratePatch(cJSON *patches, const unsigned char *op, co cJSON_AddItemToObject(patch, "op", cJSON_CreateString((const char*)op)); if (suffix) { - unsigned char *newpath = (unsigned char*)malloc(strlen((const char*)path) + cJSONUtils_PointerEncodedstrlen(suffix) + 2); + unsigned char *newpath = (unsigned char*)cJSON_malloc(strlen((const char*)path) + cJSONUtils_PointerEncodedstrlen(suffix) + 2); cJSONUtils_PointerEncodedstrcpy(newpath + sprintf((char*)newpath, "%s/", (const char*)path), suffix); cJSON_AddItemToObject(patch, "path", cJSON_CreateString((const char*)newpath)); free(newpath); @@ -806,7 +806,7 @@ static void cJSONUtils_CompareToPatch(cJSON *patches, const unsigned char *path, case cJSON_Array: { size_t c = 0; - unsigned char *newpath = (unsigned char*)malloc(strlen((const char*)path) + 23); /* Allow space for 64bit int. */ + unsigned char *newpath = (unsigned char*)cJSON_malloc(strlen((const char*)path) + 23); /* Allow space for 64bit int. */ /* generate patches for all array elements that exist in "from" and "to" */ for ((void)(c = 0), (void)(from = from->child), to = to->child; from && to; (void)(from = from->next), (void)(to = to->next), c++) { @@ -860,7 +860,7 @@ static void cJSONUtils_CompareToPatch(cJSON *patches, const unsigned char *path, if (!diff) { /* both object keys are the same */ - unsigned char *newpath = (unsigned char*)malloc(strlen((const char*)path) + cJSONUtils_PointerEncodedstrlen((unsigned char*)a->string) + 2); + unsigned char *newpath = (unsigned char*)cJSON_malloc(strlen((const char*)path) + cJSONUtils_PointerEncodedstrlen((unsigned char*)a->string) + 2); cJSONUtils_PointerEncodedstrcpy(newpath + sprintf((char*)newpath, "%s/", path), (unsigned char*)a->string); /* create a patch for the element */ cJSONUtils_CompareToPatch(patches, newpath, a, b); From 8fd46d51b14eb09e1f9d9ed56edc1f30a71a7920 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 12 Apr 2017 21:49:36 +0200 Subject: [PATCH 045/126] Put generated files in library_config subdirectory --- CMakeLists.txt | 8 ++++---- .../cJSONConfig.cmake.in | 0 .../cJSONConfigVersion.cmake.in | 0 libcjson.pc.in => library_config/libcjson.pc.in | 0 .../libcjson_utils.pc.in | 0 5 files changed, 4 insertions(+), 4 deletions(-) rename cJSONConfig.cmake.in => library_config/cJSONConfig.cmake.in (100%) rename cJSONConfigVersion.cmake.in => library_config/cJSONConfigVersion.cmake.in (100%) rename libcjson.pc.in => library_config/libcjson.pc.in (100%) rename libcjson_utils.pc.in => library_config/libcjson_utils.pc.in (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a8d14ad..4fd5aa45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,7 +103,7 @@ if (NOT WIN32) target_link_libraries("${CJSON_LIB}" m) endif() -configure_file("${CMAKE_CURRENT_SOURCE_DIR}/libcjson.pc.in" +configure_file("${CMAKE_CURRENT_SOURCE_DIR}/library_config/libcjson.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libcjson.pc" @ONLY) install(FILES cJSON.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/cjson") @@ -130,7 +130,7 @@ if(ENABLE_CJSON_UTILS) add_library("${CJSON_UTILS_LIB}" "${HEADERS_UTILS}" "${SOURCES_UTILS}") target_link_libraries("${CJSON_UTILS_LIB}" "${CJSON_LIB}") - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/libcjson_utils.pc.in" + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/library_config/libcjson_utils.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libcjson_utils.pc" @ONLY) install(TARGETS "${CJSON_UTILS_LIB}" DESTINATION "${CMAKE_INSTALL_LIBDIR}" EXPORT "${CJSON_UTILS_LIB}") @@ -149,10 +149,10 @@ endif() # create the other package config files configure_file( - cJSONConfig.cmake.in + "${CMAKE_CURRENT_SOURCE_DIR}/library_config/cJSONConfig.cmake.in" ${PROJECT_BINARY_DIR}/cJSONConfig.cmake @ONLY) configure_file( - cJSONConfigVersion.cmake.in + "${CMAKE_CURRENT_SOURCE_DIR}/library_config/cJSONConfigVersion.cmake.in" ${PROJECT_BINARY_DIR}/cJSONConfigVersion.cmake @ONLY) # Install package config files diff --git a/cJSONConfig.cmake.in b/library_config/cJSONConfig.cmake.in similarity index 100% rename from cJSONConfig.cmake.in rename to library_config/cJSONConfig.cmake.in diff --git a/cJSONConfigVersion.cmake.in b/library_config/cJSONConfigVersion.cmake.in similarity index 100% rename from cJSONConfigVersion.cmake.in rename to library_config/cJSONConfigVersion.cmake.in diff --git a/libcjson.pc.in b/library_config/libcjson.pc.in similarity index 100% rename from libcjson.pc.in rename to library_config/libcjson.pc.in diff --git a/libcjson_utils.pc.in b/library_config/libcjson_utils.pc.in similarity index 100% rename from libcjson_utils.pc.in rename to library_config/libcjson_utils.pc.in From 49ebc85e7a4b15e241cd31843394133360980b8e Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Thu, 13 Apr 2017 20:15:25 +0200 Subject: [PATCH 046/126] Move ApplyPatch tests from test_utils.c to json. --- test_utils.c | 15 ---- tests/json-patch-tests/cjson-utils-tests.json | 84 +++++++++++++++++++ tests/json_patch_tests.c | 17 ++++ 3 files changed, 101 insertions(+), 15 deletions(-) create mode 100644 tests/json-patch-tests/cjson-utils-tests.json diff --git a/test_utils.c b/test_utils.c index 4e0091c6..032882ef 100644 --- a/test_utils.c +++ b/test_utils.c @@ -114,21 +114,6 @@ int main(void) } cJSON_Delete(root); - - printf("JSON Apply Patch Tests\n"); - for (i = 0; i < 15; i++) - { - cJSON *object_to_be_patched = cJSON_Parse(patches[i][0]); - cJSON *patch = cJSON_Parse(patches[i][1]); - int err = cJSONUtils_ApplyPatches(object_to_be_patched, patch); - char *output = cJSON_Print(object_to_be_patched); - printf("Test %d (err %d):\n%s\n\n", i + 1, err, output); - - free(output); - cJSON_Delete(object_to_be_patched); - cJSON_Delete(patch); - } - /* JSON Generate Patch tests: */ printf("JSON Generate Patch Tests\n"); for (i = 0; i < 15; i++) diff --git a/tests/json-patch-tests/cjson-utils-tests.json b/tests/json-patch-tests/cjson-utils-tests.json new file mode 100644 index 00000000..80377733 --- /dev/null +++ b/tests/json-patch-tests/cjson-utils-tests.json @@ -0,0 +1,84 @@ +[ + { + "comment": "1", + "doc": { "foo": "bar"}, + "patch": [{ "op": "add", "path": "/baz", "value": "qux" }], + "expected": {"baz": "qux", "foo": "bar"} + }, + { + "comment": "2", + "doc": { "foo": [ "bar", "baz" ] }, + "patch": [{ "op": "add", "path": "/foo/1", "value": "qux" }], + "expected": {"foo": [ "bar", "qux", "baz" ] } + }, + { + "comment": "3", + "doc": {"baz": "qux","foo": "bar"}, + "patch": [{ "op": "remove", "path": "/baz" }], + "expected": {"foo": "bar" } + }, + { + "comment": "4", + "doc": { "foo": [ "bar", "qux", "baz" ] }, + "patch": [{ "op": "remove", "path": "/foo/1" }], + "expected": {"foo": [ "bar", "baz" ] } + }, + { + "comment": "5", + "doc": { "baz": "qux","foo": "bar"}, + "patch": [{ "op": "replace", "path": "/baz", "value": "boo" }], + "expected": {"baz": "boo","foo": "bar"} + }, + { + "comment": "6", + "doc": {"foo": {"bar": "baz","waldo": "fred"},"qux": {"corge": "grault"}}, + "patch": [{ "op": "move", "from": "/foo/waldo", "path": "/qux/thud" }], + "expected": {"foo": {"bar": "baz"},"qux": {"corge": "grault","thud": "fred"}} + }, + { + "comment": "7", + "doc": { "foo": [ "all", "grass", "cows", "eat" ] }, + "patch": [ { "op": "move", "from": "/foo/1", "path": "/foo/3" }], + "expected": { "foo": [ "all", "cows", "eat", "grass" ] } + }, + { + "comment": "8", + "doc": {"baz": "qux","foo": [ "a", 2, "c" ]}, + "patch": [{ "op": "test", "path": "/baz", "value": "qux" },{ "op": "test", "path": "/foo/1", "value": 2 }] + }, + { + "comment": "9", + "doc": { "baz": "qux" }, + "patch": [ { "op": "test", "path": "/baz", "value": "bar" }], + "error": "\"bar\" doesn't exist" + }, + { + "comment": "10", + "doc": { "foo": "bar" }, + "patch": [{ "op": "add", "path": "/child", "value": { "grandchild": { } } }], + "expected": {"foo": "bar","child": {"grandchild": {}}} + }, + { + "comment": "11", + "doc": { "foo": "bar" }, + "patch": [{ "op": "add", "path": "/baz", "value": "qux", "xyz": 123 }], + "expected": {"foo": "bar","baz": "qux"} + }, + { + "comment": "12", + "doc": { "foo": "bar" }, + "patch": [{ "op": "add", "path": "/baz/bat", "value": "qux" }], + "error": "Can't add to nonexistent object" + }, + { + "comment": "13", + "doc": {"/": 9,"~1": 10}, + "patch": [{"op": "test", "path": "/~01", "value": 10}] + }, + { + "comment": "14", + "doc": { "foo": ["bar"] }, + "patch": [ { "op": "add", "path": "/foo/-", "value": ["abc", "def"] }], + "expected": {"foo": ["bar", ["abc", "def"]] } + } +] diff --git a/tests/json_patch_tests.c b/tests/json_patch_tests.c index a1c03ebb..dc13cce2 100644 --- a/tests/json_patch_tests.c +++ b/tests/json_patch_tests.c @@ -151,12 +151,29 @@ static void cjson_utils_should_pass_json_patch_test_spec_tests(void) TEST_ASSERT_FALSE_MESSAGE(failed, "Some tests failed."); } +static void cjson_utils_should_pass_json_patch_test_cjson_utils_tests(void) +{ + cJSON *tests = parse_test_file("json-patch-tests/cjson-utils-tests.json"); + cJSON *test = NULL; + + cJSON_bool failed = false; + cJSON_ArrayForEach(test, tests) + { + failed |= !test_apply_patch(test); + } + + cJSON_Delete(tests); + + TEST_ASSERT_FALSE_MESSAGE(failed, "Some tests failed."); +} + int main(void) { UNITY_BEGIN(); RUN_TEST(cjson_utils_should_pass_json_patch_test_tests); RUN_TEST(cjson_utils_should_pass_json_patch_test_spec_tests); + RUN_TEST(cjson_utils_should_pass_json_patch_test_cjson_utils_tests); return UNITY_END(); } From 6ccfd5d60386780a19c671f6be12f46d820a06ed Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 18 Apr 2017 14:11:14 +0200 Subject: [PATCH 047/126] tests: Move most of test_utils.c to old_utils_tests --- test_utils.c | 135 -------------------------- tests/CMakeLists.txt | 3 +- tests/old_utils_tests.c | 205 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 207 insertions(+), 136 deletions(-) create mode 100644 tests/old_utils_tests.c diff --git a/test_utils.c b/test_utils.c index 032882ef..22024b03 100644 --- a/test_utils.c +++ b/test_utils.c @@ -28,28 +28,7 @@ int main(void) { /* Some variables */ - char *temp = NULL; - char *patchtext = NULL; - char *patchedtext = NULL; - int i = 0; - /* JSON Pointer tests: */ - cJSON *root = NULL; - const char *json= - "{" - "\"foo\": [\"bar\", \"baz\"]," - "\"\": 0," - "\"a/b\": 1," - "\"c%d\": 2," - "\"e^f\": 3," - "\"g|h\": 4," - "\"i\\\\j\": 5," - "\"k\\\"l\": 6," - "\" \": 7," - "\"m~n\": 8" - "}"; - - const char *tests[12] = {"","/foo","/foo/0","/","/a~1b","/c%d","/e^f","/g|h","/i\\j","/k\"l","/ ","/m~0n"}; /* JSON Apply Patch tests: */ const char *patches[15][3] = @@ -71,49 +50,6 @@ int main(void) {"{ \"foo\": [\"bar\"] }","[ { \"op\": \"add\", \"path\": \"/foo/-\", \"value\": [\"abc\", \"def\"] }]","{\"foo\": [\"bar\", [\"abc\", \"def\"]] }"} }; - /* JSON Apply Merge tests: */ - const char *merges[15][3] = - { - {"{\"a\":\"b\"}", "{\"a\":\"c\"}", "{\"a\":\"c\"}"}, - {"{\"a\":\"b\"}", "{\"b\":\"c\"}", "{\"a\":\"b\",\"b\":\"c\"}"}, - {"{\"a\":\"b\"}", "{\"a\":null}", "{}"}, - {"{\"a\":\"b\",\"b\":\"c\"}", "{\"a\":null}", "{\"b\":\"c\"}"}, - {"{\"a\":[\"b\"]}", "{\"a\":\"c\"}", "{\"a\":\"c\"}"}, - {"{\"a\":\"c\"}", "{\"a\":[\"b\"]}", "{\"a\":[\"b\"]}"}, - {"{\"a\":{\"b\":\"c\"}}", "{\"a\":{\"b\":\"d\",\"c\":null}}", "{\"a\":{\"b\":\"d\"}}"}, - {"{\"a\":[{\"b\":\"c\"}]}", "{\"a\":[1]}", "{\"a\":[1]}"}, - {"[\"a\",\"b\"]", "[\"c\",\"d\"]", "[\"c\",\"d\"]"}, - {"{\"a\":\"b\"}", "[\"c\"]", "[\"c\"]"}, - {"{\"a\":\"foo\"}", "null", "null"}, - {"{\"a\":\"foo\"}", "\"bar\"", "\"bar\""}, - {"{\"e\":null}", "{\"a\":1}", "{\"e\":null,\"a\":1}"}, - {"[1,2]", "{\"a\":\"b\",\"c\":null}", "{\"a\":\"b\"}"}, - {"{}","{\"a\":{\"bb\":{\"ccc\":null}}}", "{\"a\":{\"bb\":{}}}"} - }; - - - /* Misc tests */ - int numbers[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - const char *random = "QWERTYUIOPASDFGHJKLZXCVBNM"; - char buf[2] = {0,0}; - char *before = NULL; - char *after = NULL; - cJSON *object = NULL; - cJSON *nums = NULL; - cJSON *num6 = NULL; - cJSON *sortme = NULL; - - - printf("JSON Pointer Tests\n"); - root = cJSON_Parse(json); - for (i = 0; i < 12; i++) - { - char *output = cJSON_Print(cJSONUtils_GetPointer(root, tests[i])); - printf("Test %d:\n%s\n\n", i + 1, output); - free(output); - } - cJSON_Delete(root); - /* JSON Generate Patch tests: */ printf("JSON Generate Patch Tests\n"); for (i = 0; i < 15; i++) @@ -138,76 +74,5 @@ int main(void) cJSON_Delete(patch); } - /* Misc tests: */ - printf("JSON Pointer construct\n"); - object = cJSON_CreateObject(); - nums = cJSON_CreateIntArray(numbers, 10); - num6 = cJSON_GetArrayItem(nums, 6); - cJSON_AddItemToObject(object, "numbers", nums); - temp = cJSONUtils_FindPointerFromObjectTo(object, num6); - printf("Pointer: [%s]\n", temp); - free(temp); - temp = cJSONUtils_FindPointerFromObjectTo(object, nums); - printf("Pointer: [%s]\n", temp); - free(temp); - temp = cJSONUtils_FindPointerFromObjectTo(object, object); - printf("Pointer: [%s]\n", temp); - free(temp); - cJSON_Delete(object); - - /* JSON Sort test: */ - sortme = cJSON_CreateObject(); - for (i = 0; i < 26; i++) - { - buf[0] = random[i]; - cJSON_AddItemToObject(sortme, buf, cJSON_CreateNumber(1)); - } - before = cJSON_PrintUnformatted(sortme); - cJSONUtils_SortObject(sortme); - after = cJSON_PrintUnformatted(sortme); - printf("Before: [%s]\nAfter: [%s]\n\n", before, after); - - free(before); - free(after); - cJSON_Delete(sortme); - - /* Merge tests: */ - printf("JSON Merge Patch tests\n"); - for (i = 0; i < 15; i++) - { - cJSON *object_to_be_merged = cJSON_Parse(merges[i][0]); - cJSON *patch = cJSON_Parse(merges[i][1]); - char *before_merge = cJSON_PrintUnformatted(object_to_be_merged); - patchtext = cJSON_PrintUnformatted(patch); - printf("Before: [%s] -> [%s] = ", before_merge, patchtext); - object_to_be_merged = cJSONUtils_MergePatch(object_to_be_merged, patch); - after = cJSON_PrintUnformatted(object_to_be_merged); - printf("[%s] vs [%s] (%s)\n", after, merges[i][2], strcmp(after, merges[i][2]) ? "FAIL" : "OK"); - - free(before_merge); - free(patchtext); - free(after); - cJSON_Delete(object_to_be_merged); - cJSON_Delete(patch); - } - - /* Generate Merge tests: */ - for (i = 0; i < 15; i++) - { - cJSON *from = cJSON_Parse(merges[i][0]); - cJSON *to = cJSON_Parse(merges[i][2]); - cJSON *patch = cJSONUtils_GenerateMergePatch(from,to); - from = cJSONUtils_MergePatch(from,patch); - patchtext = cJSON_PrintUnformatted(patch); - patchedtext = cJSON_PrintUnformatted(from); - printf("Patch [%s] vs [%s] = [%s] vs [%s] (%s)\n", patchtext, merges[i][1], patchedtext, merges[i][2], strcmp(patchedtext, merges[i][2]) ? "FAIL" : "OK"); - - cJSON_Delete(from); - cJSON_Delete(to); - cJSON_Delete(patch); - free(patchtext); - free(patchedtext); - } - return 0; } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ff56a92b..5dee1af7 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -83,7 +83,8 @@ if(ENABLE_CJSON_TEST) file(COPY ${test_files} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/json-patch-tests/") set (cjson_utils_tests - json_patch_tests) + json_patch_tests + old_utils_tests) foreach (cjson_utils_test ${cjson_utils_tests}) add_executable("${cjson_utils_test}" "${cjson_utils_test}.c") diff --git a/tests/old_utils_tests.c b/tests/old_utils_tests.c new file mode 100644 index 00000000..eb7e4bfc --- /dev/null +++ b/tests/old_utils_tests.c @@ -0,0 +1,205 @@ +/* + 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. +*/ + +#include +#include +#include + +#include "unity/examples/unity_config.h" +#include "unity/src/unity.h" +#include "common.h" +#include "../cJSON_Utils.h" + +/* JSON Apply Merge tests: */ +const char *merges[15][3] = +{ + {"{\"a\":\"b\"}", "{\"a\":\"c\"}", "{\"a\":\"c\"}"}, + {"{\"a\":\"b\"}", "{\"b\":\"c\"}", "{\"a\":\"b\",\"b\":\"c\"}"}, + {"{\"a\":\"b\"}", "{\"a\":null}", "{}"}, + {"{\"a\":\"b\",\"b\":\"c\"}", "{\"a\":null}", "{\"b\":\"c\"}"}, + {"{\"a\":[\"b\"]}", "{\"a\":\"c\"}", "{\"a\":\"c\"}"}, + {"{\"a\":\"c\"}", "{\"a\":[\"b\"]}", "{\"a\":[\"b\"]}"}, + {"{\"a\":{\"b\":\"c\"}}", "{\"a\":{\"b\":\"d\",\"c\":null}}", "{\"a\":{\"b\":\"d\"}}"}, + {"{\"a\":[{\"b\":\"c\"}]}", "{\"a\":[1]}", "{\"a\":[1]}"}, + {"[\"a\",\"b\"]", "[\"c\",\"d\"]", "[\"c\",\"d\"]"}, + {"{\"a\":\"b\"}", "[\"c\"]", "[\"c\"]"}, + {"{\"a\":\"foo\"}", "null", "null"}, + {"{\"a\":\"foo\"}", "\"bar\"", "\"bar\""}, + {"{\"e\":null}", "{\"a\":1}", "{\"e\":null,\"a\":1}"}, + {"[1,2]", "{\"a\":\"b\",\"c\":null}", "{\"a\":\"b\"}"}, + {"{}","{\"a\":{\"bb\":{\"ccc\":null}}}", "{\"a\":{\"bb\":{}}}"} +}; + +static void json_pointer_tests(void) +{ + cJSON *root = NULL; + const char *json= + "{" + "\"foo\": [\"bar\", \"baz\"]," + "\"\": 0," + "\"a/b\": 1," + "\"c%d\": 2," + "\"e^f\": 3," + "\"g|h\": 4," + "\"i\\\\j\": 5," + "\"k\\\"l\": 6," + "\" \": 7," + "\"m~n\": 8" + "}"; + + root = cJSON_Parse(json); + + TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, ""), root); + TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/foo"), cJSON_GetObjectItem(root, "foo")); + TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/foo/0"), cJSON_GetObjectItem(root, "foo")->child); + TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/foo/0"), cJSON_GetObjectItem(root, "foo")->child); + TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/"), cJSON_GetObjectItem(root, "")); + TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/a~1b"), cJSON_GetObjectItem(root, "a/b")); + TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/c%d"), cJSON_GetObjectItem(root, "c%d")); + TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/c^f"), cJSON_GetObjectItem(root, "c^f")); + TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/c|f"), cJSON_GetObjectItem(root, "c|f")); + TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/i\\j"), cJSON_GetObjectItem(root, "i\\j")); + TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/k\"l"), cJSON_GetObjectItem(root, "k\"l")); + TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/ "), cJSON_GetObjectItem(root, " ")); + TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/m~0n"), cJSON_GetObjectItem(root, "m~n")); + + cJSON_Delete(root); +} + +static void misc_tests(void) +{ + /* Misc tests */ + int numbers[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + cJSON *object = NULL; + cJSON *nums = NULL; + cJSON *num6 = NULL; + char *pointer = NULL; + + printf("JSON Pointer construct\n"); + object = cJSON_CreateObject(); + nums = cJSON_CreateIntArray(numbers, 10); + num6 = cJSON_GetArrayItem(nums, 6); + cJSON_AddItemToObject(object, "numbers", nums); + + pointer = cJSONUtils_FindPointerFromObjectTo(object, num6); + TEST_ASSERT_EQUAL_STRING("/numbers/6", pointer); + free(pointer); + + pointer = cJSONUtils_FindPointerFromObjectTo(object, nums); + TEST_ASSERT_EQUAL_STRING("/numbers", pointer); + free(pointer); + + pointer = cJSONUtils_FindPointerFromObjectTo(object, object); + TEST_ASSERT_EQUAL_STRING("", pointer); + free(pointer); + + cJSON_Delete(object); +} + +static void sort_tests(void) +{ + /* Misc tests */ + const char *random = "QWERTYUIOPASDFGHJKLZXCVBNM"; + char buf[2] = {'\0', '\0'}; + cJSON *sortme = NULL; + size_t i = 0; + cJSON *current_element = NULL; + + /* JSON Sort test: */ + sortme = cJSON_CreateObject(); + for (i = 0; i < 26; i++) + { + buf[0] = random[i]; + cJSON_AddItemToObject(sortme, buf, cJSON_CreateNumber(1)); + } + + cJSONUtils_SortObject(sortme); + + /* check sorting */ + current_element = sortme->child->next; + for (i = 1; (i < 26) && (current_element != NULL) && (current_element->prev != NULL); i++) + { + TEST_ASSERT_TRUE(current_element->string[0] >= current_element->prev->string[0]); + current_element = current_element->next; + } + + cJSON_Delete(sortme); +} + +static void merge_tests(void) +{ + size_t i = 0; + char *patchtext = NULL; + char *after = NULL; + + /* Merge tests: */ + printf("JSON Merge Patch tests\n"); + for (i = 0; i < 15; i++) + { + cJSON *object_to_be_merged = cJSON_Parse(merges[i][0]); + cJSON *patch = cJSON_Parse(merges[i][1]); + patchtext = cJSON_PrintUnformatted(patch); + object_to_be_merged = cJSONUtils_MergePatch(object_to_be_merged, patch); + after = cJSON_PrintUnformatted(object_to_be_merged); + TEST_ASSERT_EQUAL_STRING(merges[i][2], after); + + free(patchtext); + free(after); + cJSON_Delete(object_to_be_merged); + cJSON_Delete(patch); + } +} + +static void generate_merge_tests(void) +{ + size_t i = 0; + char *patchedtext = NULL; + + /* Generate Merge tests: */ + for (i = 0; i < 15; i++) + { + cJSON *from = cJSON_Parse(merges[i][0]); + cJSON *to = cJSON_Parse(merges[i][2]); + cJSON *patch = cJSONUtils_GenerateMergePatch(from,to); + from = cJSONUtils_MergePatch(from,patch); + patchedtext = cJSON_PrintUnformatted(from); + TEST_ASSERT_EQUAL_STRING(merges[i][2], patchedtext); + + cJSON_Delete(from); + cJSON_Delete(to); + cJSON_Delete(patch); + free(patchedtext); + } +} + +int main(void) +{ + UNITY_BEGIN(); + + RUN_TEST(json_pointer_tests); + RUN_TEST(misc_tests); + RUN_TEST(sort_tests); + RUN_TEST(merge_tests); + RUN_TEST(generate_merge_tests); + + return UNITY_END(); +} From 3fc9bc06480f89540e7aa4a91ca4585c48ea654b Mon Sep 17 00:00:00 2001 From: Debora Grosse Date: Thu, 20 Apr 2017 10:55:09 -0400 Subject: [PATCH 048/126] cJSON: Fix print_number to print significant digits of doubles --- cJSON.c | 56 +++++++++++--------------------------------- tests/print_number.c | 24 ++++++------------- 2 files changed, 21 insertions(+), 59 deletions(-) diff --git a/cJSON.c b/cJSON.c index a25556d5..9125de4b 100644 --- a/cJSON.c +++ b/cJSON.c @@ -410,27 +410,6 @@ static void update_offset(printbuffer * const buffer) buffer->offset += strlen((const char*)buffer_pointer); } -/* Removes trailing zeroes from the end of a printed number */ -static int trim_trailing_zeroes(const unsigned char * const number, int length, const unsigned char decimal_point) -{ - if ((number == NULL) || (length <= 0)) - { - return -1; - } - - while ((length > 0) && (number[length - 1] == '0')) - { - length--; - } - if ((length > 0) && (number[length - 1] == decimal_point)) - { - /* remove trailing decimal_point */ - length--; - } - - return length; -} - /* Render the number nicely from the given item into a string. */ static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer, const internal_hooks * const hooks) { @@ -438,9 +417,9 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out double d = item->valuedouble; int length = 0; size_t i = 0; - cJSON_bool trim_zeroes = true; /* should zeroes at the end be removed? */ - unsigned char number_buffer[64]; /* temporary buffer to print the number into */ + unsigned char number_buffer[26]; /* temporary buffer to print the number into */ unsigned char decimal_point = get_decimal_point(); + double test; if (output_buffer == NULL) { @@ -452,20 +431,22 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out { length = sprintf((char*)number_buffer, "null"); } - else if ((fabs(floor(d) - d) <= DBL_EPSILON) && (fabs(d) < 1.0e60)) + /* This checks for negative zero */ + else if (d == 0) { - /* integer */ - length = sprintf((char*)number_buffer, "%.0f", d); - trim_zeroes = false; /* don't remove zeroes for "big integers" */ - } - else if ((fabs(d) < 1.0e-6) || (fabs(d) > 1.0e9)) - { - length = sprintf((char*)number_buffer, "%e", d); - trim_zeroes = false; /* don't remove zeroes in engineering notation */ + length = sprintf((char*)number_buffer, "0"); } else { - length = sprintf((char*)number_buffer, "%f", d); + /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */ + length = sprintf((char*)number_buffer, "%1.15g", d); + + /* Check whether the original double can be recovered */ + if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || ((double)test != d)) + { + /* If not, print with 17 decimal places of precision */ + length = sprintf((char*)number_buffer, "%1.17g", d); + } } /* sprintf failed or buffer overrun occured */ @@ -474,15 +455,6 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out return false; } - if (trim_zeroes) - { - length = trim_trailing_zeroes(number_buffer, length, decimal_point); - if (length <= 0) - { - return false; - } - } - /* reserve appropriate space in the output */ output_pointer = ensure(output_buffer, (size_t)length, hooks); if (output_pointer == NULL) diff --git a/tests/print_number.c b/tests/print_number.c index 16f08c23..be105507 100644 --- a/tests/print_number.c +++ b/tests/print_number.c @@ -63,19 +63,19 @@ static void print_number_should_print_positive_integers(void) static void print_number_should_print_positive_reals(void) { assert_print_number("0.123", 0.123); - assert_print_number("1.000000e-09", 10e-10); + assert_print_number("1e-09", 10e-10); assert_print_number("1000000000000", 10e11); - assert_print_number("1.230000e+129", 123e+127); - assert_print_number("0", 123e-128); /* TODO: Maybe this shouldn't be 0 */ + assert_print_number("1.23e+129", 123e+127); + assert_print_number("1.23e-126", 123e-128); } static void print_number_should_print_negative_reals(void) { assert_print_number("-0.0123", -0.0123); - assert_print_number("-1.000000e-09", -10e-10); - assert_print_number("-1000000000000000000000", -10e20); - assert_print_number("-1.230000e+129", -123e+127); - assert_print_number("-1.230000e-126", -123e-128); + assert_print_number("-1e-09", -10e-10); + assert_print_number("-1e+21", -10e20); + assert_print_number("-1.23e+129", -123e+127); + assert_print_number("-1.23e-126", -123e-128); } static void print_number_should_print_non_number(void) @@ -87,15 +87,6 @@ static void print_number_should_print_non_number(void) /* assert_print_number("null", -INFTY); */ } -static void trim_trailing_zeroes_should_trim_trailing_zeroes(void) -{ - TEST_ASSERT_EQUAL_INT(2, trim_trailing_zeroes((const unsigned char*)"10.00", (int)(sizeof("10.00") - 1), '.')); - TEST_ASSERT_EQUAL_INT(0, trim_trailing_zeroes((const unsigned char*)".00", (int)(sizeof(".00") - 1), '.')); - TEST_ASSERT_EQUAL_INT(0, trim_trailing_zeroes((const unsigned char*)"00", (int)(sizeof("00") - 1), '.')); - TEST_ASSERT_EQUAL_INT(-1, trim_trailing_zeroes(NULL, 10, '.')); - TEST_ASSERT_EQUAL_INT(-1, trim_trailing_zeroes((const unsigned char*)"", 0, '.')); -} - int main(void) { /* initialize cJSON item */ @@ -107,7 +98,6 @@ int main(void) RUN_TEST(print_number_should_print_positive_reals); RUN_TEST(print_number_should_print_negative_reals); RUN_TEST(print_number_should_print_non_number); - RUN_TEST(trim_trailing_zeroes_should_trim_trailing_zeroes); return UNITY_END(); } From a400888c1f8d9d3fc0346edf365dfd31943c39cd Mon Sep 17 00:00:00 2001 From: Mike Robinson Date: Tue, 25 Apr 2017 00:28:45 -0700 Subject: [PATCH 049/126] Document cJSON_free API --- cJSON.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cJSON.h b/cJSON.h index 0ddab6f3..938143ff 100644 --- a/cJSON.h +++ b/cJSON.h @@ -129,12 +129,12 @@ CJSON_PUBLIC(const char*) cJSON_Version(void); /* Supply malloc, realloc and free functions to cJSON */ CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks); - -/* Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished. */ +/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */ +/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */ CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value); -/* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */ +/* Render a cJSON entity to text for transfer/storage. */ CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item); -/* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */ +/* Render a cJSON entity to text for transfer/storage without any formatting. */ CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item); /* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */ CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt); From e0d3a8a265fc69ecc2c0c859c0e63153bf922877 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Thu, 27 Apr 2017 01:48:40 +0200 Subject: [PATCH 050/126] Limit nesting depth to 1000 and make it configurable. --- README.md | 4 ++++ cJSON.c | 19 ++++++++++++++++++- cJSON.h | 6 ++++++ tests/misc_tests.c | 15 +++++++++++++++ tests/parse_array.c | 6 ++---- tests/parse_number.c | 3 +-- tests/parse_object.c | 6 ++---- tests/parse_string.c | 6 ++---- tests/parse_value.c | 3 +-- tests/print_array.c | 3 +-- tests/print_object.c | 3 +-- tests/print_value.c | 3 +-- 12 files changed, 54 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 16d056db..6b344cbf 100644 --- a/README.md +++ b/README.md @@ -389,6 +389,10 @@ cJSON does not officially support any `double` implementations other than IEE754 The maximum length of a floating point literal that cJSON supports is currently 63 characters. +#### Deep Nesting Of Arrays And Objects + +cJSON doesn't support arrays and objects that are nested too deeply because this would result in a stack overflow. To prevent this cJSON limits the depth to `CJSON_NESTING_LIMIT` which is 1000 by default but can be changed at compile time. + #### Thread Safety In general cJSON is **not thread safe**. diff --git a/cJSON.c b/cJSON.c index a25556d5..172e3b6d 100644 --- a/cJSON.c +++ b/cJSON.c @@ -202,6 +202,7 @@ typedef struct const unsigned char *content; size_t length; size_t offset; + size_t depth; /* How deeply nested (in arrays/objects) is the input at the current offset. */ } parse_buffer; /* check if the given size is left to read in a given parse buffer (starting with 1) */ @@ -956,7 +957,7 @@ static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) /* Parse an object - create a new root, and populate. */ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) { - parse_buffer buffer = { 0, 0, 0 }; + parse_buffer buffer = { 0, 0, 0, 0 }; cJSON *item = NULL; /* reset error position */ @@ -1296,6 +1297,12 @@ static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buf cJSON *head = NULL; /* head of the linked list */ cJSON *current_item = NULL; + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + if (buffer_at_offset(input_buffer)[0] != '[') { /* not an array */ @@ -1360,6 +1367,8 @@ static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buf } success: + input_buffer->depth--; + item->type = cJSON_Array; item->child = head; @@ -1442,6 +1451,12 @@ static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_bu cJSON *head = NULL; /* linked list head */ cJSON *current_item = NULL; + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) { goto fail; /* not an object */ @@ -1522,6 +1537,8 @@ static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_bu } success: + input_buffer->depth--; + item->type = cJSON_Object; item->child = head; diff --git a/cJSON.h b/cJSON.h index 938143ff..1ef70f01 100644 --- a/cJSON.h +++ b/cJSON.h @@ -123,6 +123,12 @@ then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJ #endif #endif +/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them. + * This is to prevent stack overflows. */ +#ifndef CJSON_NESTING_LIMIT +#define CJSON_NESTING_LIMIT 1000 +#endif + /* returns the version of cJSON as a string */ CJSON_PUBLIC(const char*) cJSON_Version(void); diff --git a/tests/misc_tests.c b/tests/misc_tests.c index 47dff72e..b638e4d4 100644 --- a/tests/misc_tests.c +++ b/tests/misc_tests.c @@ -183,6 +183,20 @@ static void typecheck_functions_should_check_type(void) TEST_ASSERT_TRUE(cJSON_IsRaw(item)); } +static void cjson_should_not_parse_to_deeply_nested_jsons(void) +{ + char deep_json[CJSON_NESTING_LIMIT + 1]; + size_t position = 0; + + for (position = 0; position < sizeof(deep_json); position++) + { + deep_json[position] = '['; + } + deep_json[sizeof(deep_json) - 1] = '\0'; + + TEST_ASSERT_NULL_MESSAGE(cJSON_Parse(deep_json), "To deep JSONs should not be parsed."); +} + int main(void) { UNITY_BEGIN(); @@ -192,6 +206,7 @@ int main(void) RUN_TEST(cjson_get_object_item_should_get_object_items); RUN_TEST(cjson_get_object_item_case_sensitive_should_get_object_items); RUN_TEST(typecheck_functions_should_check_type); + RUN_TEST(cjson_should_not_parse_to_deeply_nested_jsons); return UNITY_END(); } diff --git a/tests/parse_array.c b/tests/parse_array.c index a089db57..335d245f 100644 --- a/tests/parse_array.c +++ b/tests/parse_array.c @@ -44,10 +44,9 @@ static void assert_is_array(cJSON *array_item) static void assert_not_array(const char *json) { - parse_buffer buffer; + parse_buffer buffer = { 0, 0, 0, 0 }; buffer.content = (const unsigned char*)json; buffer.length = strlen(json) + sizeof(""); - buffer.offset = 0; TEST_ASSERT_FALSE(parse_array(item, &buffer, &global_hooks)); assert_is_invalid(item); @@ -55,10 +54,9 @@ static void assert_not_array(const char *json) static void assert_parse_array(const char *json) { - parse_buffer buffer; + parse_buffer buffer = { 0, 0, 0, 0 }; buffer.content = (const unsigned char*)json; buffer.length = strlen(json) + sizeof(""); - buffer.offset = 0; TEST_ASSERT_TRUE(parse_array(item, &buffer, &global_hooks)); assert_is_array(item); diff --git a/tests/parse_number.c b/tests/parse_number.c index aeaa0c77..29175bd0 100644 --- a/tests/parse_number.c +++ b/tests/parse_number.c @@ -45,10 +45,9 @@ static void assert_is_number(cJSON *number_item) static void assert_parse_number(const char *string, int integer, double real) { - parse_buffer buffer; + parse_buffer buffer = { 0, 0, 0, 0 }; buffer.content = (const unsigned char*)string; buffer.length = strlen(string) + sizeof(""); - buffer.offset = 0; TEST_ASSERT_TRUE(parse_number(item, &buffer)); assert_is_number(item); diff --git a/tests/parse_object.c b/tests/parse_object.c index 4973b936..622254d8 100644 --- a/tests/parse_object.c +++ b/tests/parse_object.c @@ -52,10 +52,9 @@ static void assert_is_child(cJSON *child_item, const char *name, int type) static void assert_not_object(const char *json) { - parse_buffer parsebuffer; + parse_buffer parsebuffer = { 0, 0, 0, 0 }; parsebuffer.content = (const unsigned char*)json; parsebuffer.length = strlen(json) + sizeof(""); - parsebuffer.offset = 0; TEST_ASSERT_FALSE(parse_object(item, &parsebuffer, &global_hooks)); assert_is_invalid(item); @@ -64,10 +63,9 @@ static void assert_not_object(const char *json) static void assert_parse_object(const char *json) { - parse_buffer parsebuffer; + parse_buffer parsebuffer = { 0, 0, 0, 0 }; parsebuffer.content = (const unsigned char*)json; parsebuffer.length = strlen(json) + sizeof(""); - parsebuffer.offset = 0; TEST_ASSERT_TRUE(parse_object(item, &parsebuffer, &global_hooks)); assert_is_object(item); diff --git a/tests/parse_string.c b/tests/parse_string.c index a95e078f..d03d9451 100644 --- a/tests/parse_string.c +++ b/tests/parse_string.c @@ -45,10 +45,9 @@ static void assert_is_string(cJSON *string_item) static void assert_parse_string(const char *string, const char *expected) { - parse_buffer buffer; + parse_buffer buffer = { 0, 0, 0, 0 }; buffer.content = (const unsigned char*)string; buffer.length = strlen(string) + sizeof(""); - buffer.offset = 0; TEST_ASSERT_TRUE_MESSAGE(parse_string(item, &buffer, &global_hooks), "Couldn't parse string."); assert_is_string(item); @@ -59,10 +58,9 @@ static void assert_parse_string(const char *string, const char *expected) static void assert_not_parse_string(const char * const string) { - parse_buffer buffer; + parse_buffer buffer = { 0, 0, 0, 0 }; buffer.content = (const unsigned char*)string; buffer.length = strlen(string) + sizeof(""); - buffer.offset = 0; TEST_ASSERT_FALSE_MESSAGE(parse_string(item, &buffer, &global_hooks), "Malformed string should not be accepted."); assert_is_invalid(item); diff --git a/tests/parse_value.c b/tests/parse_value.c index 7a10dbf0..4910af97 100644 --- a/tests/parse_value.c +++ b/tests/parse_value.c @@ -43,10 +43,9 @@ static void assert_is_value(cJSON *value_item, int type) static void assert_parse_value(const char *string, int type) { - parse_buffer buffer; + parse_buffer buffer = { 0, 0, 0, 0 }; buffer.content = (const unsigned char*) string; buffer.length = strlen(string) + sizeof(""); - buffer.offset = 0; TEST_ASSERT_TRUE(parse_value(item, &buffer, &global_hooks)); assert_is_value(item, type); } diff --git a/tests/print_array.c b/tests/print_array.c index c0b4e05d..41805d89 100644 --- a/tests/print_array.c +++ b/tests/print_array.c @@ -34,10 +34,9 @@ static void assert_print_array(const char * const expected, const char * const i printbuffer formatted_buffer; printbuffer unformatted_buffer; - parse_buffer parsebuffer; + parse_buffer parsebuffer = { 0, 0, 0, 0 }; parsebuffer.content = (const unsigned char*)input; parsebuffer.length = strlen(input) + sizeof(""); - parsebuffer.offset = 0; /* buffer for formatted printing */ formatted_buffer.buffer = printed_formatted; diff --git a/tests/print_object.c b/tests/print_object.c index 5b4e34b9..38898234 100644 --- a/tests/print_object.c +++ b/tests/print_object.c @@ -33,12 +33,11 @@ static void assert_print_object(const char * const expected, const char * const printbuffer formatted_buffer; printbuffer unformatted_buffer; - parse_buffer parsebuffer; + parse_buffer parsebuffer = { 0, 0, 0, 0 }; /* buffer for parsing */ parsebuffer.content = (const unsigned char*)input; parsebuffer.length = strlen(input) + sizeof(""); - parsebuffer.offset = 0; /* buffer for formatted printing */ formatted_buffer.buffer = printed_formatted; diff --git a/tests/print_value.c b/tests/print_value.c index 56614d07..12ac2610 100644 --- a/tests/print_value.c +++ b/tests/print_value.c @@ -33,7 +33,7 @@ static void assert_print_value(const char *input) unsigned char printed[1024]; cJSON item[1]; printbuffer buffer; - parse_buffer parsebuffer; + parse_buffer parsebuffer = { 0, 0, 0, 0 }; buffer.buffer = printed; buffer.length = sizeof(printed); buffer.offset = 0; @@ -41,7 +41,6 @@ static void assert_print_value(const char *input) parsebuffer.content = (const unsigned char*)input; parsebuffer.length = strlen(input) + sizeof(""); - parsebuffer.offset = 0; memset(item, 0, sizeof(item)); From 79f30800ec03aff0891387dbce772457946a02f1 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Thu, 27 Apr 2017 02:10:03 +0200 Subject: [PATCH 051/126] Move print depth into printbuffer --- cJSON.c | 45 ++++++++++++++++++++++++-------------------- tests/print_array.c | 8 ++++---- tests/print_number.c | 2 +- tests/print_object.c | 8 ++++---- tests/print_string.c | 2 +- tests/print_value.c | 4 ++-- 6 files changed, 37 insertions(+), 32 deletions(-) diff --git a/cJSON.c b/cJSON.c index 172e3b6d..fd12bb92 100644 --- a/cJSON.c +++ b/cJSON.c @@ -315,6 +315,7 @@ typedef struct unsigned char *buffer; size_t length; size_t offset; + size_t depth; /* current nesting depth (for formatted printing) */ cJSON_bool noalloc; } printbuffer; @@ -927,11 +928,11 @@ static cJSON_bool print_string(const cJSON * const item, printbuffer * const p, /* Predeclare these prototypes. */ static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks); -static cJSON_bool print_value(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); +static cJSON_bool print_value(const cJSON * const item, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks); -static cJSON_bool print_array(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); +static cJSON_bool print_array(const cJSON * const item, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks); -static cJSON_bool print_object(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); +static cJSON_bool print_object(const cJSON * const item, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); /* Utility to jump whitespace and cr/lf */ static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) @@ -1058,7 +1059,7 @@ static unsigned char *print(const cJSON * const item, cJSON_bool format, const i } /* print the value */ - if (!print_value(item, 0, format, buffer, hooks)) + if (!print_value(item, format, buffer, hooks)) { goto fail; } @@ -1116,7 +1117,7 @@ CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item) CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) { - printbuffer p; + printbuffer p = { 0, 0, 0, 0, 0 }; if (prebuffer < 0) { @@ -1133,7 +1134,7 @@ CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON p.offset = 0; p.noalloc = false; - if (!print_value(item, 0, fmt, &p, &global_hooks)) + if (!print_value(item, fmt, &p, &global_hooks)) { return NULL; } @@ -1143,7 +1144,7 @@ CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const int len, const cJSON_bool fmt) { - printbuffer p; + printbuffer p = { 0, 0, 0, 0, 0 }; if (len < 0) { @@ -1154,7 +1155,7 @@ CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const i p.length = (size_t)len; p.offset = 0; p.noalloc = true; - return print_value(item, 0, fmt, &p, &global_hooks); + return print_value(item, fmt, &p, &global_hooks); } /* Parser core - when encountering text, process appropriately. */ @@ -1214,7 +1215,7 @@ static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buf } /* Render a value to text. */ -static cJSON_bool print_value(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks) +static cJSON_bool print_value(const cJSON * const item, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks) { unsigned char *output = NULL; @@ -1281,10 +1282,10 @@ static cJSON_bool print_value(const cJSON * const item, const size_t depth, cons return print_string(item, output_buffer, hooks); case cJSON_Array: - return print_array(item, depth, format, output_buffer, hooks); + return print_array(item, format, output_buffer, hooks); case cJSON_Object: - return print_object(item, depth, format, output_buffer, hooks); + return print_object(item, format, output_buffer, hooks); default: return false; @@ -1386,7 +1387,7 @@ static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buf } /* Render an array to text */ -static cJSON_bool print_array(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks) +static cJSON_bool print_array(const cJSON * const item, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks) { unsigned char *output_pointer = NULL; size_t length = 0; @@ -1407,10 +1408,11 @@ static cJSON_bool print_array(const cJSON * const item, const size_t depth, cons *output_pointer = '['; output_buffer->offset++; + output_buffer->depth++; while (current_element != NULL) { - if (!print_value(current_element, depth + 1, format, output_buffer, hooks)) + if (!print_value(current_element, format, output_buffer, hooks)) { return false; } @@ -1441,6 +1443,7 @@ static cJSON_bool print_array(const cJSON * const item, const size_t depth, cons } *output_pointer++ = ']'; *output_pointer = '\0'; + output_buffer->depth--; return true; } @@ -1555,7 +1558,7 @@ static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_bu } /* Render an object to text. */ -static cJSON_bool print_object(const cJSON * const item, const size_t depth, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks) +static cJSON_bool print_object(const cJSON * const item, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks) { unsigned char *output_pointer = NULL; size_t length = 0; @@ -1575,6 +1578,7 @@ static cJSON_bool print_object(const cJSON * const item, const size_t depth, con } *output_pointer++ = '{'; + output_buffer->depth++; if (format) { *output_pointer++ = '\n'; @@ -1586,16 +1590,16 @@ static cJSON_bool print_object(const cJSON * const item, const size_t depth, con if (format) { size_t i; - output_pointer = ensure(output_buffer, depth + 1, hooks); + output_pointer = ensure(output_buffer, output_buffer->depth, hooks); if (output_pointer == NULL) { return false; } - for (i = 0; i < depth + 1; i++) + for (i = 0; i < output_buffer->depth; i++) { *output_pointer++ = '\t'; } - output_buffer->offset += depth + 1; + output_buffer->offset += output_buffer->depth; } /* print key */ @@ -1619,7 +1623,7 @@ static cJSON_bool print_object(const cJSON * const item, const size_t depth, con output_buffer->offset += length; /* print value */ - if (!print_value(current_item, depth + 1, format, output_buffer, hooks)) + if (!print_value(current_item, format, output_buffer, hooks)) { return false; } @@ -1647,7 +1651,7 @@ static cJSON_bool print_object(const cJSON * const item, const size_t depth, con current_item = current_item->next; } - output_pointer = ensure(output_buffer, format ? (depth + 2) : 2, hooks); + output_pointer = ensure(output_buffer, format ? (output_buffer->depth + 1) : 2, hooks); if (output_pointer == NULL) { return false; @@ -1655,13 +1659,14 @@ static cJSON_bool print_object(const cJSON * const item, const size_t depth, con if (format) { size_t i; - for (i = 0; i < (depth); i++) + for (i = 0; i < (output_buffer->depth - 1); i++) { *output_pointer++ = '\t'; } } *output_pointer++ = '}'; *output_pointer = '\0'; + output_buffer->depth--; return true; } diff --git a/tests/print_array.c b/tests/print_array.c index 41805d89..2590410b 100644 --- a/tests/print_array.c +++ b/tests/print_array.c @@ -31,8 +31,8 @@ static void assert_print_array(const char * const expected, const char * const i cJSON item[1]; - printbuffer formatted_buffer; - printbuffer unformatted_buffer; + printbuffer formatted_buffer = { 0, 0, 0, 0, 0 }; + printbuffer unformatted_buffer = { 0, 0, 0, 0, 0 }; parse_buffer parsebuffer = { 0, 0, 0, 0 }; parsebuffer.content = (const unsigned char*)input; @@ -53,10 +53,10 @@ static void assert_print_array(const char * const expected, const char * const i memset(item, 0, sizeof(item)); TEST_ASSERT_TRUE_MESSAGE(parse_array(item, &parsebuffer, &global_hooks), "Failed to parse array."); - TEST_ASSERT_TRUE_MESSAGE(print_array(item, 0, false, &unformatted_buffer, &global_hooks), "Failed to print unformatted string."); + TEST_ASSERT_TRUE_MESSAGE(print_array(item, false, &unformatted_buffer, &global_hooks), "Failed to print unformatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, printed_unformatted, "Unformatted array is not correct."); - TEST_ASSERT_TRUE_MESSAGE(print_array(item, 0, true, &formatted_buffer, &global_hooks), "Failed to print formatted string."); + TEST_ASSERT_TRUE_MESSAGE(print_array(item, true, &formatted_buffer, &global_hooks), "Failed to print formatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, printed_formatted, "Formatted array is not correct."); reset(item); diff --git a/tests/print_number.c b/tests/print_number.c index 16f08c23..45cef9e3 100644 --- a/tests/print_number.c +++ b/tests/print_number.c @@ -28,7 +28,7 @@ static void assert_print_number(const char *expected, double input) { unsigned char printed[1024]; cJSON item[1]; - printbuffer buffer; + printbuffer buffer = { 0, 0, 0, 0, 0 }; buffer.buffer = printed; buffer.length = sizeof(printed); buffer.offset = 0; diff --git a/tests/print_object.c b/tests/print_object.c index 38898234..361fa294 100644 --- a/tests/print_object.c +++ b/tests/print_object.c @@ -31,8 +31,8 @@ static void assert_print_object(const char * const expected, const char * const cJSON item[1]; - printbuffer formatted_buffer; - printbuffer unformatted_buffer; + printbuffer formatted_buffer = { 0, 0, 0, 0, 0 }; + printbuffer unformatted_buffer = { 0, 0, 0, 0, 0 }; parse_buffer parsebuffer = { 0, 0, 0, 0 }; /* buffer for parsing */ @@ -54,10 +54,10 @@ static void assert_print_object(const char * const expected, const char * const memset(item, 0, sizeof(item)); TEST_ASSERT_TRUE_MESSAGE(parse_object(item, &parsebuffer, &global_hooks), "Failed to parse object."); - TEST_ASSERT_TRUE_MESSAGE(print_object(item, 0, false, &unformatted_buffer, &global_hooks), "Failed to print unformatted string."); + TEST_ASSERT_TRUE_MESSAGE(print_object(item, false, &unformatted_buffer, &global_hooks), "Failed to print unformatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, printed_unformatted, "Unformatted object is not correct."); - TEST_ASSERT_TRUE_MESSAGE(print_object(item, 0, true, &formatted_buffer, &global_hooks), "Failed to print formatted string."); + TEST_ASSERT_TRUE_MESSAGE(print_object(item, true, &formatted_buffer, &global_hooks), "Failed to print formatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, printed_formatted, "Formatted ojbect is not correct."); reset(item); diff --git a/tests/print_string.c b/tests/print_string.c index 2e38eaa6..0dce3a2e 100644 --- a/tests/print_string.c +++ b/tests/print_string.c @@ -27,7 +27,7 @@ static void assert_print_string(const char *expected, const char *input) { unsigned char printed[1024]; - printbuffer buffer; + printbuffer buffer = { 0, 0, 0, 0, 0 }; buffer.buffer = printed; buffer.length = sizeof(printed); buffer.offset = 0; diff --git a/tests/print_value.c b/tests/print_value.c index 12ac2610..0ed448c2 100644 --- a/tests/print_value.c +++ b/tests/print_value.c @@ -32,7 +32,7 @@ static void assert_print_value(const char *input) { unsigned char printed[1024]; cJSON item[1]; - printbuffer buffer; + printbuffer buffer = { 0, 0, 0, 0, 0 }; parse_buffer parsebuffer = { 0, 0, 0, 0 }; buffer.buffer = printed; buffer.length = sizeof(printed); @@ -46,7 +46,7 @@ static void assert_print_value(const char *input) TEST_ASSERT_TRUE_MESSAGE(parse_value(item, &parsebuffer, &global_hooks), "Failed to parse value."); - TEST_ASSERT_TRUE_MESSAGE(print_value(item, 0, false, &buffer, &global_hooks), "Failed to print value."); + TEST_ASSERT_TRUE_MESSAGE(print_value(item, false, &buffer, &global_hooks), "Failed to print value."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, buffer.buffer, "Printed value is not as expected."); reset(item); From c4c217f2ce25815f267d26b8fd72abcfe369674c Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Thu, 27 Apr 2017 02:21:09 +0200 Subject: [PATCH 052/126] Move 'format' into printbuffer --- cJSON.c | 57 ++++++++++++++++++++++++-------------------- tests/print_array.c | 10 ++++---- tests/print_number.c | 2 +- tests/print_object.c | 10 ++++---- tests/print_string.c | 2 +- tests/print_value.c | 4 ++-- 6 files changed, 47 insertions(+), 38 deletions(-) diff --git a/cJSON.c b/cJSON.c index fd12bb92..f47a94a6 100644 --- a/cJSON.c +++ b/cJSON.c @@ -317,6 +317,7 @@ typedef struct size_t offset; size_t depth; /* current nesting depth (for formatted printing) */ cJSON_bool noalloc; + cJSON_bool format; /* is this print a formatted print */ } printbuffer; /* realloc printbuffer if necessary to have at least "needed" bytes more */ @@ -928,11 +929,11 @@ static cJSON_bool print_string(const cJSON * const item, printbuffer * const p, /* Predeclare these prototypes. */ static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks); -static cJSON_bool print_value(const cJSON * const item, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer, const internal_hooks * const hooks); static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks); -static cJSON_bool print_array(const cJSON * const item, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer, const internal_hooks * const hooks); static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks); -static cJSON_bool print_object(const cJSON * const item, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks); +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer, const internal_hooks * const hooks); /* Utility to jump whitespace and cr/lf */ static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) @@ -1053,13 +1054,14 @@ static unsigned char *print(const cJSON * const item, cJSON_bool format, const i /* create buffer */ buffer->buffer = (unsigned char*) hooks->allocate(256); + buffer->format = format; if (buffer->buffer == NULL) { goto fail; } /* print the value */ - if (!print_value(item, format, buffer, hooks)) + if (!print_value(item, buffer, hooks)) { goto fail; } @@ -1117,7 +1119,7 @@ CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item) CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) { - printbuffer p = { 0, 0, 0, 0, 0 }; + printbuffer p = { 0, 0, 0, 0, 0, 0 }; if (prebuffer < 0) { @@ -1133,8 +1135,9 @@ CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON p.length = (size_t)prebuffer; p.offset = 0; p.noalloc = false; + p.format = fmt; - if (!print_value(item, fmt, &p, &global_hooks)) + if (!print_value(item, &p, &global_hooks)) { return NULL; } @@ -1144,7 +1147,7 @@ CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const int len, const cJSON_bool fmt) { - printbuffer p = { 0, 0, 0, 0, 0 }; + printbuffer p = { 0, 0, 0, 0, 0, 0 }; if (len < 0) { @@ -1155,7 +1158,9 @@ CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const i p.length = (size_t)len; p.offset = 0; p.noalloc = true; - return print_value(item, fmt, &p, &global_hooks); + p.format = fmt; + + return print_value(item, &p, &global_hooks); } /* Parser core - when encountering text, process appropriately. */ @@ -1215,7 +1220,7 @@ static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buf } /* Render a value to text. */ -static cJSON_bool print_value(const cJSON * const item, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks) +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer, const internal_hooks * const hooks) { unsigned char *output = NULL; @@ -1282,10 +1287,10 @@ static cJSON_bool print_value(const cJSON * const item, const cJSON_bool format, return print_string(item, output_buffer, hooks); case cJSON_Array: - return print_array(item, format, output_buffer, hooks); + return print_array(item, output_buffer, hooks); case cJSON_Object: - return print_object(item, format, output_buffer, hooks); + return print_object(item, output_buffer, hooks); default: return false; @@ -1387,7 +1392,7 @@ static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buf } /* Render an array to text */ -static cJSON_bool print_array(const cJSON * const item, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks) +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer, const internal_hooks * const hooks) { unsigned char *output_pointer = NULL; size_t length = 0; @@ -1412,21 +1417,21 @@ static cJSON_bool print_array(const cJSON * const item, const cJSON_bool format, while (current_element != NULL) { - if (!print_value(current_element, format, output_buffer, hooks)) + if (!print_value(current_element, output_buffer, hooks)) { return false; } update_offset(output_buffer); if (current_element->next) { - length = (size_t) (format ? 2 : 1); + length = (size_t) (output_buffer->format ? 2 : 1); output_pointer = ensure(output_buffer, length + 1, hooks); if (output_pointer == NULL) { return false; } *output_pointer++ = ','; - if(format) + if(output_buffer->format) { *output_pointer++ = ' '; } @@ -1558,7 +1563,7 @@ static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_bu } /* Render an object to text. */ -static cJSON_bool print_object(const cJSON * const item, const cJSON_bool format, printbuffer * const output_buffer, const internal_hooks * const hooks) +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer, const internal_hooks * const hooks) { unsigned char *output_pointer = NULL; size_t length = 0; @@ -1570,7 +1575,7 @@ static cJSON_bool print_object(const cJSON * const item, const cJSON_bool format } /* Compose the output: */ - length = (size_t) (format ? 2 : 1); /* fmt: {\n */ + length = (size_t) (output_buffer->format ? 2 : 1); /* fmt: {\n */ output_pointer = ensure(output_buffer, length + 1, hooks); if (output_pointer == NULL) { @@ -1579,7 +1584,7 @@ static cJSON_bool print_object(const cJSON * const item, const cJSON_bool format *output_pointer++ = '{'; output_buffer->depth++; - if (format) + if (output_buffer->format) { *output_pointer++ = '\n'; } @@ -1587,7 +1592,7 @@ static cJSON_bool print_object(const cJSON * const item, const cJSON_bool format while (current_item) { - if (format) + if (output_buffer->format) { size_t i; output_pointer = ensure(output_buffer, output_buffer->depth, hooks); @@ -1609,28 +1614,28 @@ static cJSON_bool print_object(const cJSON * const item, const cJSON_bool format } update_offset(output_buffer); - length = (size_t) (format ? 2 : 1); + length = (size_t) (output_buffer->format ? 2 : 1); output_pointer = ensure(output_buffer, length, hooks); if (output_pointer == NULL) { return false; } *output_pointer++ = ':'; - if (format) + if (output_buffer->format) { *output_pointer++ = '\t'; } output_buffer->offset += length; /* print value */ - if (!print_value(current_item, format, output_buffer, hooks)) + if (!print_value(current_item, output_buffer, hooks)) { return false; } update_offset(output_buffer); /* print comma if not last */ - length = (size_t) ((format ? 1 : 0) + (current_item->next ? 1 : 0)); + length = (size_t) ((output_buffer->format ? 1 : 0) + (current_item->next ? 1 : 0)); output_pointer = ensure(output_buffer, length + 1, hooks); if (output_pointer == NULL) { @@ -1641,7 +1646,7 @@ static cJSON_bool print_object(const cJSON * const item, const cJSON_bool format *output_pointer++ = ','; } - if (format) + if (output_buffer->format) { *output_pointer++ = '\n'; } @@ -1651,12 +1656,12 @@ static cJSON_bool print_object(const cJSON * const item, const cJSON_bool format current_item = current_item->next; } - output_pointer = ensure(output_buffer, format ? (output_buffer->depth + 1) : 2, hooks); + output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2, hooks); if (output_pointer == NULL) { return false; } - if (format) + if (output_buffer->format) { size_t i; for (i = 0; i < (output_buffer->depth - 1); i++) diff --git a/tests/print_array.c b/tests/print_array.c index 2590410b..45a076b3 100644 --- a/tests/print_array.c +++ b/tests/print_array.c @@ -31,8 +31,8 @@ static void assert_print_array(const char * const expected, const char * const i cJSON item[1]; - printbuffer formatted_buffer = { 0, 0, 0, 0, 0 }; - printbuffer unformatted_buffer = { 0, 0, 0, 0, 0 }; + printbuffer formatted_buffer = { 0, 0, 0, 0, 0, 0 }; + printbuffer unformatted_buffer = { 0, 0, 0, 0, 0, 0 }; parse_buffer parsebuffer = { 0, 0, 0, 0 }; parsebuffer.content = (const unsigned char*)input; @@ -53,10 +53,12 @@ static void assert_print_array(const char * const expected, const char * const i memset(item, 0, sizeof(item)); TEST_ASSERT_TRUE_MESSAGE(parse_array(item, &parsebuffer, &global_hooks), "Failed to parse array."); - TEST_ASSERT_TRUE_MESSAGE(print_array(item, false, &unformatted_buffer, &global_hooks), "Failed to print unformatted string."); + unformatted_buffer.format = false; + TEST_ASSERT_TRUE_MESSAGE(print_array(item, &unformatted_buffer, &global_hooks), "Failed to print unformatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, printed_unformatted, "Unformatted array is not correct."); - TEST_ASSERT_TRUE_MESSAGE(print_array(item, true, &formatted_buffer, &global_hooks), "Failed to print formatted string."); + formatted_buffer.format = true; + TEST_ASSERT_TRUE_MESSAGE(print_array(item, &formatted_buffer, &global_hooks), "Failed to print formatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, printed_formatted, "Formatted array is not correct."); reset(item); diff --git a/tests/print_number.c b/tests/print_number.c index 45cef9e3..68ce4dc0 100644 --- a/tests/print_number.c +++ b/tests/print_number.c @@ -28,7 +28,7 @@ static void assert_print_number(const char *expected, double input) { unsigned char printed[1024]; cJSON item[1]; - printbuffer buffer = { 0, 0, 0, 0, 0 }; + printbuffer buffer = { 0, 0, 0, 0, 0, 0 }; buffer.buffer = printed; buffer.length = sizeof(printed); buffer.offset = 0; diff --git a/tests/print_object.c b/tests/print_object.c index 361fa294..d26fd143 100644 --- a/tests/print_object.c +++ b/tests/print_object.c @@ -31,8 +31,8 @@ static void assert_print_object(const char * const expected, const char * const cJSON item[1]; - printbuffer formatted_buffer = { 0, 0, 0, 0, 0 }; - printbuffer unformatted_buffer = { 0, 0, 0, 0, 0 }; + printbuffer formatted_buffer = { 0, 0, 0, 0, 0, 0 }; + printbuffer unformatted_buffer = { 0, 0, 0, 0, 0, 0 }; parse_buffer parsebuffer = { 0, 0, 0, 0 }; /* buffer for parsing */ @@ -54,10 +54,12 @@ static void assert_print_object(const char * const expected, const char * const memset(item, 0, sizeof(item)); TEST_ASSERT_TRUE_MESSAGE(parse_object(item, &parsebuffer, &global_hooks), "Failed to parse object."); - TEST_ASSERT_TRUE_MESSAGE(print_object(item, false, &unformatted_buffer, &global_hooks), "Failed to print unformatted string."); + unformatted_buffer.format = false; + TEST_ASSERT_TRUE_MESSAGE(print_object(item, &unformatted_buffer, &global_hooks), "Failed to print unformatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, printed_unformatted, "Unformatted object is not correct."); - TEST_ASSERT_TRUE_MESSAGE(print_object(item, true, &formatted_buffer, &global_hooks), "Failed to print formatted string."); + formatted_buffer.format = true; + TEST_ASSERT_TRUE_MESSAGE(print_object(item, &formatted_buffer, &global_hooks), "Failed to print formatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, printed_formatted, "Formatted ojbect is not correct."); reset(item); diff --git a/tests/print_string.c b/tests/print_string.c index 0dce3a2e..4416d243 100644 --- a/tests/print_string.c +++ b/tests/print_string.c @@ -27,7 +27,7 @@ static void assert_print_string(const char *expected, const char *input) { unsigned char printed[1024]; - printbuffer buffer = { 0, 0, 0, 0, 0 }; + printbuffer buffer = { 0, 0, 0, 0, 0, 0 }; buffer.buffer = printed; buffer.length = sizeof(printed); buffer.offset = 0; diff --git a/tests/print_value.c b/tests/print_value.c index 0ed448c2..3e11e5a2 100644 --- a/tests/print_value.c +++ b/tests/print_value.c @@ -32,7 +32,7 @@ static void assert_print_value(const char *input) { unsigned char printed[1024]; cJSON item[1]; - printbuffer buffer = { 0, 0, 0, 0, 0 }; + printbuffer buffer = { 0, 0, 0, 0, 0, 0 }; parse_buffer parsebuffer = { 0, 0, 0, 0 }; buffer.buffer = printed; buffer.length = sizeof(printed); @@ -46,7 +46,7 @@ static void assert_print_value(const char *input) TEST_ASSERT_TRUE_MESSAGE(parse_value(item, &parsebuffer, &global_hooks), "Failed to parse value."); - TEST_ASSERT_TRUE_MESSAGE(print_value(item, false, &buffer, &global_hooks), "Failed to print value."); + TEST_ASSERT_TRUE_MESSAGE(print_value(item, &buffer, &global_hooks), "Failed to print value."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, buffer.buffer, "Printed value is not as expected."); reset(item); From 949c083315357633fe32f33fd014e42861e36624 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Thu, 27 Apr 2017 02:48:28 +0200 Subject: [PATCH 053/126] Move 'hooks' parameter into buffers (parse/print) --- cJSON.c | 132 ++++++++++++++++++++++--------------------- tests/parse_array.c | 10 ++-- tests/parse_number.c | 2 +- tests/parse_object.c | 10 ++-- tests/parse_string.c | 10 ++-- tests/parse_value.c | 6 +- tests/print_array.c | 15 +++-- tests/print_number.c | 5 +- tests/print_object.c | 15 +++-- tests/print_string.c | 5 +- tests/print_value.c | 10 ++-- 11 files changed, 122 insertions(+), 98 deletions(-) diff --git a/cJSON.c b/cJSON.c index f47a94a6..4ab110fc 100644 --- a/cJSON.c +++ b/cJSON.c @@ -203,6 +203,7 @@ typedef struct size_t length; size_t offset; size_t depth; /* How deeply nested (in arrays/objects) is the input at the current offset. */ + internal_hooks hooks; } parse_buffer; /* check if the given size is left to read in a given parse buffer (starting with 1) */ @@ -318,10 +319,11 @@ typedef struct size_t depth; /* current nesting depth (for formatted printing) */ cJSON_bool noalloc; cJSON_bool format; /* is this print a formatted print */ + internal_hooks hooks; } printbuffer; /* realloc printbuffer if necessary to have at least "needed" bytes more */ -static unsigned char* ensure(printbuffer * const p, size_t needed, const internal_hooks * const hooks) +static unsigned char* ensure(printbuffer * const p, size_t needed) { unsigned char *newbuffer = NULL; size_t newsize = 0; @@ -371,18 +373,18 @@ static unsigned char* ensure(printbuffer * const p, size_t needed, const interna newsize = needed * 2; } - if (hooks->reallocate != NULL) + if (p->hooks.reallocate != NULL) { /* reallocate with realloc if available */ - newbuffer = (unsigned char*)hooks->reallocate(p->buffer, newsize); + newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize); } else { /* otherwise reallocate manually */ - newbuffer = (unsigned char*)hooks->allocate(newsize); + newbuffer = (unsigned char*)p->hooks.allocate(newsize); if (!newbuffer) { - hooks->deallocate(p->buffer); + p->hooks.deallocate(p->buffer); p->length = 0; p->buffer = NULL; @@ -392,7 +394,7 @@ static unsigned char* ensure(printbuffer * const p, size_t needed, const interna { memcpy(newbuffer, p->buffer, p->offset + 1); } - hooks->deallocate(p->buffer); + p->hooks.deallocate(p->buffer); } p->length = newsize; p->buffer = newbuffer; @@ -435,7 +437,7 @@ static int trim_trailing_zeroes(const unsigned char * const number, int length, } /* Render the number nicely from the given item into a string. */ -static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer, const internal_hooks * const hooks) +static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer) { unsigned char *output_pointer = NULL; double d = item->valuedouble; @@ -487,7 +489,7 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out } /* reserve appropriate space in the output */ - output_pointer = ensure(output_buffer, (size_t)length, hooks); + output_pointer = ensure(output_buffer, (size_t)length); if (output_pointer == NULL) { return false; @@ -671,7 +673,7 @@ static unsigned char utf16_literal_to_utf8(const unsigned char * const input_poi } /* Parse the input text into an unescaped cinput, and populate item. */ -static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks) +static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer) { const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1; const unsigned char *input_end = buffer_at_offset(input_buffer) + 1; @@ -710,7 +712,7 @@ static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_bu /* This is at most how much we need for the output */ allocation_length = (size_t) (input_end - buffer_at_offset(input_buffer)) - skipped_bytes; - output = (unsigned char*)hooks->allocate(allocation_length + sizeof("")); + output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof("")); if (output == NULL) { goto fail; /* allocation failure */ @@ -788,7 +790,7 @@ static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_bu fail: if (output != NULL) { - hooks->deallocate(output); + input_buffer->hooks.deallocate(output); } if (input_pointer != NULL) @@ -800,7 +802,7 @@ static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_bu } /* Render the cstring provided to an escaped version that can be printed. */ -static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffer * const output_buffer, const internal_hooks * const hooks) +static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffer * const output_buffer) { const unsigned char *input_pointer = NULL; unsigned char *output = NULL; @@ -817,7 +819,7 @@ static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffe /* empty string */ if (input == NULL) { - output = ensure(output_buffer, sizeof("\"\""), hooks); + output = ensure(output_buffer, sizeof("\"\"")); if (output == NULL) { return false; @@ -853,7 +855,7 @@ static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffe } output_length = (size_t)(input_pointer - input) + escape_characters; - output = ensure(output_buffer, output_length + sizeof("\"\""), hooks); + output = ensure(output_buffer, output_length + sizeof("\"\"")); if (output == NULL) { return false; @@ -922,18 +924,18 @@ static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffe } /* Invoke print_string_ptr (which is useful) on an item. */ -static cJSON_bool print_string(const cJSON * const item, printbuffer * const p, const internal_hooks * const hooks) +static cJSON_bool print_string(const cJSON * const item, printbuffer * const p) { - return print_string_ptr((unsigned char*)item->valuestring, p, hooks); + return print_string_ptr((unsigned char*)item->valuestring, p); } /* Predeclare these prototypes. */ -static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks); -static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer, const internal_hooks * const hooks); -static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks); -static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer, const internal_hooks * const hooks); -static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks); -static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer, const internal_hooks * const hooks); +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer); /* Utility to jump whitespace and cr/lf */ static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) @@ -959,7 +961,7 @@ static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) /* Parse an object - create a new root, and populate. */ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) { - parse_buffer buffer = { 0, 0, 0, 0 }; + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; cJSON *item = NULL; /* reset error position */ @@ -974,6 +976,7 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return buffer.content = (const unsigned char*)value; buffer.length = strlen((const char*)value) + sizeof(""); buffer.offset = 0; + buffer.hooks = global_hooks; item = cJSON_New_Item(&global_hooks); if (item == NULL) /* memory fail */ @@ -981,7 +984,7 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return goto fail; } - if (!parse_value(item, buffer_skip_whitespace(&buffer), &global_hooks)) + if (!parse_value(item, buffer_skip_whitespace(&buffer))) { /* parse failure. ep is set. */ goto fail; @@ -1055,13 +1058,14 @@ static unsigned char *print(const cJSON * const item, cJSON_bool format, const i /* create buffer */ buffer->buffer = (unsigned char*) hooks->allocate(256); buffer->format = format; + buffer->hooks = *hooks; if (buffer->buffer == NULL) { goto fail; } /* print the value */ - if (!print_value(item, buffer, hooks)) + if (!print_value(item, buffer)) { goto fail; } @@ -1119,7 +1123,7 @@ CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item) CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) { - printbuffer p = { 0, 0, 0, 0, 0, 0 }; + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; if (prebuffer < 0) { @@ -1136,8 +1140,9 @@ CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON p.offset = 0; p.noalloc = false; p.format = fmt; + p.hooks = global_hooks; - if (!print_value(item, &p, &global_hooks)) + if (!print_value(item, &p)) { return NULL; } @@ -1147,7 +1152,7 @@ CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const int len, const cJSON_bool fmt) { - printbuffer p = { 0, 0, 0, 0, 0, 0 }; + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; if (len < 0) { @@ -1159,12 +1164,13 @@ CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const i p.offset = 0; p.noalloc = true; p.format = fmt; + p.hooks = global_hooks; - return print_value(item, &p, &global_hooks); + return print_value(item, &p); } /* Parser core - when encountering text, process appropriately. */ -static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks) +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer) { if ((input_buffer == NULL) || (input_buffer->content == NULL)) { @@ -1197,7 +1203,7 @@ static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buf /* string */ if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) { - return parse_string(item, input_buffer, hooks); + return parse_string(item, input_buffer); } /* number */ if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) @@ -1207,12 +1213,12 @@ static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buf /* array */ if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) { - return parse_array(item, input_buffer, hooks); + return parse_array(item, input_buffer); } /* object */ if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) { - return parse_object(item, input_buffer, hooks); + return parse_object(item, input_buffer); } @@ -1220,7 +1226,7 @@ static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buf } /* Render a value to text. */ -static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer, const internal_hooks * const hooks) +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer) { unsigned char *output = NULL; @@ -1232,7 +1238,7 @@ static cJSON_bool print_value(const cJSON * const item, printbuffer * const outp switch ((item->type) & 0xFF) { case cJSON_NULL: - output = ensure(output_buffer, 5, hooks); + output = ensure(output_buffer, 5); if (output == NULL) { return false; @@ -1241,7 +1247,7 @@ static cJSON_bool print_value(const cJSON * const item, printbuffer * const outp return true; case cJSON_False: - output = ensure(output_buffer, 6, hooks); + output = ensure(output_buffer, 6); if (output == NULL) { return false; @@ -1250,7 +1256,7 @@ static cJSON_bool print_value(const cJSON * const item, printbuffer * const outp return true; case cJSON_True: - output = ensure(output_buffer, 5, hooks); + output = ensure(output_buffer, 5); if (output == NULL) { return false; @@ -1259,7 +1265,7 @@ static cJSON_bool print_value(const cJSON * const item, printbuffer * const outp return true; case cJSON_Number: - return print_number(item, output_buffer, hooks); + return print_number(item, output_buffer); case cJSON_Raw: { @@ -1268,13 +1274,13 @@ static cJSON_bool print_value(const cJSON * const item, printbuffer * const outp { if (!output_buffer->noalloc) { - hooks->deallocate(output_buffer->buffer); + output_buffer->hooks.deallocate(output_buffer->buffer); } return false; } raw_length = strlen(item->valuestring) + sizeof(""); - output = ensure(output_buffer, raw_length, hooks); + output = ensure(output_buffer, raw_length); if (output == NULL) { return false; @@ -1284,13 +1290,13 @@ static cJSON_bool print_value(const cJSON * const item, printbuffer * const outp } case cJSON_String: - return print_string(item, output_buffer, hooks); + return print_string(item, output_buffer); case cJSON_Array: - return print_array(item, output_buffer, hooks); + return print_array(item, output_buffer); case cJSON_Object: - return print_object(item, output_buffer, hooks); + return print_object(item, output_buffer); default: return false; @@ -1298,7 +1304,7 @@ static cJSON_bool print_value(const cJSON * const item, printbuffer * const outp } /* Build an array from input text. */ -static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks) +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer) { cJSON *head = NULL; /* head of the linked list */ cJSON *current_item = NULL; @@ -1336,7 +1342,7 @@ static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buf do { /* allocate next item */ - cJSON *new_item = cJSON_New_Item(hooks); + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); if (new_item == NULL) { goto fail; /* allocation failure */ @@ -1359,7 +1365,7 @@ static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buf /* parse next value */ input_buffer->offset++; buffer_skip_whitespace(input_buffer); - if (!parse_value(current_item, input_buffer, hooks)) + if (!parse_value(current_item, input_buffer)) { goto fail; /* failed to parse value */ } @@ -1392,7 +1398,7 @@ static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buf } /* Render an array to text */ -static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer, const internal_hooks * const hooks) +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer) { unsigned char *output_pointer = NULL; size_t length = 0; @@ -1405,7 +1411,7 @@ static cJSON_bool print_array(const cJSON * const item, printbuffer * const outp /* Compose the output array. */ /* opening square bracket */ - output_pointer = ensure(output_buffer, 1, hooks); + output_pointer = ensure(output_buffer, 1); if (output_pointer == NULL) { return false; @@ -1417,7 +1423,7 @@ static cJSON_bool print_array(const cJSON * const item, printbuffer * const outp while (current_element != NULL) { - if (!print_value(current_element, output_buffer, hooks)) + if (!print_value(current_element, output_buffer)) { return false; } @@ -1425,7 +1431,7 @@ static cJSON_bool print_array(const cJSON * const item, printbuffer * const outp if (current_element->next) { length = (size_t) (output_buffer->format ? 2 : 1); - output_pointer = ensure(output_buffer, length + 1, hooks); + output_pointer = ensure(output_buffer, length + 1); if (output_pointer == NULL) { return false; @@ -1441,7 +1447,7 @@ static cJSON_bool print_array(const cJSON * const item, printbuffer * const outp current_element = current_element->next; } - output_pointer = ensure(output_buffer, 2, hooks); + output_pointer = ensure(output_buffer, 2); if (output_pointer == NULL) { return false; @@ -1454,7 +1460,7 @@ static cJSON_bool print_array(const cJSON * const item, printbuffer * const outp } /* Build an object from the text. */ -static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer, const internal_hooks * const hooks) +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer) { cJSON *head = NULL; /* linked list head */ cJSON *current_item = NULL; @@ -1490,7 +1496,7 @@ static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_bu do { /* allocate next item */ - cJSON *new_item = cJSON_New_Item(hooks); + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); if (new_item == NULL) { goto fail; /* allocation failure */ @@ -1513,7 +1519,7 @@ static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_bu /* parse the name of the child */ input_buffer->offset++; buffer_skip_whitespace(input_buffer); - if (!parse_string(current_item, input_buffer, hooks)) + if (!parse_string(current_item, input_buffer)) { goto fail; /* faile to parse name */ } @@ -1531,7 +1537,7 @@ static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_bu /* parse the value */ input_buffer->offset++; buffer_skip_whitespace(input_buffer); - if (!parse_value(current_item, input_buffer, hooks)) + if (!parse_value(current_item, input_buffer)) { goto fail; /* failed to parse value */ } @@ -1563,7 +1569,7 @@ static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_bu } /* Render an object to text. */ -static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer, const internal_hooks * const hooks) +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer) { unsigned char *output_pointer = NULL; size_t length = 0; @@ -1576,7 +1582,7 @@ static cJSON_bool print_object(const cJSON * const item, printbuffer * const out /* Compose the output: */ length = (size_t) (output_buffer->format ? 2 : 1); /* fmt: {\n */ - output_pointer = ensure(output_buffer, length + 1, hooks); + output_pointer = ensure(output_buffer, length + 1); if (output_pointer == NULL) { return false; @@ -1595,7 +1601,7 @@ static cJSON_bool print_object(const cJSON * const item, printbuffer * const out if (output_buffer->format) { size_t i; - output_pointer = ensure(output_buffer, output_buffer->depth, hooks); + output_pointer = ensure(output_buffer, output_buffer->depth); if (output_pointer == NULL) { return false; @@ -1608,14 +1614,14 @@ static cJSON_bool print_object(const cJSON * const item, printbuffer * const out } /* print key */ - if (!print_string_ptr((unsigned char*)current_item->string, output_buffer, hooks)) + if (!print_string_ptr((unsigned char*)current_item->string, output_buffer)) { return false; } update_offset(output_buffer); length = (size_t) (output_buffer->format ? 2 : 1); - output_pointer = ensure(output_buffer, length, hooks); + output_pointer = ensure(output_buffer, length); if (output_pointer == NULL) { return false; @@ -1628,7 +1634,7 @@ static cJSON_bool print_object(const cJSON * const item, printbuffer * const out output_buffer->offset += length; /* print value */ - if (!print_value(current_item, output_buffer, hooks)) + if (!print_value(current_item, output_buffer)) { return false; } @@ -1636,7 +1642,7 @@ static cJSON_bool print_object(const cJSON * const item, printbuffer * const out /* print comma if not last */ length = (size_t) ((output_buffer->format ? 1 : 0) + (current_item->next ? 1 : 0)); - output_pointer = ensure(output_buffer, length + 1, hooks); + output_pointer = ensure(output_buffer, length + 1); if (output_pointer == NULL) { return false; @@ -1656,7 +1662,7 @@ static cJSON_bool print_object(const cJSON * const item, printbuffer * const out current_item = current_item->next; } - output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2, hooks); + output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2); if (output_pointer == NULL) { return false; diff --git a/tests/parse_array.c b/tests/parse_array.c index 335d245f..69e0f411 100644 --- a/tests/parse_array.c +++ b/tests/parse_array.c @@ -44,21 +44,23 @@ static void assert_is_array(cJSON *array_item) static void assert_not_array(const char *json) { - parse_buffer buffer = { 0, 0, 0, 0 }; + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; buffer.content = (const unsigned char*)json; buffer.length = strlen(json) + sizeof(""); + buffer.hooks = global_hooks; - TEST_ASSERT_FALSE(parse_array(item, &buffer, &global_hooks)); + TEST_ASSERT_FALSE(parse_array(item, &buffer)); assert_is_invalid(item); } static void assert_parse_array(const char *json) { - parse_buffer buffer = { 0, 0, 0, 0 }; + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; buffer.content = (const unsigned char*)json; buffer.length = strlen(json) + sizeof(""); + buffer.hooks = global_hooks; - TEST_ASSERT_TRUE(parse_array(item, &buffer, &global_hooks)); + TEST_ASSERT_TRUE(parse_array(item, &buffer)); assert_is_array(item); } diff --git a/tests/parse_number.c b/tests/parse_number.c index 29175bd0..f499ab65 100644 --- a/tests/parse_number.c +++ b/tests/parse_number.c @@ -45,7 +45,7 @@ static void assert_is_number(cJSON *number_item) static void assert_parse_number(const char *string, int integer, double real) { - parse_buffer buffer = { 0, 0, 0, 0 }; + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; buffer.content = (const unsigned char*)string; buffer.length = strlen(string) + sizeof(""); diff --git a/tests/parse_object.c b/tests/parse_object.c index 622254d8..09858455 100644 --- a/tests/parse_object.c +++ b/tests/parse_object.c @@ -52,22 +52,24 @@ static void assert_is_child(cJSON *child_item, const char *name, int type) static void assert_not_object(const char *json) { - parse_buffer parsebuffer = { 0, 0, 0, 0 }; + parse_buffer parsebuffer = { 0, 0, 0, 0, { 0, 0, 0 } }; parsebuffer.content = (const unsigned char*)json; parsebuffer.length = strlen(json) + sizeof(""); + parsebuffer.hooks = global_hooks; - TEST_ASSERT_FALSE(parse_object(item, &parsebuffer, &global_hooks)); + TEST_ASSERT_FALSE(parse_object(item, &parsebuffer)); assert_is_invalid(item); reset(item); } static void assert_parse_object(const char *json) { - parse_buffer parsebuffer = { 0, 0, 0, 0 }; + parse_buffer parsebuffer = { 0, 0, 0, 0, { 0, 0, 0 } }; parsebuffer.content = (const unsigned char*)json; parsebuffer.length = strlen(json) + sizeof(""); + parsebuffer.hooks = global_hooks; - TEST_ASSERT_TRUE(parse_object(item, &parsebuffer, &global_hooks)); + TEST_ASSERT_TRUE(parse_object(item, &parsebuffer)); assert_is_object(item); } diff --git a/tests/parse_string.c b/tests/parse_string.c index d03d9451..ceb1a896 100644 --- a/tests/parse_string.c +++ b/tests/parse_string.c @@ -45,11 +45,12 @@ static void assert_is_string(cJSON *string_item) static void assert_parse_string(const char *string, const char *expected) { - parse_buffer buffer = { 0, 0, 0, 0 }; + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; buffer.content = (const unsigned char*)string; buffer.length = strlen(string) + sizeof(""); + buffer.hooks = global_hooks; - TEST_ASSERT_TRUE_MESSAGE(parse_string(item, &buffer, &global_hooks), "Couldn't parse string."); + TEST_ASSERT_TRUE_MESSAGE(parse_string(item, &buffer), "Couldn't parse string."); assert_is_string(item); TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, item->valuestring, "The parsed result isn't as expected."); global_hooks.deallocate(item->valuestring); @@ -58,11 +59,12 @@ static void assert_parse_string(const char *string, const char *expected) static void assert_not_parse_string(const char * const string) { - parse_buffer buffer = { 0, 0, 0, 0 }; + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; buffer.content = (const unsigned char*)string; buffer.length = strlen(string) + sizeof(""); + buffer.hooks = global_hooks; - TEST_ASSERT_FALSE_MESSAGE(parse_string(item, &buffer, &global_hooks), "Malformed string should not be accepted."); + TEST_ASSERT_FALSE_MESSAGE(parse_string(item, &buffer), "Malformed string should not be accepted."); assert_is_invalid(item); } diff --git a/tests/parse_value.c b/tests/parse_value.c index 4910af97..08ec3e7a 100644 --- a/tests/parse_value.c +++ b/tests/parse_value.c @@ -43,10 +43,12 @@ static void assert_is_value(cJSON *value_item, int type) static void assert_parse_value(const char *string, int type) { - parse_buffer buffer = { 0, 0, 0, 0 }; + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; buffer.content = (const unsigned char*) string; buffer.length = strlen(string) + sizeof(""); - TEST_ASSERT_TRUE(parse_value(item, &buffer, &global_hooks)); + buffer.hooks = global_hooks; + + TEST_ASSERT_TRUE(parse_value(item, &buffer)); assert_is_value(item, type); } diff --git a/tests/print_array.c b/tests/print_array.c index 45a076b3..4bee17f9 100644 --- a/tests/print_array.c +++ b/tests/print_array.c @@ -31,34 +31,37 @@ static void assert_print_array(const char * const expected, const char * const i cJSON item[1]; - printbuffer formatted_buffer = { 0, 0, 0, 0, 0, 0 }; - printbuffer unformatted_buffer = { 0, 0, 0, 0, 0, 0 }; + printbuffer formatted_buffer = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + printbuffer unformatted_buffer = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; - parse_buffer parsebuffer = { 0, 0, 0, 0 }; + parse_buffer parsebuffer = { 0, 0, 0, 0, { 0, 0, 0 } }; parsebuffer.content = (const unsigned char*)input; parsebuffer.length = strlen(input) + sizeof(""); + parsebuffer.hooks = global_hooks; /* buffer for formatted printing */ formatted_buffer.buffer = printed_formatted; formatted_buffer.length = sizeof(printed_formatted); formatted_buffer.offset = 0; formatted_buffer.noalloc = true; + formatted_buffer.hooks = global_hooks; /* buffer for unformatted printing */ unformatted_buffer.buffer = printed_unformatted; unformatted_buffer.length = sizeof(printed_unformatted); unformatted_buffer.offset = 0; unformatted_buffer.noalloc = true; + unformatted_buffer.hooks = global_hooks; memset(item, 0, sizeof(item)); - TEST_ASSERT_TRUE_MESSAGE(parse_array(item, &parsebuffer, &global_hooks), "Failed to parse array."); + TEST_ASSERT_TRUE_MESSAGE(parse_array(item, &parsebuffer), "Failed to parse array."); unformatted_buffer.format = false; - TEST_ASSERT_TRUE_MESSAGE(print_array(item, &unformatted_buffer, &global_hooks), "Failed to print unformatted string."); + TEST_ASSERT_TRUE_MESSAGE(print_array(item, &unformatted_buffer), "Failed to print unformatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, printed_unformatted, "Unformatted array is not correct."); formatted_buffer.format = true; - TEST_ASSERT_TRUE_MESSAGE(print_array(item, &formatted_buffer, &global_hooks), "Failed to print formatted string."); + TEST_ASSERT_TRUE_MESSAGE(print_array(item, &formatted_buffer), "Failed to print formatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, printed_formatted, "Formatted array is not correct."); reset(item); diff --git a/tests/print_number.c b/tests/print_number.c index 68ce4dc0..8b5ae1f7 100644 --- a/tests/print_number.c +++ b/tests/print_number.c @@ -28,16 +28,17 @@ static void assert_print_number(const char *expected, double input) { unsigned char printed[1024]; cJSON item[1]; - printbuffer buffer = { 0, 0, 0, 0, 0, 0 }; + printbuffer buffer = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; buffer.buffer = printed; buffer.length = sizeof(printed); buffer.offset = 0; buffer.noalloc = true; + buffer.hooks = global_hooks; memset(item, 0, sizeof(item)); cJSON_SetNumberValue(item, input); - TEST_ASSERT_TRUE_MESSAGE(print_number(item, &buffer, &global_hooks), "Failed to print number."); + TEST_ASSERT_TRUE_MESSAGE(print_number(item, &buffer), "Failed to print number."); TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, buffer.buffer, "Printed number is not as expected."); } diff --git a/tests/print_object.c b/tests/print_object.c index d26fd143..70bbb43c 100644 --- a/tests/print_object.c +++ b/tests/print_object.c @@ -31,35 +31,38 @@ static void assert_print_object(const char * const expected, const char * const cJSON item[1]; - printbuffer formatted_buffer = { 0, 0, 0, 0, 0, 0 }; - printbuffer unformatted_buffer = { 0, 0, 0, 0, 0, 0 }; - parse_buffer parsebuffer = { 0, 0, 0, 0 }; + printbuffer formatted_buffer = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + printbuffer unformatted_buffer = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + parse_buffer parsebuffer = { 0, 0, 0, 0, { 0, 0, 0 } }; /* buffer for parsing */ parsebuffer.content = (const unsigned char*)input; parsebuffer.length = strlen(input) + sizeof(""); + parsebuffer.hooks = global_hooks; /* buffer for formatted printing */ formatted_buffer.buffer = printed_formatted; formatted_buffer.length = sizeof(printed_formatted); formatted_buffer.offset = 0; formatted_buffer.noalloc = true; + formatted_buffer.hooks = global_hooks; /* buffer for unformatted printing */ unformatted_buffer.buffer = printed_unformatted; unformatted_buffer.length = sizeof(printed_unformatted); unformatted_buffer.offset = 0; unformatted_buffer.noalloc = true; + unformatted_buffer.hooks = global_hooks; memset(item, 0, sizeof(item)); - TEST_ASSERT_TRUE_MESSAGE(parse_object(item, &parsebuffer, &global_hooks), "Failed to parse object."); + TEST_ASSERT_TRUE_MESSAGE(parse_object(item, &parsebuffer), "Failed to parse object."); unformatted_buffer.format = false; - TEST_ASSERT_TRUE_MESSAGE(print_object(item, &unformatted_buffer, &global_hooks), "Failed to print unformatted string."); + TEST_ASSERT_TRUE_MESSAGE(print_object(item, &unformatted_buffer), "Failed to print unformatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, printed_unformatted, "Unformatted object is not correct."); formatted_buffer.format = true; - TEST_ASSERT_TRUE_MESSAGE(print_object(item, &formatted_buffer, &global_hooks), "Failed to print formatted string."); + TEST_ASSERT_TRUE_MESSAGE(print_object(item, &formatted_buffer), "Failed to print formatted string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, printed_formatted, "Formatted ojbect is not correct."); reset(item); diff --git a/tests/print_string.c b/tests/print_string.c index 4416d243..83de1e7a 100644 --- a/tests/print_string.c +++ b/tests/print_string.c @@ -27,13 +27,14 @@ static void assert_print_string(const char *expected, const char *input) { unsigned char printed[1024]; - printbuffer buffer = { 0, 0, 0, 0, 0, 0 }; + printbuffer buffer = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; buffer.buffer = printed; buffer.length = sizeof(printed); buffer.offset = 0; buffer.noalloc = true; + buffer.hooks = global_hooks; - TEST_ASSERT_TRUE_MESSAGE(print_string_ptr((const unsigned char*)input, &buffer, &global_hooks), "Failed to print string."); + TEST_ASSERT_TRUE_MESSAGE(print_string_ptr((const unsigned char*)input, &buffer), "Failed to print string."); TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, printed, "The printed string isn't as expected."); } diff --git a/tests/print_value.c b/tests/print_value.c index 3e11e5a2..d5908232 100644 --- a/tests/print_value.c +++ b/tests/print_value.c @@ -32,21 +32,23 @@ static void assert_print_value(const char *input) { unsigned char printed[1024]; cJSON item[1]; - printbuffer buffer = { 0, 0, 0, 0, 0, 0 }; - parse_buffer parsebuffer = { 0, 0, 0, 0 }; + printbuffer buffer = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + parse_buffer parsebuffer = { 0, 0, 0, 0, { 0, 0, 0 } }; buffer.buffer = printed; buffer.length = sizeof(printed); buffer.offset = 0; buffer.noalloc = true; + buffer.hooks = global_hooks; parsebuffer.content = (const unsigned char*)input; parsebuffer.length = strlen(input) + sizeof(""); + parsebuffer.hooks = global_hooks; memset(item, 0, sizeof(item)); - TEST_ASSERT_TRUE_MESSAGE(parse_value(item, &parsebuffer, &global_hooks), "Failed to parse value."); + TEST_ASSERT_TRUE_MESSAGE(parse_value(item, &parsebuffer), "Failed to parse value."); - TEST_ASSERT_TRUE_MESSAGE(print_value(item, &buffer, &global_hooks), "Failed to print value."); + TEST_ASSERT_TRUE_MESSAGE(print_value(item, &buffer), "Failed to print value."); TEST_ASSERT_EQUAL_STRING_MESSAGE(input, buffer.buffer, "Printed value is not as expected."); reset(item); From ab77a80e9b861e7ca9677b3163c45bfe1ee7218b Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Thu, 27 Apr 2017 02:54:33 +0200 Subject: [PATCH 054/126] Squashed 'tests/unity/' changes from 1f52255..f96c055 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit f96c055 this is a minor release 2c7629a Documentation Updates b8bfb01 Add support for AStyle in test makefile. It’s going to assume you have it installed. e36d8b5 Merge pull request #276 from wolf99/pdf-to-markdown 1e43967 Add EACH_EQUAL changes e2cc679 Add newlines after headings for best practice, trim trailing spaces & convert sneaky incorrectly coded chars 192d517 Remove PDFs c48f6c9 Add Github Markdown versions of documents 2a5b24f Finished updating all Ruby scripts to match our coding standard. Woo! 3e0a712 Started to flesh out rubocop settings for this project. Added rakefile tasks to do so. Updated first script to make it compliant. 23f9c16 Another round of fixing things that the stylizer “corrected” for me. 3a6cca3 Fixed things that the stylizer “autocorrected” to wrong. ;) 3062c39 Starting to enforce our coding style. The first step is that we’ve pulled in Rubocop to check out Ruby syntax. There is likely a bit of customization to do yet AND there is definitely that backlog of todo’s that we just told it to ignore. 550d58b Attempt to fix remaining issues with casting ee038c2 Ha! Forgot to add the correct comment style d6b3508 Clean up some const issues, particularly when moving between single and double pointers 4ffafce Finish updating documentation to match 083564b Update docs to also understand the new Each Equal handlers 0dddf49 also update strings to support each element of an array. a11a137 Added memory each equal assertion d8d67a7 Added each_equal assertions for float and double b7956ea Added more tests for all the numerical types when performing each_equal assertions 7fe3191 Added some tests to prove this works. Still work in progress 56eeacd prepare for comparing value to array by setting up explicit compare of array to array in ints 7b80885 Merge pull request #272 from FSMaxB/gcc43-wconversion 0781e74 Add our coding standard to documentation c3658a0 Dropped support for pre-2.0 versions of Ruby (not even rubylang supports them anymore) 8a45ccf Use custom mock prefix when searching for mock header files. #263 689610b reorder includes in generated test runners 43c7511 stdlib.h explicitly called in fixtures when malloc used, now. (Fixes issue #268) 1c556d2 Fix -Wconversion with gcc-4.3 8723d50 Turn UNITY_OUTPUT_FLUSH off by default. Added a quick-define for the most common case: UNITY_USE_FLUSH_STDOUT. Clarified documentation. Fixes issue #269 c67a4ff - Add ability to detect TEST_FILE(“filename.c”) specifications in test files 41ee499 Tiny tweaks to make Unity fit in more smoothly with Ceedling git-subtree-dir: tests/unity git-subtree-split: f96c05532b3e00c9ca77e58fc07f9401cd46510d --- .travis.yml | 4 +- README.md | 25 +- auto/colour_prompt.rb | 131 +-- auto/colour_reporter.rb | 40 +- auto/generate_module.rb | 285 +++--- auto/generate_test_runner.rb | 466 ++++----- auto/parseOutput.rb | 224 ----- auto/parse_output.rb | 220 ++++ auto/stylize_as_junit.rb | 228 ++--- auto/test_file_filter.rb | 20 +- auto/type_sanitizer.rb | 4 +- auto/unity_test_summary.rb | 102 +- docs/ThrowTheSwitchCodingStandard.md | 207 ++++ ...tSuitableforPrintingandPossiblyFraming.pdf | Bin 146272 -> 144467 bytes docs/UnityAssertionsReference.md | 716 +++++++++++++ docs/UnityAssertionsReference.pdf | Bin 320499 -> 0 bytes docs/UnityConfigurationGuide.md | 398 ++++++++ docs/UnityConfigurationGuide.pdf | Bin 253175 -> 0 bytes docs/UnityGettingStartedGuide.md | 191 ++++ docs/UnityGettingStartedGuide.pdf | Bin 166200 -> 0 bytes docs/UnityHelperScriptsGuide.md | 242 +++++ docs/UnityHelperScriptsGuide.pdf | Bin 181016 -> 0 bytes examples/example_3/rakefile.rb | 30 +- examples/example_3/rakefile_helper.rb | 195 ++-- extras/fixture/rakefile.rb | 24 +- extras/fixture/rakefile_helper.rb | 175 ++-- .../src/unity_fixture_malloc_overrides.h | 1 + release/version.info | 2 +- src/unity.c | 154 ++- src/unity.h | 48 + src/unity_internals.h | 112 ++- test/.rubocop.yml | 58 ++ test/rakefile | 57 +- test/rakefile_helper.rb | 213 ++-- test/targets/clang_strict.yml | 4 +- test/testdata/testRunnerGeneratorSmall.c | 2 + test/tests/test_generate_test_runner.rb | 10 +- test/tests/testunity.c | 943 +++++++++++++++++- 38 files changed, 4252 insertions(+), 1279 deletions(-) delete mode 100644 auto/parseOutput.rb create mode 100644 auto/parse_output.rb create mode 100644 docs/ThrowTheSwitchCodingStandard.md create mode 100644 docs/UnityAssertionsReference.md delete mode 100644 docs/UnityAssertionsReference.pdf create mode 100644 docs/UnityConfigurationGuide.md delete mode 100644 docs/UnityConfigurationGuide.pdf create mode 100644 docs/UnityGettingStartedGuide.md delete mode 100644 docs/UnityGettingStartedGuide.pdf create mode 100644 docs/UnityHelperScriptsGuide.md delete mode 100644 docs/UnityHelperScriptsGuide.pdf create mode 100644 test/.rubocop.yml diff --git a/.travis.yml b/.travis.yml index edf25ee9..8ae9fa0c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,9 @@ matrix: before_install: - if [ "$TRAVIS_OS_NAME" == "osx" ]; then rvm install 2.1 && rvm use 2.1 && ruby -v; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install --assume-yes --quiet gcc-multilib; fi -install: gem install rspec +install: + - gem install rspec + - gem install rubocop script: - cd test && rake ci - make -s diff --git a/README.md b/README.md index 11759c84..17ab5747 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Unity Test API ============== [![Unity Build Status](https://api.travis-ci.org/ThrowTheSwitch/Unity.png?branch=master)](https://travis-ci.org/ThrowTheSwitch/Unity) -__Copyright (c) 2007 - 2014 Unity Project by Mike Karlesky, Mark VanderVoord, and Greg Williams__ +__Copyright (c) 2007 - 2017 Unity Project by Mike Karlesky, Mark VanderVoord, and Greg Williams__ Running Tests ------------- @@ -109,6 +109,18 @@ Compares two integers for equality and display errors as hexadecimal. Like the you can specify the size... here the size will also effect how many nibbles are shown (for example, `HEX16` will show 4 nibbles). + TEST_ASSERT_EQUAL(expected, actual) + +Another way of calling TEST_ASSERT_EQUAL_INT + + TEST_ASSERT_INT_WITHIN(delta, expected, actual) + +Asserts that the actual value is within plus or minus delta of the expected value. This also comes in +size specific variants. + +Arrays +------ + _ARRAY You can append `_ARRAY` to any of these macros to make an array comparison of that type. Here you will @@ -117,15 +129,12 @@ additional argument which is the number of elements to compare. For example: TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, elements) - TEST_ASSERT_EQUAL(expected, actual) - -Another way of calling TEST_ASSERT_EQUAL_INT - - TEST_ASSERT_INT_WITHIN(delta, expected, actual) + _EACH_EQUAL -Asserts that the actual value is within plus or minus delta of the expected value. This also comes in -size specific variants. +Another array comparison option is to check that EVERY element of an array is equal to a single expected +value. You do this by specifying the EACH_EQUAL macro. For example: + TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, elements) Numerical Assertions: Bitwise ----------------------------- diff --git a/auto/colour_prompt.rb b/auto/colour_prompt.rb index 8adab6e6..0f1dc4e0 100644 --- a/auto/colour_prompt.rb +++ b/auto/colour_prompt.rb @@ -4,63 +4,62 @@ # [Released under MIT License. Please refer to license.txt for details] # ========================================== -if RUBY_PLATFORM =~/(win|w)32$/ - begin - require 'Win32API' - rescue LoadError - puts "ERROR! \"Win32API\" library not found" - puts "\"Win32API\" is required for colour on a windows machine" - puts " try => \"gem install Win32API\" on the command line" - puts - end - # puts +if RUBY_PLATFORM =~ /(win|w)32$/ + begin + require 'Win32API' + rescue LoadError + puts 'ERROR! "Win32API" library not found' + puts '"Win32API" is required for colour on a windows machine' + puts ' try => "gem install Win32API" on the command line' + puts + end + # puts # puts 'Windows Environment Detected...' - # puts 'Win32API Library Found.' - # puts + # puts 'Win32API Library Found.' + # puts end class ColourCommandLine def initialize - if RUBY_PLATFORM =~/(win|w)32$/ - get_std_handle = Win32API.new("kernel32", "GetStdHandle", ['L'], 'L') - @set_console_txt_attrb = - Win32API.new("kernel32","SetConsoleTextAttribute",['L','N'], 'I') - @hout = get_std_handle.call(-11) - end + return unless RUBY_PLATFORM =~ /(win|w)32$/ + get_std_handle = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L') + @set_console_txt_attrb = + Win32API.new('kernel32', 'SetConsoleTextAttribute', %w(L N), 'I') + @hout = get_std_handle.call(-11) end def change_to(new_colour) - if RUBY_PLATFORM =~/(win|w)32$/ - @set_console_txt_attrb.call(@hout,self.win32_colour(new_colour)) + if RUBY_PLATFORM =~ /(win|w)32$/ + @set_console_txt_attrb.call(@hout, win32_colour(new_colour)) else - "\033[30;#{posix_colour(new_colour)};22m" - end + "\033[30;#{posix_colour(new_colour)};22m" + end end def win32_colour(colour) case colour - when :black then 0 - when :dark_blue then 1 - when :dark_green then 2 - when :dark_cyan then 3 - when :dark_red then 4 - when :dark_purple then 5 - when :dark_yellow, :narrative then 6 - when :default_white, :default, :dark_white then 7 - when :silver then 8 - when :blue then 9 - when :green, :success then 10 - when :cyan, :output then 11 - when :red, :failure then 12 - when :purple then 13 - when :yellow then 14 - when :white then 15 - else - 0 + when :black then 0 + when :dark_blue then 1 + when :dark_green then 2 + when :dark_cyan then 3 + when :dark_red then 4 + when :dark_purple then 5 + when :dark_yellow, :narrative then 6 + when :default_white, :default, :dark_white then 7 + when :silver then 8 + when :blue then 9 + when :green, :success then 10 + when :cyan, :output then 11 + when :red, :failure then 12 + when :purple then 13 + when :yellow then 14 + when :white then 15 + else + 0 end end - def posix_colour(colour) + def posix_colour(colour) # ANSI Escape Codes - Foreground colors # | Code | Color | # | 39 | Default foreground color | @@ -81,35 +80,39 @@ def posix_colour(colour) # | 96 | Light cyan | # | 97 | White | - case colour - when :black then 30 - when :red, :failure then 31 - when :green, :success then 32 - when :yellow then 33 - when :blue, :narrative then 34 - when :purple, :magenta then 35 - when :cyan, :output then 36 - when :white, :default_white then 37 - when :default then 39 - else - 39 + case colour + when :black then 30 + when :red, :failure then 31 + when :green, :success then 32 + when :yellow then 33 + when :blue, :narrative then 34 + when :purple, :magenta then 35 + when :cyan, :output then 36 + when :white, :default_white then 37 + when :default then 39 + else + 39 end end def out_c(mode, colour, str) case RUBY_PLATFORM - when /(win|w)32$/ - change_to(colour) - $stdout.puts str if mode == :puts - $stdout.print str if mode == :print - change_to(:default_white) - else - $stdout.puts("#{change_to(colour)}#{str}\033[0m") if mode == :puts - $stdout.print("#{change_to(colour)}#{str}\033[0m") if mode == :print - end + when /(win|w)32$/ + change_to(colour) + $stdout.puts str if mode == :puts + $stdout.print str if mode == :print + change_to(:default_white) + else + $stdout.puts("#{change_to(colour)}#{str}\033[0m") if mode == :puts + $stdout.print("#{change_to(colour)}#{str}\033[0m") if mode == :print + end end end # ColourCommandLine -def colour_puts(role,str) ColourCommandLine.new.out_c(:puts, role, str) end -def colour_print(role,str) ColourCommandLine.new.out_c(:print, role, str) end +def colour_puts(role, str) + ColourCommandLine.new.out_c(:puts, role, str) +end +def colour_print(role, str) + ColourCommandLine.new.out_c(:print, role, str) +end diff --git a/auto/colour_reporter.rb b/auto/colour_reporter.rb index 5aa1d277..bb1fbfce 100644 --- a/auto/colour_reporter.rb +++ b/auto/colour_reporter.rb @@ -2,38 +2,38 @@ # Unity Project - A Test Framework for C # Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams # [Released under MIT License. Please refer to license.txt for details] -# ========================================== +# ========================================== require "#{File.expand_path(File.dirname(__FILE__))}/colour_prompt" $colour_output = true def report(message) - if not $colour_output + if !$colour_output $stdout.puts(message) else - message = message.join('\n') if (message.class == Array) + message = message.join('\n') if message.class == Array message.each_line do |line| line.chomp! - colour = case(line) - when /(?:total\s+)?tests:?\s+(\d+)\s+(?:total\s+)?failures:?\s+\d+\s+Ignored:?/i - ($1.to_i == 0) ? :green : :red - when /PASS/ - :green - when /^OK$/ - :green - when /(?:FAIL|ERROR)/ - :red - when /IGNORE/ - :yellow - when /^(?:Creating|Compiling|Linking)/ - :white - else - :silver - end + colour = case line + when /(?:total\s+)?tests:?\s+(\d+)\s+(?:total\s+)?failures:?\s+\d+\s+Ignored:?/i + Regexp.last_match(1).to_i.zero? ? :green : :red + when /PASS/ + :green + when /^OK$/ + :green + when /(?:FAIL|ERROR)/ + :red + when /IGNORE/ + :yellow + when /^(?:Creating|Compiling|Linking)/ + :white + else + :silver + end colour_puts(colour, line) end end $stdout.flush $stderr.flush -end \ No newline at end of file +end diff --git a/auto/generate_module.rb b/auto/generate_module.rb index 0fbaf559..ade4f1a9 100644 --- a/auto/generate_module.rb +++ b/auto/generate_module.rb @@ -12,8 +12,8 @@ require 'fileutils' require 'pathname' -#TEMPLATE_TST -TEMPLATE_TST ||= %q[#include "unity.h" +# TEMPLATE_TST +TEMPLATE_TST ||= '#include "unity.h" %2$s#include "%1$s.h" void setUp(void) @@ -28,115 +28,118 @@ { TEST_IGNORE_MESSAGE("Need to Implement %1$s"); } -] +'.freeze -#TEMPLATE_SRC -TEMPLATE_SRC ||= %q[%2$s#include "%1$s.h" -] +# TEMPLATE_SRC +TEMPLATE_SRC ||= '%2$s#include "%1$s.h" +'.freeze -#TEMPLATE_INC -TEMPLATE_INC ||= %q[#ifndef _%3$s_H +# TEMPLATE_INC +TEMPLATE_INC ||= '#ifndef _%3$s_H #define _%3$s_H %2$s #endif // _%3$s_H -] +'.freeze class UnityModuleGenerator - ############################ - def initialize(options=nil) - + def initialize(options = nil) here = File.expand_path(File.dirname(__FILE__)) + '/' @options = UnityModuleGenerator.default_options - case(options) - when NilClass then @options - when String then @options.merge!(UnityModuleGenerator.grab_config(options)) - when Hash then @options.merge!(options) - else raise "If you specify arguments, it should be a filename or a hash of options" + case options + when NilClass then @options + when String then @options.merge!(UnityModuleGenerator.grab_config(options)) + when Hash then @options.merge!(options) + else raise 'If you specify arguments, it should be a filename or a hash of options' end # Create default file paths if none were provided - @options[:path_src] = here + "../src/" if @options[:path_src].nil? + @options[:path_src] = here + '../src/' if @options[:path_src].nil? @options[:path_inc] = @options[:path_src] if @options[:path_inc].nil? - @options[:path_tst] = here + "../test/" if @options[:path_tst].nil? - @options[:path_src] += '/' unless (@options[:path_src][-1] == 47) - @options[:path_inc] += '/' unless (@options[:path_inc][-1] == 47) - @options[:path_tst] += '/' unless (@options[:path_tst][-1] == 47) - - #Built in patterns - @patterns = { 'src' => {'' => { :inc => [] } }, - 'test'=> {'' => { :inc => [] } }, - 'dh' => {'Driver' => { :inc => [create_filename('%1$s','Hardware.h')] }, - 'Hardware' => { :inc => [] } - }, - 'dih' => {'Driver' => { :inc => [create_filename('%1$s','Hardware.h'), create_filename('%1$s','Interrupt.h')] }, - 'Interrupt'=> { :inc => [create_filename('%1$s','Hardware.h')] }, - 'Hardware' => { :inc => [] } - }, - 'mch' => {'Model' => { :inc => [] }, - 'Conductor'=> { :inc => [create_filename('%1$s','Model.h'), create_filename('%1$s','Hardware.h')] }, - 'Hardware' => { :inc => [] } - }, - 'mvp' => {'Model' => { :inc => [] }, - 'Presenter'=> { :inc => [create_filename('%1$s','Model.h'), create_filename('%1$s','View.h')] }, - 'View' => { :inc => [] } - } - } + @options[:path_tst] = here + '../test/' if @options[:path_tst].nil? + @options[:path_src] += '/' unless @options[:path_src][-1] == 47 + @options[:path_inc] += '/' unless @options[:path_inc][-1] == 47 + @options[:path_tst] += '/' unless @options[:path_tst][-1] == 47 + + # Built in patterns + @patterns = { + 'src' => { + '' => { inc: [] } + }, + 'test' => { + '' => { inc: [] } + }, + 'dh' => { + 'Driver' => { inc: [create_filename('%1$s', 'Hardware.h')] }, + 'Hardware' => { inc: [] } + }, + 'dih' => { + 'Driver' => { inc: [create_filename('%1$s', 'Hardware.h'), create_filename('%1$s', 'Interrupt.h')] }, + 'Interrupt' => { inc: [create_filename('%1$s', 'Hardware.h')] }, + 'Hardware' => { inc: [] } + }, + 'mch' => { + 'Model' => { inc: [] }, + 'Conductor' => { inc: [create_filename('%1$s', 'Model.h'), create_filename('%1$s', 'Hardware.h')] }, + 'Hardware' => { inc: [] } + }, + 'mvp' => { + 'Model' => { inc: [] }, + 'Presenter' => { inc: [create_filename('%1$s', 'Model.h'), create_filename('%1$s', 'View.h')] }, + 'View' => { inc: [] } + } + } end ############################ def self.default_options { - :pattern => "src", - :includes => - { - :src => [], - :inc => [], - :tst => [], + pattern: 'src', + includes: { + src: [], + inc: [], + tst: [] }, - :update_svn => false, - :boilerplates => {}, - :test_prefix => 'Test', - :mock_prefix => 'Mock', + update_svn: false, + boilerplates: {}, + test_prefix: 'Test', + mock_prefix: 'Mock' } end ############################ def self.grab_config(config_file) - options = self.default_options - unless (config_file.nil? or config_file.empty?) + options = default_options + unless config_file.nil? || config_file.empty? require 'yaml' yaml_guts = YAML.load_file(config_file) options.merge!(yaml_guts[:unity] || yaml_guts[:cmock]) raise "No :unity or :cmock section found in #{config_file}" unless options end - return(options) + options end ############################ - def files_to_operate_on(module_name, pattern=nil) - #strip any leading path information from the module name and save for later + def files_to_operate_on(module_name, pattern = nil) + # strip any leading path information from the module name and save for later subfolder = File.dirname(module_name) module_name = File.basename(module_name) - #create triad definition + # create triad definition prefix = @options[:test_prefix] || 'Test' - triad = [ { :ext => '.c', :path => @options[:path_src], :prefix => "", :template => TEMPLATE_SRC, :inc => :src, :boilerplate => @options[:boilerplates][:src] }, - { :ext => '.h', :path => @options[:path_inc], :prefix => "", :template => TEMPLATE_INC, :inc => :inc, :boilerplate => @options[:boilerplates][:inc] }, - { :ext => '.c', :path => @options[:path_tst], :prefix => prefix, :template => TEMPLATE_TST, :inc => :tst, :boilerplate => @options[:boilerplates][:tst] }, - ] + triad = [{ ext: '.c', path: @options[:path_src], prefix: '', template: TEMPLATE_SRC, inc: :src, boilerplate: @options[:boilerplates][:src] }, + { ext: '.h', path: @options[:path_inc], prefix: '', template: TEMPLATE_INC, inc: :inc, boilerplate: @options[:boilerplates][:inc] }, + { ext: '.c', path: @options[:path_tst], prefix: prefix, template: TEMPLATE_TST, inc: :tst, boilerplate: @options[:boilerplates][:tst] }] - #prepare the pattern for use + # prepare the pattern for use pattern = (pattern || @options[:pattern] || 'src').downcase patterns = @patterns[pattern] raise "ERROR: The design pattern '#{pattern}' specified isn't one that I recognize!" if patterns.nil? - #single file patterns (currently just 'test') can reject the other parts of the triad - if (pattern == 'test') - triad.reject!{|v| v[:inc] != :tst } - end + # single file patterns (currently just 'test') can reject the other parts of the triad + triad.select! { |v| v[:inc] == :tst } if pattern == 'test' # Assemble the path/names of the files we need to work with. files = [] @@ -145,26 +148,26 @@ def files_to_operate_on(module_name, pattern=nil) submodule_name = create_filename(module_name, pattern_file) filename = cfg[:prefix] + submodule_name + cfg[:ext] files << { - :path => (Pathname.new("#{cfg[:path]}#{subfolder}") + filename).cleanpath, - :name => submodule_name, - :template => cfg[:template], - :boilerplate => cfg[:boilerplate], - :includes => case(cfg[:inc]) - when :src then (@options[:includes][:src] || []) | pattern_traits[:inc].map{|f| f % [module_name]} - when :inc then (@options[:includes][:inc] || []) - when :tst then (@options[:includes][:tst] || []) | pattern_traits[:inc].map{|f| "#{@options[:mock_prefix]}#{f}" % [module_name]} - end + path: (Pathname.new("#{cfg[:path]}#{subfolder}") + filename).cleanpath, + name: submodule_name, + template: cfg[:template], + boilerplate: cfg[:boilerplate], + includes: case (cfg[:inc]) + when :src then (@options[:includes][:src] || []) | (pattern_traits[:inc].map { |f| format(f, module_name) }) + when :inc then (@options[:includes][:inc] || []) + when :tst then (@options[:includes][:tst] || []) | (pattern_traits[:inc].map { |f| format("#{@options[:mock_prefix]}#{f}", module_name) }) + end } end end - return files + files end ############################ - def create_filename(part1, part2="") + def create_filename(part1, part2 = '') if part2.empty? - case(@options[:naming]) + case (@options[:naming]) when 'bumpy' then part1 when 'camel' then part1 when 'snake' then part1.downcase @@ -172,49 +175,45 @@ def create_filename(part1, part2="") else part1.downcase end else - case(@options[:naming]) + case (@options[:naming]) when 'bumpy' then part1 + part2 when 'camel' then part1 + part2 - when 'snake' then part1.downcase + "_" + part2.downcase - when 'caps' then part1.upcase + "_" + part2.upcase - else part1.downcase + "_" + part2.downcase + when 'snake' then part1.downcase + '_' + part2.downcase + when 'caps' then part1.upcase + '_' + part2.upcase + else part1.downcase + '_' + part2.downcase end end end ############################ - def generate(module_name, pattern=nil) - + def generate(module_name, pattern = nil) files = files_to_operate_on(module_name, pattern) - #Abort if all of the module files already exist + # Abort if all of the module files already exist all_files_exist = true files.each do |file| - if not File.exist?(file[:path]) - all_files_exist = false - end + all_files_exist = false unless File.exist?(file[:path]) end raise "ERROR: File #{files[0][:name]} already exists. Exiting." if all_files_exist # Create Source Modules - files.each_with_index do |file, i| + files.each_with_index do |file, _i| # If this file already exists, don't overwrite it. if File.exist?(file[:path]) puts "File #{file[:path]} already exists!" next end # Create the path first if necessary. - FileUtils.mkdir_p(File.dirname(file[:path]), :verbose => false) + FileUtils.mkdir_p(File.dirname(file[:path]), verbose: false) File.open(file[:path], 'w') do |f| f.write("#{file[:boilerplate]}\n" % [file[:name]]) unless file[:boilerplate].nil? - f.write(file[:template] % [ file[:name], - file[:includes].map{|f| "#include \"#{f}\"\n"}.join, - file[:name].upcase ] - ) + f.write(file[:template] % [file[:name], + file[:includes].map { |ff| "#include \"#{ff}\"\n" }.join, + file[:name].upcase]) end - if (@options[:update_svn]) + if @options[:update_svn] `svn add \"#{file[:path]}\"` - if $?.exitstatus == 0 + if $!.exitstatus.zero? puts "File #{file[:path]} created and added to source control" else puts "File #{file[:path]} created but FAILED adding to source control!" @@ -227,8 +226,7 @@ def generate(module_name, pattern=nil) end ############################ - def destroy(module_name, pattern=nil) - + def destroy(module_name, pattern = nil) files_to_operate_on(module_name, pattern).each do |filespec| file = filespec[:path] if File.exist?(file) @@ -243,66 +241,65 @@ def destroy(module_name, pattern=nil) puts "File #{file} does not exist so cannot be removed." end end - puts "Destroy Complete" + puts 'Destroy Complete' end - end ############################ -#Handle As Command Line If Called That Way -if ($0 == __FILE__) +# Handle As Command Line If Called That Way +if $0 == __FILE__ destroy = false - options = { } + options = {} module_name = nil # Parse the command line parameters. ARGV.each do |arg| - case(arg) - when /^-d/ then destroy = true - when /^-u/ then options[:update_svn] = true - when /^-p\"?(\w+)\"?/ then options[:pattern] = $1 - when /^-s\"?(.+)\"?/ then options[:path_src] = $1 - when /^-i\"?(.+)\"?/ then options[:path_inc] = $1 - when /^-t\"?(.+)\"?/ then options[:path_tst] = $1 - when /^-n\"?(.+)\"?/ then options[:naming] = $1 - when /^-y\"?(.+)\"?/ then options = UnityModuleGenerator.grab_config($1) - when /^(\w+)/ - raise "ERROR: You can't have more than one Module name specified!" unless module_name.nil? - module_name = arg - when /^-(h|-help)/ - ARGV = [] - else - raise "ERROR: Unknown option specified '#{arg}'" + case arg + when /^-d/ then destroy = true + when /^-u/ then options[:update_svn] = true + when /^-p\"?(\w+)\"?/ then options[:pattern] = Regexp.last_match(1) + when /^-s\"?(.+)\"?/ then options[:path_src] = Regexp.last_match(1) + when /^-i\"?(.+)\"?/ then options[:path_inc] = Regexp.last_match(1) + when /^-t\"?(.+)\"?/ then options[:path_tst] = Regexp.last_match(1) + when /^-n\"?(.+)\"?/ then options[:naming] = Regexp.last_match(1) + when /^-y\"?(.+)\"?/ then options = UnityModuleGenerator.grab_config(Regexp.last_match(1)) + when /^(\w+)/ + raise "ERROR: You can't have more than one Module name specified!" unless module_name.nil? + module_name = arg + when /^-(h|-help)/ + ARGV = [].freeze + else + raise "ERROR: Unknown option specified '#{arg}'" end end - if (!ARGV[0]) - puts [ "\nGENERATE MODULE\n-------- ------", - "\nUsage: ruby generate_module [options] module_name", - " -i\"include\" sets the path to output headers to 'include' (DEFAULT ../src)", - " -s\"../src\" sets the path to output source to '../src' (DEFAULT ../src)", - " -t\"C:/test\" sets the path to output source to 'C:/test' (DEFAULT ../test)", - " -p\"MCH\" sets the output pattern to MCH.", - " dh - driver hardware.", - " dih - driver interrupt hardware.", - " mch - model conductor hardware.", - " mvp - model view presenter.", - " src - just a source module, header and test. (DEFAULT)", - " test - just a test file.", - " -d destroy module instead of creating it.", - " -n\"camel\" sets the file naming convention.", - " bumpy - BumpyCaseFilenames.", - " camel - camelCaseFilenames.", - " snake - snake_case_filenames. (DEFAULT)", - " caps - CAPS_CASE_FILENAMES.", - " -u update subversion too (requires subversion command line)", - " -y\"my.yml\" selects a different yaml config file for module generation", - "" ].join("\n") + unless ARGV[0] + puts ["\nGENERATE MODULE\n-------- ------", + "\nUsage: ruby generate_module [options] module_name", + " -i\"include\" sets the path to output headers to 'include' (DEFAULT ../src)", + " -s\"../src\" sets the path to output source to '../src' (DEFAULT ../src)", + " -t\"C:/test\" sets the path to output source to 'C:/test' (DEFAULT ../test)", + ' -p"MCH" sets the output pattern to MCH.', + ' dh - driver hardware.', + ' dih - driver interrupt hardware.', + ' mch - model conductor hardware.', + ' mvp - model view presenter.', + ' src - just a source module, header and test. (DEFAULT)', + ' test - just a test file.', + ' -d destroy module instead of creating it.', + ' -n"camel" sets the file naming convention.', + ' bumpy - BumpyCaseFilenames.', + ' camel - camelCaseFilenames.', + ' snake - snake_case_filenames. (DEFAULT)', + ' caps - CAPS_CASE_FILENAMES.', + ' -u update subversion too (requires subversion command line)', + ' -y"my.yml" selects a different yaml config file for module generation', + ''].join("\n") exit end - raise "ERROR: You must have a Module name specified! (use option -h for help)" if module_name.nil? - if (destroy) + raise 'ERROR: You must have a Module name specified! (use option -h for help)' if module_name.nil? + if destroy UnityModuleGenerator.new(options).destroy(module_name) else UnityModuleGenerator.new(options).generate(module_name) diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index 8e8e5bbc..2c5e56a9 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -4,75 +4,70 @@ # [Released under MIT License. Please refer to license.txt for details] # ========================================== -$QUICK_RUBY_VERSION = RUBY_VERSION.split('.').inject(0){|vv,v| vv * 100 + v.to_i } -File.expand_path(File.join(File.dirname(__FILE__),'colour_prompt')) +File.expand_path(File.join(File.dirname(__FILE__), 'colour_prompt')) class UnityTestRunnerGenerator - def initialize(options = nil) @options = UnityTestRunnerGenerator.default_options - case(options) - when NilClass then @options - when String then @options.merge!(UnityTestRunnerGenerator.grab_config(options)) - when Hash then @options.merge!(options) - else raise "If you specify arguments, it should be a filename or a hash of options" + case options + when NilClass then @options + when String then @options.merge!(UnityTestRunnerGenerator.grab_config(options)) + when Hash then @options.merge!(options) + else raise 'If you specify arguments, it should be a filename or a hash of options' end require "#{File.expand_path(File.dirname(__FILE__))}/type_sanitizer" end def self.default_options { - :includes => [], - :defines => [], - :plugins => [], - :framework => :unity, - :test_prefix => "test|spec|should", - :setup_name => "setUp", - :teardown_name => "tearDown", - :main_name => "main", #set to :auto to automatically generate each time - :main_export_decl => "", - :cmdline_args => false, - :use_param_tests => false, + includes: [], + defines: [], + plugins: [], + framework: :unity, + test_prefix: 'test|spec|should', + mock_prefix: 'Mock', + setup_name: 'setUp', + teardown_name: 'tearDown', + main_name: 'main', # set to :auto to automatically generate each time + main_export_decl: '', + cmdline_args: false, + use_param_tests: false } end def self.grab_config(config_file) - options = self.default_options - unless (config_file.nil? or config_file.empty?) + options = default_options + unless config_file.nil? || config_file.empty? require 'yaml' yaml_guts = YAML.load_file(config_file) options.merge!(yaml_guts[:unity] || yaml_guts[:cmock]) raise "No :unity or :cmock section found in #{config_file}" unless options end - return(options) + options end - def run(input_file, output_file, options=nil) - tests = [] - testfile_includes = [] - used_mocks = [] - + def run(input_file, output_file, options = nil) @options.merge!(options) unless options.nil? - module_name = File.basename(input_file) - #pull required data from source file + # pull required data from source file source = File.read(input_file) - source = source.force_encoding("ISO-8859-1").encode("utf-8", :replace => nil) if ($QUICK_RUBY_VERSION > 10900) + source = source.force_encoding('ISO-8859-1').encode('utf-8', replace: nil) tests = find_tests(source) headers = find_includes(source) testfile_includes = (headers[:local] + headers[:system]) used_mocks = find_mocks(testfile_includes) testfile_includes = (testfile_includes - used_mocks) - testfile_includes.delete_if{|inc| inc =~ /(unity|cmock)/} + testfile_includes.delete_if { |inc| inc =~ /(unity|cmock)/ } - #build runner file + # build runner file generate(input_file, output_file, tests, used_mocks, testfile_includes) - #determine which files were used to return them + # determine which files were used to return them all_files_used = [input_file, output_file] - all_files_used += testfile_includes.map {|filename| filename + '.c'} unless testfile_includes.empty? + all_files_used += testfile_includes.map { |filename| filename + '.c' } unless testfile_includes.empty? all_files_used += @options[:includes] unless @options[:includes].empty? - return all_files_used.uniq + all_files_used += headers[:linkonly] unless headers[:linkonly].empty? + all_files_used.uniq end def generate(input_file, output_file, tests, used_mocks, testfile_includes) @@ -80,15 +75,16 @@ def generate(input_file, output_file, tests, used_mocks, testfile_includes) create_header(output, used_mocks, testfile_includes) create_externs(output, tests, used_mocks) create_mock_management(output, used_mocks) - create_suite_setup_and_teardown(output) + create_suite_setup(output) + create_suite_teardown(output) create_reset(output, used_mocks) create_main(output, input_file, tests, used_mocks) end - if (@options[:header_file] && !@options[:header_file].empty?) - File.open(@options[:header_file], 'w') do |output| - create_h_file(output, @options[:header_file], tests, testfile_includes, used_mocks) - end + return unless @options[:header_file] && !@options[:header_file].empty? + + File.open(@options[:header_file], 'w') do |output| + create_h_file(output, @options[:header_file], tests, testfile_includes, used_mocks) end end @@ -96,103 +92,102 @@ def find_tests(source) tests_and_line_numbers = [] source_scrubbed = source.clone - source_scrubbed = source_scrubbed.gsub(/"[^"\n]*"/, '') # remove things in strings + source_scrubbed = source_scrubbed.gsub(/"[^"\n]*"/, '') # remove things in strings source_scrubbed = source_scrubbed.gsub(/\/\/.*$/, '') # remove line comments source_scrubbed = source_scrubbed.gsub(/\/\*.*?\*\//m, '') # remove block comments lines = source_scrubbed.split(/(^\s*\#.*$) # Treat preprocessor directives as a logical line | (;|\{|\}) /x) # Match ;, {, and } as end of lines - lines.each_with_index do |line, index| - #find tests - if line =~ /^((?:\s*TEST_CASE\s*\(.*?\)\s*)*)\s*void\s+((?:#{@options[:test_prefix]}).*)\s*\(\s*(.*)\s*\)/ - arguments = $1 - name = $2 - call = $3 - params = $4 - args = nil - if (@options[:use_param_tests] and !arguments.empty?) - args = [] - arguments.scan(/\s*TEST_CASE\s*\((.*)\)\s*$/) {|a| args << a[0]} - end - tests_and_line_numbers << { :test => name, :args => args, :call => call, :params => params, :line_number => 0 } + lines.each_with_index do |line, _index| + # find tests + next unless line =~ /^((?:\s*TEST_CASE\s*\(.*?\)\s*)*)\s*void\s+((?:#{@options[:test_prefix]}).*)\s*\(\s*(.*)\s*\)/ + arguments = Regexp.last_match(1) + name = Regexp.last_match(2) + call = Regexp.last_match(3) + params = Regexp.last_match(4) + args = nil + if @options[:use_param_tests] && !arguments.empty? + args = [] + arguments.scan(/\s*TEST_CASE\s*\((.*)\)\s*$/) { |a| args << a[0] } end + tests_and_line_numbers << { test: name, args: args, call: call, params: params, line_number: 0 } end - tests_and_line_numbers.uniq! {|v| v[:test] } + tests_and_line_numbers.uniq! { |v| v[:test] } - #determine line numbers and create tests to run + # determine line numbers and create tests to run source_lines = source.split("\n") - source_index = 0; + source_index = 0 tests_and_line_numbers.size.times do |i| source_lines[source_index..-1].each_with_index do |line, index| - if (line =~ /#{tests_and_line_numbers[i][:test]}/) - source_index += index - tests_and_line_numbers[i][:line_number] = source_index + 1 - break - end + next unless line =~ /#{tests_and_line_numbers[i][:test]}/ + source_index += index + tests_and_line_numbers[i][:line_number] = source_index + 1 + break end end - return tests_and_line_numbers + tests_and_line_numbers end def find_includes(source) - - #remove comments (block and line, in three steps to ensure correct precedence) + # remove comments (block and line, in three steps to ensure correct precedence) source.gsub!(/\/\/(?:.+\/\*|\*(?:$|[^\/])).*$/, '') # remove line comments that comment out the start of blocks source.gsub!(/\/\*.*?\*\//m, '') # remove block comments source.gsub!(/\/\/.*$/, '') # remove line comments (all that remain) - #parse out includes + # parse out includes includes = { - :local => source.scan(/^\s*#include\s+\"\s*(.+)\.[hH]\s*\"/).flatten, - :system => source.scan(/^\s*#include\s+<\s*(.+)\s*>/).flatten.map { |inc| "<#{inc}>" } + local: source.scan(/^\s*#include\s+\"\s*(.+)\.[hH]\s*\"/).flatten, + system: source.scan(/^\s*#include\s+<\s*(.+)\s*>/).flatten.map { |inc| "<#{inc}>" }, + linkonly: source.scan(/^TEST_FILE\(\s*\"\s*(.+)\.[cC]\w*\s*\"/).flatten } - return includes + includes end def find_mocks(includes) mock_headers = [] includes.each do |include_path| include_file = File.basename(include_path) - mock_headers << include_path if (include_file =~ /^mock/i) + mock_headers << include_path if include_file =~ /^#{@options[:mock_prefix]}/i end - return mock_headers + mock_headers end - def create_header(output, mocks, testfile_includes=[]) + def create_header(output, mocks, testfile_includes = []) output.puts('/* AUTOGENERATED FILE. DO NOT EDIT. */') create_runtest(output, mocks) output.puts("\n/*=======Automagically Detected Files To Include=====*/") - output.puts("#include \"#{@options[:framework].to_s}.h\"") - output.puts('#include "cmock.h"') unless (mocks.empty?) + output.puts("#include \"#{@options[:framework]}.h\"") + output.puts('#include "cmock.h"') unless mocks.empty? output.puts('#include ') output.puts('#include ') - output.puts('#include "CException.h"') if @options[:plugins].include?(:cexception) - if (@options[:defines] && !@options[:defines].empty?) - @options[:defines].each {|d| output.puts("#define #{d}")} + if @options[:defines] && !@options[:defines].empty? + @options[:defines].each { |d| output.puts("#define #{d}") } end - if (@options[:header_file] && !@options[:header_file].empty?) + if @options[:header_file] && !@options[:header_file].empty? output.puts("#include \"#{File.basename(@options[:header_file])}\"") else @options[:includes].flatten.uniq.compact.each do |inc| - output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h','')}.h\""}") + output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h', '')}.h\""}") end testfile_includes.each do |inc| - output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h','')}.h\""}") + output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h', '')}.h\""}") end end mocks.each do |mock| - output.puts("#include \"#{mock.gsub('.h','')}.h\"") - end - if @options[:enforce_strict_ordering] - output.puts('') - output.puts('int GlobalExpectCount;') - output.puts('int GlobalVerifyOrder;') - output.puts('char* GlobalOrderError;') + output.puts("#include \"#{mock.gsub('.h', '')}.h\"") end + output.puts('#include "CException.h"') if @options[:plugins].include?(:cexception) + + return unless @options[:enforce_strict_ordering] + + output.puts('') + output.puts('int GlobalExpectCount;') + output.puts('int GlobalVerifyOrder;') + output.puts('char* GlobalOrderError;') end - def create_externs(output, tests, mocks) + def create_externs(output, tests, _mocks) output.puts("\n/*=======External Functions This Runner Calls=====*/") output.puts("extern void #{@options[:setup_name]}(void);") output.puts("extern void #{@options[:teardown_name]}(void);") @@ -203,55 +198,60 @@ def create_externs(output, tests, mocks) end def create_mock_management(output, mock_headers) - unless (mock_headers.empty?) - output.puts("\n/*=======Mock Management=====*/") - output.puts("static void CMock_Init(void)") - output.puts("{") - if @options[:enforce_strict_ordering] - output.puts(" GlobalExpectCount = 0;") - output.puts(" GlobalVerifyOrder = 0;") - output.puts(" GlobalOrderError = NULL;") - end - mocks = mock_headers.map {|mock| File.basename(mock)} - mocks.each do |mock| - mock_clean = TypeSanitizer.sanitize_c_identifier(mock) - output.puts(" #{mock_clean}_Init();") - end - output.puts("}\n") + return if mock_headers.empty? - output.puts("static void CMock_Verify(void)") - output.puts("{") - mocks.each do |mock| - mock_clean = TypeSanitizer.sanitize_c_identifier(mock) - output.puts(" #{mock_clean}_Verify();") - end - output.puts("}\n") + output.puts("\n/*=======Mock Management=====*/") + output.puts('static void CMock_Init(void)') + output.puts('{') - output.puts("static void CMock_Destroy(void)") - output.puts("{") - mocks.each do |mock| - mock_clean = TypeSanitizer.sanitize_c_identifier(mock) - output.puts(" #{mock_clean}_Destroy();") - end - output.puts("}\n") + if @options[:enforce_strict_ordering] + output.puts(' GlobalExpectCount = 0;') + output.puts(' GlobalVerifyOrder = 0;') + output.puts(' GlobalOrderError = NULL;') end - end - def create_suite_setup_and_teardown(output) - unless (@options[:suite_setup].nil?) - output.puts("\n/*=======Suite Setup=====*/") - output.puts("static void suite_setup(void)") - output.puts("{") - output.puts(@options[:suite_setup]) - output.puts("}") + mocks = mock_headers.map { |mock| File.basename(mock) } + mocks.each do |mock| + mock_clean = TypeSanitizer.sanitize_c_identifier(mock) + output.puts(" #{mock_clean}_Init();") end - unless (@options[:suite_teardown].nil?) - output.puts("\n/*=======Suite Teardown=====*/") - output.puts("static int suite_teardown(int num_failures)") - output.puts("{") - output.puts(@options[:suite_teardown]) - output.puts("}") + output.puts("}\n") + + output.puts('static void CMock_Verify(void)') + output.puts('{') + mocks.each do |mock| + mock_clean = TypeSanitizer.sanitize_c_identifier(mock) + output.puts(" #{mock_clean}_Verify();") + end + output.puts("}\n") + + output.puts('static void CMock_Destroy(void)') + output.puts('{') + mocks.each do |mock| + mock_clean = TypeSanitizer.sanitize_c_identifier(mock) + output.puts(" #{mock_clean}_Destroy();") end + output.puts("}\n") + end + + def create_suite_setup(output) + return if @options[:suite_setup].nil? + + output.puts("\n/*=======Suite Setup=====*/") + output.puts('static void suite_setup(void)') + output.puts('{') + output.puts(@options[:suite_setup]) + output.puts('}') + end + + def create_suite_teardown(output) + return if @options[:suite_teardown].nil? + + output.puts("\n/*=======Suite Teardown=====*/") + output.puts('static int suite_teardown(int num_failures)') + output.puts('{') + output.puts(@options[:suite_teardown]) + output.puts('}') end def create_runtest(output, used_mocks) @@ -259,124 +259,124 @@ def create_runtest(output, used_mocks) va_args1 = @options[:use_param_tests] ? ', ...' : '' va_args2 = @options[:use_param_tests] ? '__VA_ARGS__' : '' output.puts("\n/*=======Test Runner Used To Run Each Test Below=====*/") - output.puts("#define RUN_TEST_NO_ARGS") if @options[:use_param_tests] + output.puts('#define RUN_TEST_NO_ARGS') if @options[:use_param_tests] output.puts("#define RUN_TEST(TestFunc, TestLineNum#{va_args1}) \\") - output.puts("{ \\") + output.puts('{ \\') output.puts(" Unity.CurrentTestName = #TestFunc#{va_args2.empty? ? '' : " \"(\" ##{va_args2} \")\""}; \\") - output.puts(" Unity.CurrentTestLineNumber = TestLineNum; \\") - output.puts(" if (UnityTestMatches()) { \\") if (@options[:cmdline_args]) - output.puts(" Unity.NumberOfTests++; \\") - output.puts(" CMock_Init(); \\") unless (used_mocks.empty?) - output.puts(" UNITY_CLR_DETAILS(); \\") unless (used_mocks.empty?) - output.puts(" if (TEST_PROTECT()) \\") - output.puts(" { \\") - output.puts(" CEXCEPTION_T e; \\") if cexception - output.puts(" Try { \\") if cexception + output.puts(' Unity.CurrentTestLineNumber = TestLineNum; \\') + output.puts(' if (UnityTestMatches()) { \\') if @options[:cmdline_args] + output.puts(' Unity.NumberOfTests++; \\') + output.puts(' CMock_Init(); \\') unless used_mocks.empty? + output.puts(' UNITY_CLR_DETAILS(); \\') unless used_mocks.empty? + output.puts(' if (TEST_PROTECT()) \\') + output.puts(' { \\') + output.puts(' CEXCEPTION_T e; \\') if cexception + output.puts(' Try { \\') if cexception output.puts(" #{@options[:setup_name]}(); \\") output.puts(" TestFunc(#{va_args2}); \\") - output.puts(" } Catch(e) { TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, \"Unhandled Exception!\"); } \\") if cexception - output.puts(" } \\") - output.puts(" if (TEST_PROTECT()) \\") - output.puts(" { \\") + output.puts(' } Catch(e) { TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, "Unhandled Exception!"); } \\') if cexception + output.puts(' } \\') + output.puts(' if (TEST_PROTECT()) \\') + output.puts(' { \\') output.puts(" #{@options[:teardown_name]}(); \\") - output.puts(" CMock_Verify(); \\") unless (used_mocks.empty?) - output.puts(" } \\") - output.puts(" CMock_Destroy(); \\") unless (used_mocks.empty?) - output.puts(" UnityConcludeTest(); \\") - output.puts(" } \\") if (@options[:cmdline_args]) + output.puts(' CMock_Verify(); \\') unless used_mocks.empty? + output.puts(' } \\') + output.puts(' CMock_Destroy(); \\') unless used_mocks.empty? + output.puts(' UnityConcludeTest(); \\') + output.puts(' } \\') if @options[:cmdline_args] output.puts("}\n") end def create_reset(output, used_mocks) output.puts("\n/*=======Test Reset Option=====*/") - output.puts("void resetTest(void);") - output.puts("void resetTest(void)") - output.puts("{") - output.puts(" CMock_Verify();") unless (used_mocks.empty?) - output.puts(" CMock_Destroy();") unless (used_mocks.empty?) + output.puts('void resetTest(void);') + output.puts('void resetTest(void)') + output.puts('{') + output.puts(' CMock_Verify();') unless used_mocks.empty? + output.puts(' CMock_Destroy();') unless used_mocks.empty? output.puts(" #{@options[:teardown_name]}();") - output.puts(" CMock_Init();") unless (used_mocks.empty?) + output.puts(' CMock_Init();') unless used_mocks.empty? output.puts(" #{@options[:setup_name]}();") - output.puts("}") + output.puts('}') end def create_main(output, filename, tests, used_mocks) output.puts("\n\n/*=======MAIN=====*/") - main_name = (@options[:main_name].to_sym == :auto) ? "main_#{filename.gsub('.c','')}" : "#{@options[:main_name]}" - if (@options[:cmdline_args]) - if (main_name != "main") + main_name = @options[:main_name].to_sym == :auto ? "main_#{filename.gsub('.c', '')}" : (@options[:main_name]).to_s + if @options[:cmdline_args] + if main_name != 'main' output.puts("#{@options[:main_export_decl]} int #{main_name}(int argc, char** argv);") end output.puts("#{@options[:main_export_decl]} int #{main_name}(int argc, char** argv)") - output.puts("{") - output.puts(" int parse_status = UnityParseOptions(argc, argv);") - output.puts(" if (parse_status != 0)") - output.puts(" {") - output.puts(" if (parse_status < 0)") - output.puts(" {") - output.puts(" UnityPrint(\"#{filename.gsub('.c','')}.\");") - output.puts(" UNITY_PRINT_EOL();") - if (@options[:use_param_tests]) + output.puts('{') + output.puts(' int parse_status = UnityParseOptions(argc, argv);') + output.puts(' if (parse_status != 0)') + output.puts(' {') + output.puts(' if (parse_status < 0)') + output.puts(' {') + output.puts(" UnityPrint(\"#{filename.gsub('.c', '')}.\");") + output.puts(' UNITY_PRINT_EOL();') + if @options[:use_param_tests] tests.each do |test| - if ((test[:args].nil?) or (test[:args].empty?)) + if test[:args].nil? || test[:args].empty? output.puts(" UnityPrint(\" #{test[:test]}(RUN_TEST_NO_ARGS)\");") - output.puts(" UNITY_PRINT_EOL();") + output.puts(' UNITY_PRINT_EOL();') else test[:args].each do |args| output.puts(" UnityPrint(\" #{test[:test]}(#{args})\");") - output.puts(" UNITY_PRINT_EOL();") + output.puts(' UNITY_PRINT_EOL();') end end end else - tests.each { |test| output.puts(" UnityPrint(\" #{test[:test]}\");\n UNITY_PRINT_EOL();")} + tests.each { |test| output.puts(" UnityPrint(\" #{test[:test]}\");\n UNITY_PRINT_EOL();") } end - output.puts(" return 0;") - output.puts(" }") - output.puts(" return parse_status;") - output.puts(" }") + output.puts(' return 0;') + output.puts(' }') + output.puts(' return parse_status;') + output.puts(' }') else - if (main_name != "main") + if main_name != 'main' output.puts("#{@options[:main_export_decl]} int #{main_name}(void);") end output.puts("int #{main_name}(void)") - output.puts("{") + output.puts('{') end - output.puts(" suite_setup();") unless @options[:suite_setup].nil? - output.puts(" UnityBegin(\"#{filename.gsub(/\\/,'\\\\\\')}\");") - if (@options[:use_param_tests]) + output.puts(' suite_setup();') unless @options[:suite_setup].nil? + output.puts(" UnityBegin(\"#{filename.gsub(/\\/, '\\\\\\')}\");") + if @options[:use_param_tests] tests.each do |test| - if ((test[:args].nil?) or (test[:args].empty?)) + if test[:args].nil? || test[:args].empty? output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]}, RUN_TEST_NO_ARGS);") else - test[:args].each {|args| output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]}, #{args});")} + test[:args].each { |args| output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]}, #{args});") } end end else - tests.each { |test| output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]});") } + tests.each { |test| output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]});") } end - output.puts() - output.puts(" CMock_Guts_MemFreeFinal();") unless used_mocks.empty? - output.puts(" return #{@options[:suite_teardown].nil? ? "" : "suite_teardown"}(UnityEnd());") - output.puts("}") + output.puts + output.puts(' CMock_Guts_MemFreeFinal();') unless used_mocks.empty? + output.puts(" return #{@options[:suite_teardown].nil? ? '' : 'suite_teardown'}(UnityEnd());") + output.puts('}') end def create_h_file(output, filename, tests, testfile_includes, used_mocks) - filename = File.basename(filename).gsub(/[-\/\\\.\,\s]/, "_").upcase - output.puts("/* AUTOGENERATED FILE. DO NOT EDIT. */") + filename = File.basename(filename).gsub(/[-\/\\\.\,\s]/, '_').upcase + output.puts('/* AUTOGENERATED FILE. DO NOT EDIT. */') output.puts("#ifndef _#{filename}") output.puts("#define _#{filename}\n\n") - output.puts("#include \"#{@options[:framework].to_s}.h\"") - output.puts('#include "cmock.h"') unless (used_mocks.empty?) + output.puts("#include \"#{@options[:framework]}.h\"") + output.puts('#include "cmock.h"') unless used_mocks.empty? @options[:includes].flatten.uniq.compact.each do |inc| - output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h','')}.h\""}") + output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h', '')}.h\""}") end testfile_includes.each do |inc| - output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h','')}.h\""}") + output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h', '')}.h\""}") end output.puts "\n" tests.each do |test| - if ((test[:params].nil?) or (test[:params].empty?)) + if test[:params].nil? || test[:params].empty? output.puts("void #{test[:test]}(void);") else output.puts("void #{test[:test]}(#{test[:params]});") @@ -386,50 +386,52 @@ def create_h_file(output, filename, tests, testfile_includes, used_mocks) end end -if ($0 == __FILE__) - options = { :includes => [] } - yaml_file = nil +if $0 == __FILE__ + options = { includes: [] } - #parse out all the options first (these will all be removed as we go) + # parse out all the options first (these will all be removed as we go) ARGV.reject! do |arg| - case(arg) - when '-cexception' - options[:plugins] = [:cexception]; true - when /\.*\.ya?ml/ - options = UnityTestRunnerGenerator.grab_config(arg); true - when /--(\w+)=\"?(.*)\"?/ - options[$1.to_sym] = $2; true - when /\.*\.h/ - options[:includes] << arg; true - else false + case arg + when '-cexception' + options[:plugins] = [:cexception] + true + when /\.*\.ya?ml/ + options = UnityTestRunnerGenerator.grab_config(arg) + true + when /--(\w+)=\"?(.*)\"?/ + options[Regexp.last_match(1).to_sym] = Regexp.last_match(2) + true + when /\.*\.h/ + options[:includes] << arg + true + else false end end - #make sure there is at least one parameter left (the input file) - if !ARGV[0] + # make sure there is at least one parameter left (the input file) + unless ARGV[0] puts ["\nusage: ruby #{__FILE__} (files) (options) input_test_file (output)", - "\n input_test_file - this is the C file you want to create a runner for", - " output - this is the name of the runner file to generate", - " defaults to (input_test_file)_Runner", - " files:", - " *.yml / *.yaml - loads configuration from here in :unity or :cmock", - " *.h - header files are added as #includes in runner", - " options:", - " -cexception - include cexception support", - " --setup_name=\"\" - redefine setUp func name to something else", - " --teardown_name=\"\" - redefine tearDown func name to something else", - " --main_name=\"\" - redefine main func name to something else", - " --test_prefix=\"\" - redefine test prefix from default test|spec|should", - " --suite_setup=\"\" - code to execute for setup of entire suite", - " --suite_teardown=\"\" - code to execute for teardown of entire suite", - " --use_param_tests=1 - enable parameterized tests (disabled by default)", - " --header_file=\"\" - path/name of test header file to generate too" - ].join("\n") + "\n input_test_file - this is the C file you want to create a runner for", + ' output - this is the name of the runner file to generate', + ' defaults to (input_test_file)_Runner', + ' files:', + ' *.yml / *.yaml - loads configuration from here in :unity or :cmock', + ' *.h - header files are added as #includes in runner', + ' options:', + ' -cexception - include cexception support', + ' --setup_name="" - redefine setUp func name to something else', + ' --teardown_name="" - redefine tearDown func name to something else', + ' --main_name="" - redefine main func name to something else', + ' --test_prefix="" - redefine test prefix from default test|spec|should', + ' --suite_setup="" - code to execute for setup of entire suite', + ' --suite_teardown="" - code to execute for teardown of entire suite', + ' --use_param_tests=1 - enable parameterized tests (disabled by default)', + ' --header_file="" - path/name of test header file to generate too'].join("\n") exit 1 end - #create the default test runner name if not specified - ARGV[1] = ARGV[0].gsub(".c","_Runner.c") if (!ARGV[1]) + # create the default test runner name if not specified + ARGV[1] = ARGV[0].gsub('.c', '_Runner.c') unless ARGV[1] UnityTestRunnerGenerator.new(options).run(ARGV[0], ARGV[1]) end diff --git a/auto/parseOutput.rb b/auto/parseOutput.rb deleted file mode 100644 index e8dbf08b..00000000 --- a/auto/parseOutput.rb +++ /dev/null @@ -1,224 +0,0 @@ -#============================================================ -# Author: John Theofanopoulos -# A simple parser. Takes the output files generated during the build process and -# extracts information relating to the tests. -# -# Notes: -# To capture an output file under VS builds use the following: -# devenv [build instructions] > Output.txt & type Output.txt -# -# To capture an output file under GCC/Linux builds use the following: -# make | tee Output.txt -# -# To use this parser use the following command -# ruby parseOutput.rb [options] [file] -# options: -xml : produce a JUnit compatible XML file -# file : file to scan for results -#============================================================ - - -class ParseOutput -# The following flag is set to true when a test is found or false otherwise. - @testFlag - @xmlOut - @arrayList - @totalTests - @classIndex - -# Set the flag to indicate if there will be an XML output file or not - def setXmlOutput() - @xmlOut = true - end - -# if write our output to XML - def writeXmlOuput() - output = File.open("report.xml", "w") - output << "\n" - @arrayList.each do |item| - output << item << "\n" - end - output << "\n" - end - -# This function will try and determine when the suite is changed. This is -# is the name that gets added to the classname parameter. - def testSuiteVerify(testSuiteName) - if @testFlag == false - @testFlag = true; - # Split the path name - testName = testSuiteName.split("/") - # Remove the extension - baseName = testName[testName.size - 1].split(".") - @testSuite = "test." + baseName[0] - printf "New Test: %s\n", @testSuite - end - end - - -# Test was flagged as having passed so format the output - def testPassed(array) - lastItem = array.length - 1 - testName = array[lastItem - 1] - testSuiteVerify(array[@className]) - printf "%-40s PASS\n", testName - if @xmlOut == true - @arrayList.push " " - end - end - -# Test was flagged as having passed so format the output. -# This is using the Unity fixture output and not the original Unity output. - def testPassedUnityFixture(array) - testSuite = array[0].sub("TEST(", "") - testSuite = testSuite.sub(",", "") - testName = array[1].sub(")", "") - if @xmlOut == true - @arrayList.push " " - end - end - -# Test was flagged as being ingored so format the output - def testIgnored(array) - lastItem = array.length - 1 - testName = array[lastItem - 2] - reason = array[lastItem].chomp - testSuiteVerify(array[@className]) - printf "%-40s IGNORED\n", testName - - if testName.start_with? "TEST(" - array2 = testName.split(" ") - @testSuite = array2[0].sub("TEST(", "") - @testSuite = @testSuite.sub(",", "") - testName = array2[1].sub(")", "") - end - - if @xmlOut == true - @arrayList.push " " - @arrayList.push " " + reason + " " - @arrayList.push " " - end - end - -# Test was flagged as having failed so format the line - def testFailed(array) - lastItem = array.length - 1 - testName = array[lastItem - 2] - reason = array[lastItem].chomp + " at line: " + array[lastItem - 3] - testSuiteVerify(array[@className]) - printf "%-40s FAILED\n", testName - - if testName.start_with? "TEST(" - array2 = testName.split(" ") - @testSuite = array2[0].sub("TEST(", "") - @testSuite = @testSuite.sub(",", "") - testName = array2[1].sub(")", "") - end - - if @xmlOut == true - @arrayList.push " " - @arrayList.push " " + reason + " " - @arrayList.push " " - end - end - - -# Figure out what OS we are running on. For now we are assuming if it's not Windows it must -# be Unix based. - def detectOS() - myOS = RUBY_PLATFORM.split("-") - if myOS.size == 2 - if myOS[1] == "mingw32" - @className = 1 - else - @className = 0 - end - else - @className = 0 - end - - end - -# Main function used to parse the file that was captured. - def process(name) - @testFlag = false - @arrayList = Array.new - - detectOS() - - puts "Parsing file: " + name - - - testPass = 0 - testFail = 0 - testIgnore = 0 - puts "" - puts "=================== RESULTS =====================" - puts "" - File.open(name).each do |line| - # Typical test lines look like this: - # /.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0 - # /.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented - # /.c:115:test_tc5100_initCanVoidPtrs:PASS - # - # where path is different on Unix vs Windows devices (Windows leads with a drive letter) - lineArray = line.split(":") - lineSize = lineArray.size - # If we were able to split the line then we can look to see if any of our target words - # were found. Case is important. - if ((lineSize >= 4) || (line.start_with? "TEST(")) - # Determine if this test passed - if line.include? ":PASS" - testPassed(lineArray) - testPass += 1 - elsif line.include? ":FAIL:" - testFailed(lineArray) - testFail += 1 - elsif line.include? ":IGNORE:" - testIgnored(lineArray) - testIgnore += 1 - elsif line.start_with? "TEST(" - if line.include? " PASS" - lineArray = line.split(" ") - testPassedUnityFixture(lineArray) - testPass += 1 - end - # If none of the keywords are found there are no more tests for this suite so clear - # the test flag - else - @testFlag = false - end - else - @testFlag = false - end - end - puts "" - puts "=================== SUMMARY =====================" - puts "" - puts "Tests Passed : " + testPass.to_s - puts "Tests Failed : " + testFail.to_s - puts "Tests Ignored : " + testIgnore.to_s - @totalTests = testPass + testFail + testIgnore - if @xmlOut == true - heading = "" - @arrayList.insert(0, heading) - writeXmlOuput() - end - - # return result - end - - end - -# If the command line has no values in, used a default value of Output.txt -parseMyFile = ParseOutput.new - -if ARGV.size >= 1 - ARGV.each do |a| - if a == "-xml" - parseMyFile.setXmlOutput(); - else - parseMyFile.process(a) - break - end - end -end diff --git a/auto/parse_output.rb b/auto/parse_output.rb new file mode 100644 index 00000000..f16cdb03 --- /dev/null +++ b/auto/parse_output.rb @@ -0,0 +1,220 @@ +#============================================================ +# Author: John Theofanopoulos +# A simple parser. Takes the output files generated during the build process and +# extracts information relating to the tests. +# +# Notes: +# To capture an output file under VS builds use the following: +# devenv [build instructions] > Output.txt & type Output.txt +# +# To capture an output file under GCC/Linux builds use the following: +# make | tee Output.txt +# +# To use this parser use the following command +# ruby parseOutput.rb [options] [file] +# options: -xml : produce a JUnit compatible XML file +# file : file to scan for results +#============================================================ + +class ParseOutput + def initialize + @test_flag = false + @xml_out = false + @array_list = false + @total_tests = false + @class_index = false + end + + # Set the flag to indicate if there will be an XML output file or not + def set_xml_output + @xml_out = true + end + + # if write our output to XML + def write_xml_output + output = File.open('report.xml', 'w') + output << "\n" + @array_list.each do |item| + output << item << "\n" + end + output << "\n" + end + + # This function will try and determine when the suite is changed. This is + # is the name that gets added to the classname parameter. + def test_suite_verify(test_suite_name) + return if @test_flag + + @test_flag = true + # Split the path name + test_name = test_suite_name.split('/') + # Remove the extension + base_name = test_name[test_name.size - 1].split('.') + @test_suite = 'test.' + base_name[0] + printf "New Test: %s\n", @test_suite + end + + # Test was flagged as having passed so format the output + def test_passed(array) + last_item = array.length - 1 + test_name = array[last_item - 1] + test_suite_verify(array[@class_name]) + printf "%-40s PASS\n", test_name + + return unless @xml_out + + @array_list.push ' ' + end + + # Test was flagged as having passed so format the output. + # This is using the Unity fixture output and not the original Unity output. + def test_passed_unity_fixture(array) + test_suite = array[0].sub('TEST(', '') + test_suite = test_suite.sub(',', '') + test_name = array[1].sub(')', '') + + return unless @xml_out + + @array_list.push ' ' + end + + # Test was flagged as being ingored so format the output + def test_ignored(array) + last_item = array.length - 1 + test_name = array[last_item - 2] + reason = array[last_item].chomp + test_suite_verify(array[@class_name]) + printf "%-40s IGNORED\n", test_name + + if test_name.start_with? 'TEST(' + array2 = test_name.split(' ') + @test_suite = array2[0].sub('TEST(', '') + @test_suite = @test_suite.sub(',', '') + test_name = array2[1].sub(')', '') + end + + return unless @xml_out + + @array_list.push ' ' + @array_list.push ' ' + reason + ' ' + @array_list.push ' ' + end + + # Test was flagged as having failed so format the line + def test_failed(array) + last_item = array.length - 1 + test_name = array[last_item - 2] + reason = array[last_item].chomp + ' at line: ' + array[last_item - 3] + test_suite_verify(array[@class_name]) + printf "%-40s FAILED\n", test_name + + if test_name.start_with? 'TEST(' + array2 = test_name.split(' ') + @test_suite = array2[0].sub('TEST(', '') + @test_suite = @test_suite.sub(',', '') + test_name = array2[1].sub(')', '') + end + + return unless @xml_out + + @array_list.push ' ' + @array_list.push ' ' + reason + ' ' + @array_list.push ' ' + end + + # Figure out what OS we are running on. For now we are assuming if it's not Windows it must + # be Unix based. + def detect_os + os = RUBY_PLATFORM.split('-') + @class_name = if os.size == 2 + if os[1] == 'mingw32' + 1 + else + 0 + end + else + 0 + end + end + + # Main function used to parse the file that was captured. + def process(name) + @test_flag = false + @array_list = [] + + detect_os + + puts 'Parsing file: ' + name + + test_pass = 0 + test_fail = 0 + test_ignore = 0 + puts '' + puts '=================== RESULTS =====================' + puts '' + File.open(name).each do |line| + # Typical test lines look like this: + # /.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0 + # /.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented + # /.c:115:test_tc5100_initCanVoidPtrs:PASS + # + # where path is different on Unix vs Windows devices (Windows leads with a drive letter) + line_array = line.split(':') + + # If we were able to split the line then we can look to see if any of our target words + # were found. Case is important. + if (line_array.size >= 4) || (line.start_with? 'TEST(') + # Determine if this test passed + if line.include? ':PASS' + test_passed(line_array) + test_pass += 1 + elsif line.include? ':FAIL:' + test_failed(line_array) + test_fail += 1 + elsif line.include? ':IGNORE:' + test_ignored(line_array) + test_ignore += 1 + elsif line.start_with? 'TEST(' + if line.include? ' PASS' + line_array = line.split(' ') + test_passed_unity_fixture(line_array) + test_pass += 1 + end + # If none of the keywords are found there are no more tests for this suite so clear + # the test flag + else + @test_flag = false + end + else + @test_flag = false + end + end + puts '' + puts '=================== SUMMARY =====================' + puts '' + puts 'Tests Passed : ' + test_pass.to_s + puts 'Tests Failed : ' + test_fail.to_s + puts 'Tests Ignored : ' + test_ignore.to_s + @total_tests = test_pass + test_fail + test_ignore + + return unless @xml_out + + heading = '' + @array_list.insert(0, heading) + write_xml_output + end +end + +# If the command line has no values in, used a default value of Output.txt +parse_my_file = ParseOutput.new + +if ARGV.size >= 1 + ARGV.each do |a| + if a == '-xml' + parse_my_file.set_xml_output + else + parse_my_file.process(a) + break + end + end +end diff --git a/auto/stylize_as_junit.rb b/auto/stylize_as_junit.rb index 27ac76d1..b3d8f409 100644 --- a/auto/stylize_as_junit.rb +++ b/auto/stylize_as_junit.rb @@ -12,7 +12,6 @@ VERSION = 1.0 class ArgvParser - # # Return a structure describing the options. # @@ -20,41 +19,41 @@ def self.parse(args) # The options specified on the command line will be collected in *options*. # We set default values here. options = OpenStruct.new - options.results_dir = "." - options.root_path = "." - options.out_file = "results.xml" + options.results_dir = '.' + options.root_path = '.' + options.out_file = 'results.xml' - opts = OptionParser.new do |opts| - opts.banner = "Usage: unity_to_junit.rb [options]" + opts = OptionParser.new do |o| + o.banner = 'Usage: unity_to_junit.rb [options]' - opts.separator "" - opts.separator "Specific options:" + o.separator '' + o.separator 'Specific options:' - opts.on("-r", "--results ", "Look for Unity Results files here.") do |results| - #puts "results #{results}" + o.on('-r', '--results ', 'Look for Unity Results files here.') do |results| + # puts "results #{results}" options.results_dir = results end - opts.on("-p", "--root_path ", "Prepend this path to files in results.") do |root_path| + o.on('-p', '--root_path ', 'Prepend this path to files in results.') do |root_path| options.root_path = root_path end - opts.on("-o", "--output ", "XML file to generate.") do |out_file| - #puts "out_file: #{out_file}" + o.on('-o', '--output ', 'XML file to generate.') do |out_file| + # puts "out_file: #{out_file}" options.out_file = out_file end - opts.separator "" - opts.separator "Common options:" + o.separator '' + o.separator 'Common options:' # No argument, shows at tail. This will print an options summary. - opts.on_tail("-h", "--help", "Show this message") do - puts opts + o.on_tail('-h', '--help', 'Show this message') do + puts o exit end # Another typical switch to print the version. - opts.on_tail("--version", "Show version") do + o.on_tail('--version', 'Show version') do puts "unity_to_junit.rb version #{VERSION}" exit end @@ -62,13 +61,13 @@ def self.parse(args) opts.parse!(args) options - end # parse() - -end # class OptparseExample + end # parse() +end # class OptparseExample class UnityToJUnit include FileUtils::Verbose attr_reader :report, :total_tests, :failures, :ignored + attr_writer :targets, :root, :out_file def initialize @report = '' @@ -77,125 +76,115 @@ def initialize def run # Clean up result file names - results = @targets.map {|target| target.gsub(/\\/,"/")} - #puts "Output File: #{@out_file}" - f = File.new(@out_file, "w") + results = @targets.map { |target| target.tr('\\', '/') } + # puts "Output File: #{@out_file}" + f = File.new(@out_file, 'w') write_xml_header(f) - write_suites_header( f ) + write_suites_header(f) results.each do |result_file| - lines = File.readlines(result_file).map { |line| line.chomp } - if lines.length == 0 - raise "Empty test result file: #{result_file}" - else - result_output = get_details(result_file, lines) - tests,failures,ignored = parse_test_summary(lines) - result_output[:counts][:total] = tests - result_output[:counts][:failed] = failures - result_output[:counts][:ignored] = ignored - result_output[:counts][:passed] = (result_output[:counts][:total] - result_output[:counts][:failed] - result_output[:counts][:ignored]) - end - #use line[0] from the test output to get the test_file path and name - test_file_str = lines[0].gsub("\\","/") - test_file_str = test_file_str.split(":") - test_file = if (test_file_str.length < 2) - result_file - else - test_file_str[0] + ':' + test_file_str[1] - end + lines = File.readlines(result_file).map(&:chomp) + + raise "Empty test result file: #{result_file}" if lines.empty? + + result_output = get_details(result_file, lines) + tests, failures, ignored = parse_test_summary(lines) + result_output[:counts][:total] = tests + result_output[:counts][:failed] = failures + result_output[:counts][:ignored] = ignored + result_output[:counts][:passed] = (result_output[:counts][:total] - result_output[:counts][:failed] - result_output[:counts][:ignored]) + + # use line[0] from the test output to get the test_file path and name + test_file_str = lines[0].tr('\\', '/') + test_file_str = test_file_str.split(':') + test_file = if test_file_str.length < 2 + result_file + else + test_file_str[0] + ':' + test_file_str[1] + end result_output[:source][:path] = File.dirname(test_file) result_output[:source][:file] = File.basename(test_file) # save result_output - @unit_name = File.basename(test_file, ".*") + @unit_name = File.basename(test_file, '.*') - write_suite_header( result_output[:counts], f) - write_failures( result_output, f ) - write_tests( result_output, f ) - write_ignored( result_output, f ) - write_suite_footer( f ) + write_suite_header(result_output[:counts], f) + write_failures(result_output, f) + write_tests(result_output, f) + write_ignored(result_output, f) + write_suite_footer(f) end - write_suites_footer( f ) + write_suites_footer(f) f.close end - def set_targets(target_array) - @targets = target_array - end - - def set_root_path(path) - @root = path - end - def set_out_file(filename) - @out_file = filename - end - def usage(err_msg=nil) + def usage(err_msg = nil) puts "\nERROR: " puts err_msg if err_msg - puts "Usage: unity_to_junit.rb [options]" - puts "" - puts "Specific options:" - puts " -r, --results Look for Unity Results files here." - puts " -p, --root_path Prepend this path to files in results." - puts " -o, --output XML file to generate." - puts "" - puts "Common options:" - puts " -h, --help Show this message" - puts " --version Show version" + puts 'Usage: unity_to_junit.rb [options]' + puts '' + puts 'Specific options:' + puts ' -r, --results Look for Unity Results files here.' + puts ' -p, --root_path Prepend this path to files in results.' + puts ' -o, --output XML file to generate.' + puts '' + puts 'Common options:' + puts ' -h, --help Show this message' + puts ' --version Show version' exit 1 end protected - def get_details(result_file, lines) - results = get_results_structure + + def get_details(_result_file, lines) + results = results_structure lines.each do |line| - line = line.gsub("\\","/") - src_file,src_line,test_name,status,msg = line.split(/:/) - line_out = ((@root and (@root != 0)) ? "#{@root}#{line}" : line ).gsub(/\//, "\\") - case(status) - when 'IGNORE' then results[:ignores] << {:test => test_name, :line => src_line, :message => msg} - when 'FAIL' then results[:failures] << {:test => test_name, :line => src_line, :message => msg} - when 'PASS' then results[:successes] << {:test => test_name, :line => src_line, :message => msg} + line = line.tr('\\', '/') + _src_file, src_line, test_name, status, msg = line.split(/:/) + case status + when 'IGNORE' then results[:ignores] << { test: test_name, line: src_line, message: msg } + when 'FAIL' then results[:failures] << { test: test_name, line: src_line, message: msg } + when 'PASS' then results[:successes] << { test: test_name, line: src_line, message: msg } end end - return results + results end def parse_test_summary(summary) - if summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } - [$1.to_i,$2.to_i,$3.to_i] - else - raise "Couldn't parse test results: #{summary}" - end + raise "Couldn't parse test results: #{summary}" unless summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } + [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i] + end + + def here + File.expand_path(File.dirname(__FILE__)) end - def here; File.expand_path(File.dirname(__FILE__)); end private - def get_results_structure - return { - :source => {:path => '', :file => ''}, - :successes => [], - :failures => [], - :ignores => [], - :counts => {:total => 0, :passed => 0, :failed => 0, :ignored => 0}, - :stdout => [], + def results_structure + { + source: { path: '', file: '' }, + successes: [], + failures: [], + ignores: [], + counts: { total: 0, passed: 0, failed: 0, ignored: 0 }, + stdout: [] } end - def write_xml_header( stream ) + def write_xml_header(stream) stream.puts "" end - def write_suites_header( stream ) - stream.puts "" + def write_suites_header(stream) + stream.puts '' end - def write_suite_header( counts, stream ) + def write_suite_header(counts, stream) stream.puts "\t" end - def write_failures( results, stream ) + def write_failures(results, stream) result = results[:failures] result.each do |item| filename = File.join(results[:source][:path], File.basename(results[:source][:file], '.*')) @@ -206,15 +195,14 @@ def write_failures( results, stream ) end end - def write_tests( results, stream ) + def write_tests(results, stream) result = results[:successes] result.each do |item| - filename = File.join(results[:source][:path], File.basename(results[:source][:file], '.*')) stream.puts "\t\t" end end - def write_ignored( results, stream ) + def write_ignored(results, stream) result = results[:ignores] result.each do |item| filename = File.join(results[:source][:path], File.basename(results[:source][:file], '.*')) @@ -226,39 +214,39 @@ def write_ignored( results, stream ) end end - def write_suite_footer( stream ) + def write_suite_footer(stream) stream.puts "\t" end - def write_suites_footer( stream ) - stream.puts "" + def write_suites_footer(stream) + stream.puts '' end -end #UnityToJUnit +end # UnityToJUnit if __FILE__ == $0 - #parse out the command options + # parse out the command options options = ArgvParser.parse(ARGV) - #create an instance to work with + # create an instance to work with utj = UnityToJUnit.new begin - #look in the specified or current directory for result files - targets = "#{options.results_dir.gsub(/\\/, '/')}**/*.test*" + # look in the specified or current directory for result files + targets = "#{options.results_dir.tr('\\', '/')}**/*.test*" results = Dir[targets] raise "No *.testpass, *.testfail, or *.testresults files found in '#{targets}'" if results.empty? - utj.set_targets(results) + utj.targets = results - #set the root path - utj.set_root_path(options.root_path) + # set the root path + utj.root = options.root_path - #set the output XML file name - #puts "Output File from options: #{options.out_file}" - utj.set_out_file(options.out_file) + # set the output XML file name + # puts "Output File from options: #{options.out_file}" + utj.out_file = options.out_file - #run the summarizer + # run the summarizer puts utj.run - rescue Exception => e + rescue StandardError => e utj.usage e.message end end diff --git a/auto/test_file_filter.rb b/auto/test_file_filter.rb index 3dbc26a2..aad28e38 100644 --- a/auto/test_file_filter.rb +++ b/auto/test_file_filter.rb @@ -2,7 +2,7 @@ # Unity Project - A Test Framework for C # Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams # [Released under MIT License. Please refer to license.txt for details] -# ========================================== +# ========================================== require'yaml' @@ -10,14 +10,16 @@ module RakefileHelpers class TestFileFilter def initialize(all_files = false) @all_files = all_files - if not @all_files == true - if File.exist?('test_file_filter.yml') - filters = YAML.load_file( 'test_file_filter.yml' ) - @all_files, @only_files, @exclude_files = - filters[:all_files], filters[:only_files], filters[:exclude_files] - end - end - end + + return false unless @all_files + return false unless File.exist?('test_file_filter.yml') + + filters = YAML.load_file('test_file_filter.yml') + @all_files = filters[:all_files] + @only_files = filters[:only_files] + @exclude_files = filters[:exclude_files] + end + attr_accessor :all_files, :only_files, :exclude_files end end diff --git a/auto/type_sanitizer.rb b/auto/type_sanitizer.rb index 7c2c0ac2..dafb8826 100644 --- a/auto/type_sanitizer.rb +++ b/auto/type_sanitizer.rb @@ -1,8 +1,6 @@ module TypeSanitizer - def self.sanitize_c_identifier(unsanitized) # convert filename to valid C identifier by replacing invalid chars with '_' - return unsanitized.gsub(/[-\/\\\.\,\s]/, "_") + unsanitized.gsub(/[-\/\\\.\,\s]/, '_') end - end diff --git a/auto/unity_test_summary.rb b/auto/unity_test_summary.rb index 8f992e53..b37dc5fa 100644 --- a/auto/unity_test_summary.rb +++ b/auto/unity_test_summary.rb @@ -4,7 +4,7 @@ # [Released under MIT License. Please refer to license.txt for details] # ========================================== -#!/usr/bin/ruby +# !/usr/bin/ruby # # unity_test_summary.rb # @@ -15,37 +15,35 @@ class UnityTestSummary include FileUtils::Verbose attr_reader :report, :total_tests, :failures, :ignored + attr_writer :targets, :root - def initialize(opts = {}) + def initialize(_opts = {}) @report = '' @total_tests = 0 @failures = 0 @ignored = 0 - - end def run # Clean up result file names - results = @targets.map {|target| target.gsub(/\\/,'/')} + results = @targets.map { |target| target.tr('\\', '/') } # Dig through each result file, looking for details on pass/fail: failure_output = [] ignore_output = [] results.each do |result_file| - lines = File.readlines(result_file).map { |line| line.chomp } - if lines.length == 0 - raise "Empty test result file: #{result_file}" - else - output = get_details(result_file, lines) - failure_output << output[:failures] unless output[:failures].empty? - ignore_output << output[:ignores] unless output[:ignores].empty? - tests,failures,ignored = parse_test_summary(lines) - @total_tests += tests - @failures += failures - @ignored += ignored - end + lines = File.readlines(result_file).map(&:chomp) + + raise "Empty test result file: #{result_file}" if lines.empty? + + output = get_details(result_file, lines) + failure_output << output[:failures] unless output[:failures].empty? + ignore_output << output[:ignores] unless output[:ignores].empty? + tests, failures, ignored = parse_test_summary(lines) + @total_tests += tests + @failures += failures + @ignored += ignored end if @ignored > 0 @@ -72,77 +70,67 @@ def run @report += "\n" end - def set_targets(target_array) - @targets = target_array - end - - def set_root_path(path) - @root = path - end - - def usage(err_msg=nil) + def usage(err_msg = nil) puts "\nERROR: " puts err_msg if err_msg puts "\nUsage: unity_test_summary.rb result_file_directory/ root_path/" - puts " result_file_directory - The location of your results files." - puts " Defaults to current directory if not specified." - puts " Should end in / if specified." - puts " root_path - Helpful for producing more verbose output if using relative paths." + puts ' result_file_directory - The location of your results files.' + puts ' Defaults to current directory if not specified.' + puts ' Should end in / if specified.' + puts ' root_path - Helpful for producing more verbose output if using relative paths.' exit 1 end protected - def get_details(result_file, lines) - results = { :failures => [], :ignores => [], :successes => [] } + def get_details(_result_file, lines) + results = { failures: [], ignores: [], successes: [] } lines.each do |line| - src_file,src_line,test_name,status,msg = line.split(/:/) - line_out = ((@root && (@root != 0)) ? "#{@root}#{line}" : line ).gsub(/\//, "\\") - case(status) - when 'IGNORE' then results[:ignores] << line_out - when 'FAIL' then results[:failures] << line_out - when 'PASS' then results[:successes] << line_out + _src_file, _src_line, _test_name, status, _msg = line.split(/:/) + line_out = (@root && (@root != 0) ? "#{@root}#{line}" : line).gsub(/\//, '\\') + case status + when 'IGNORE' then results[:ignores] << line_out + when 'FAIL' then results[:failures] << line_out + when 'PASS' then results[:successes] << line_out end end - return results + results end def parse_test_summary(summary) - if summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } - [$1.to_i,$2.to_i,$3.to_i] - else - raise "Couldn't parse test results: #{summary}" - end + raise "Couldn't parse test results: #{summary}" unless summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } + [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i] end - def here; File.expand_path(File.dirname(__FILE__)); end - + def here + File.expand_path(File.dirname(__FILE__)) + end end if $0 == __FILE__ - #parse out the command options - opts, args = ARGV.partition {|v| v =~ /^--\w+/} - opts.map! {|v| v[2..-1].to_sym } + # parse out the command options + opts, args = ARGV.partition { |v| v =~ /^--\w+/ } + opts.map! { |v| v[2..-1].to_sym } - #create an instance to work with + # create an instance to work with uts = UnityTestSummary.new(opts) begin - #look in the specified or current directory for result files + # look in the specified or current directory for result files args[0] ||= './' - targets = "#{ARGV[0].gsub(/\\/, '/')}**/*.test*" + targets = "#{ARGV[0].tr('\\', '/')}**/*.test*" results = Dir[targets] raise "No *.testpass, *.testfail, or *.testresults files found in '#{targets}'" if results.empty? - uts.set_targets(results) + uts.targets = results - #set the root path + # set the root path args[1] ||= Dir.pwd + '/' - uts.set_root_path(ARGV[1]) + uts.root = ARGV[1] - #run the summarizer + # run the summarizer puts uts.run - rescue Exception => e + rescue StandardError => e uts.usage e.message end end diff --git a/docs/ThrowTheSwitchCodingStandard.md b/docs/ThrowTheSwitchCodingStandard.md new file mode 100644 index 00000000..a85adef3 --- /dev/null +++ b/docs/ThrowTheSwitchCodingStandard.md @@ -0,0 +1,207 @@ +# ThrowTheSwitch.org Coding Standard + +Hi. Welcome to the coding standard for ThrowTheSwitch.org. For the most part, +we try to follow these standards to unify our contributors' code into a cohesive +unit (puns intended). You might find places where these standards aren't +followed. We're not perfect. Please be polite where you notice these discrepancies +and we'll try to be polite when we notice yours. + +;) + + +## Why Have A Coding Standard? + +Being consistent makes code easier to understand. We've made an attempt to keep +our standard simple because we also believe that we can only expect someone to +follow something that is understandable. Please do your best. + + +## Our Philosophy + +Before we get into details on syntax, let's take a moment to talk about our +vision for these tools. We're C developers and embedded software developers. +These tools are great to test any C code, but catering to embedded software has +made us more tolerant of compiler quirks. There are a LOT of quirky compilers +out there. By quirky I mean "doesn't follow standards because they feel like +they have a license to do as they wish." + +Our philosophy is "support every compiler we can". Most often, this means that +we aim for writing C code that is standards compliant (often C89... that seems +to be a sweet spot that is almost always compatible). But it also means these +tools are tolerant of things that aren't common. Some that aren't even +compliant. There are configuration options to override the size of standard +types. There are configuration options to force Unity to not use certain +standard library functions. A lot of Unity is configurable and we have worked +hard to make it not TOO ugly in the process. + +Similarly, our tools that parse C do their best. They aren't full C parsers +(yet) and, even if they were, they would still have to accept non-standard +additions like gcc extensions or specifying `@0x1000` to force a variable to +compile to a particular location. It's just what we do, because we like +everything to Just Work™. + +Speaking of having things Just Work™, that's our second philosophy. By that, we +mean that we do our best to have EVERY configuration option have a logical +default. We believe that if you're working with a simple compiler and target, +you shouldn't need to configure very much... we try to make the tools guess as +much as they can, but give the user the power to override it when it's wrong. + + +## Naming Things + +Let's talk about naming things. Programming is all about naming things. We name +files, functions, variables, and so much more. While we're not always going to +find the best name for something, we actually put quite a bit of effort into +finding *What Something WANTS to be Called*™. + +When naming things, we more or less follow this hierarchy, the first being the +most important to us (but we do all four whenever possible): +1. Readable +2. Descriptive +3. Consistent +4. Memorable + + +#### Readable + +We want to read our code. This means we like names and flow that are more +naturally read. We try to avoid double negatives. We try to avoid cryptic +abbreviations (sticking to ones we feel are common). + + +#### Descriptive + +We like descriptive names for things, especially functions and variables. +Finding the right name for something is an important endeavor. You might notice +from poking around our code that this often results in names that are a little +longer than the average. Guilty. We're okay with a tiny bit more typing if it +means our code is easier to understand. + +There are two exceptions to this rule that we also stick to as religiously as +possible: + +First, while we realize hungarian notation (and similar systems for encoding +type information into variable names) is providing a more descriptive name, we +feel that (for the average developer) it takes away from readability and +therefore is to be avoided. + +Second, loop counters and other local throw-away variables often have a purpose +which is obvious. There's no need, therefore, to get carried away with complex +naming. We find i, j, and k are better loop counters than loopCounterVar or +whatnot. We only break this rule when we see that more description could improve +understanding of an algorithm. + + +#### Consistent + +We like consistency, but we're not really obsessed with it. We try to name our +configuration macros in a consistent fashion... you'll notice a repeated use of +UNITY_EXCLUDE_BLAH or UNITY_USES_BLAH macros. This helps users avoid having to +remember each macro's details. + + +#### Memorable + +Where ever it doesn't violate the above principles, we try to apply memorable +names. Sometimes this means using something that is simply descriptive, but +often we strive for descriptive AND unique... we like quirky names that stand +out in our memory and are easier to search for. Take a look through the file +names in Ceedling and you'll get a good idea of what we are talking about here. +Why use preprocess when you can use preprocessinator? Or what better describes a +module in charge of invoking tasks during releases than release_invoker? Don't +get carried away. The names are still descriptive and fulfill the above +requirements, but they don't feel stale. + + +## C and C++ Details + +We don't really want to add to the style battles out there. Tabs or spaces? +How many spaces? Where do the braces go? These are age-old questions that will +never be answered... or at least not answered in a way that will make everyone +happy. + +We've decided on our own style preferences. If you'd like to contribute to these +projects (and we hope that you do), then we ask if you do your best to follow +the same. It will only hurt a little. We promise. + + +#### Whitespace + +Our C-style is to use spaces and to use 4 of them per indent level. It's a nice +power-of-2 number that looks decent on a wide screen. We have no more reason +than that. We break that rule when we have lines that wrap (macros or function +arguments or whatnot). When that happens, we like to indent further to line +things up in nice tidy columns. + +```C + if (stuff_happened) + { + do_something(); + } +``` + + +#### Case + +- Files - all lower case with underscores. +- Variables - all lower case with underscores +- Macros - all caps with underscores. +- Typedefs - all caps with underscores. (also ends with _T). +- Functions - camel cased. Usually named ModuleName_FuncName +- Constants and Globals - camel cased. + + +#### Braces + +The left brace is on the next line after the declaration. The right brace is +directly below that. Everything in between in indented one level. If you're +catching an error and you have a one-line, go ahead and to it on the same line. + +```C + while (blah) + { + //Like so. Even if only one line, we use braces. + } +``` + + +#### Comments + +Do you know what we hate? Old-school C block comments. BUT, we're using them +anyway. As we mentioned, our goal is to support every compiler we can, +especially embedded compilers. There are STILL C compilers out there that only +support old-school block comments. So that is what we're using. We apologize. We +think they are ugly too. + + +## Ruby Details + +Is there really such thing as a Ruby coding standard? Ruby is such a free form +language, it seems almost sacrilegious to suggest that people should comply to +one method! We'll keep it really brief! + + +#### Whitespace + +Our Ruby style is to use spaces and to use 2 of them per indent level. It's a +nice power-of-2 number that really grooves with Ruby's compact style. We have no +more reason than that. We break that rule when we have lines that wrap. When +that happens, we like to indent further to line things up in nice tidy columns. + + +#### Case + +- Files - all lower case with underscores. +- Variables - all lower case with underscores +- Classes, Modules, etc - Camel cased. +- Functions - all lower case with underscores +- Constants - all upper case with underscores + + +## Documentation + +Egad. Really? We use markdown and we like pdf files because they can be made to +look nice while still being portable. Good enough? + + +*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)* diff --git a/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf b/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf index 2bce0ab30f3d8324983e9adcb70741413c0da66e..28f0c32144c4f2b55ff07007555e5777480320ac 100644 GIT binary patch delta 71833 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�hRg7%F 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 diff --git a/docs/UnityAssertionsReference.md b/docs/UnityAssertionsReference.md new file mode 100644 index 00000000..558f6dbb --- /dev/null +++ b/docs/UnityAssertionsReference.md @@ -0,0 +1,716 @@ +# Unity Assertions Reference + +## Background and Overview + +### Super Condensed Version + +- An assertion establishes truth (i.e. boolean True) for a single condition. +Upon boolean False, an assertion stops execution and reports the failure. +- Unity is mainly a rich collection of assertions and the support to gather up +and easily execute those assertions. +- The structure of Unity allows you to easily separate test assertions from +source code in, well, test code. +- Unity's assertions: +- Come in many, many flavors to handle different C types and assertion cases. +- Use context to provide detailed and helpful failure messages. +- Document types, expected values, and basic behavior in your source code for +free. + + +### Unity Is Several Things But Mainly It's Assertions + +One way to think of Unity is simply as a rich collection of assertions you can +use to establish whether your source code behaves the way you think it does. +Unity provides a framework to easily organize and execute those assertions in +test code separate from your source code. + + +### What's an Assertion? + +At their core, assertions are an establishment of truth - boolean truth. Was this +thing equal to that thing? Does that code doohickey have such-and-such property +or not? You get the idea. Assertions are executable code (to appreciate the big +picture on this read up on the difference between +[link:Dynamic Verification and Static Analysis]). A failing assertion stops +execution and reports an error through some appropriate I/O channel (e.g. +stdout, GUI, file, blinky light). + +Fundamentally, for dynamic verification all you need is a single assertion +mechanism. In fact, that's what the [assert() macro in C's standard library](http://en.wikipedia.org/en/wiki/Assert.h) +is for. So why not just use it? Well, we can do far better in the reporting +department. C's `assert()` is pretty dumb as-is and is particularly poor for +handling common data types like arrays, structs, etc. And, without some other +support, it's far too tempting to litter source code with C's `assert()`'s. It's +generally much cleaner, manageable, and more useful to separate test and source +code in the way Unity facilitates. + + +### Unity's Assertions: Helpful Messages _and_ Free Source Code Documentation + +Asserting a simple truth condition is valuable, but using the context of the +assertion is even more valuable. For instance, if you know you're comparing bit +flags and not just integers, then why not use that context to give explicit, +readable, bit-level feedback when an assertion fails? + +That's what Unity's collection of assertions do - capture context to give you +helpful, meaningful assertion failure messages. In fact, the assertions +themselves also serve as executable documentation about types and values in your +source code. So long as your tests remain current with your source and all those +tests pass, you have a detailed, up-to-date view of the intent and mechanisms in +your source code. And due to a wondrous mystery, well-tested code usually tends +to be well designed code. + + +## Assertion Conventions and Configurations + +### Naming and Parameter Conventions + +The convention of assertion parameters generally follows this order: + + TEST_ASSERT_X( {modifiers}, {expected}, actual, {size/count} ) + +The very simplest assertion possible uses only a single "actual" parameter (e.g. +a simple null check). + +"Actual" is the value being tested and unlike the other parameters in an +assertion construction is the only parameter present in all assertion variants. +"Modifiers" are masks, ranges, bit flag specifiers, floating point deltas. +"Expected" is your expected value (duh) to compare to an "actual" value; it's +marked as an optional parameter because some assertions only need a single +"actual" parameter (e.g. null check). +"Size/count" refers to string lengths, number of array elements, etc. + +Many of Unity's assertions are apparent duplications in that the same data type +is handled by several assertions. The differences among these are in how failure +messages are presented. For instance, a `_HEX` variant of an assertion prints +the expected and actual values of that assertion formatted as hexadecimal. + + +#### TEST_ASSERT_X_MESSAGE Variants + +_All_ assertions are complemented with a variant that includes a simple string +message as a final parameter. The string you specify is appended to an assertion +failure message in Unity output. + +For brevity, the assertion variants with a message parameter are not listed +below. Just tack on `_MESSAGE` as the final component to any assertion name in +the reference list below and add a string as the final parameter. + +_Example:_ + + TEST_ASSERT_X( {modifiers}, {expected}, actual, {size/count} ) + +becomes messageified like thus... + + TEST_ASSERT_X_MESSAGE( {modifiers}, {expected}, actual, {size/count}, message ) + + +#### TEST_ASSERT_X_ARRAY Variants + +Unity provides a collection of assertions for arrays containing a variety of +types. These are documented in the Array section below. These are almost on par +with the `_MESSAGE`variants of Unity's Asserts in that for pretty much any Unity +type assertion you can tack on `_ARRAY` and run assertions on an entire block of +memory. + + TEST_ASSERT_EQUAL_TYPEX_ARRAY( expected, actual, {size/count} ) + +"Expected" is an array itself. +"Size/count" is one or two parameters necessary to establish the number of array +elements and perhaps the length of elements within the array. + +Notes: +- The `_MESSAGE` variant convention still applies here to array assertions. The +`_MESSAGE` variants of the `_ARRAY` assertions have names ending with +`_ARRAY_MESSAGE`. +- Assertions for handling arrays of floating point values are grouped with float +and double assertions (see immediately following section). + + +### TEST_ASSERT_EACH_EQUAL_X Variants + +Unity provides a collection of assertions for arrays containing a variety of +types which can be compared to a single value as well. These are documented in +the Each Equal section below. these are almost on par with the `_MESSAGE` +variants of Unity's Asserts in that for pretty much any Unity type assertion you +can inject _EACH_EQUAL and run assertions on an entire block of memory. + + TEST_ASSERT_EACH_EQUAL_TYPEX( expected, actual, {size/count} ) + +"Expected" is a single value to compare to. +"Actual" is an array where each element will be compared to the expected value. +"Size/count" is one of two parameters necessary to establish the number of array +elements and perhaps the length of elements within the array. + +Notes: +- The `_MESSAGE` variant convention still applies here to Each Equal assertions. +- Assertions for handling Each Equal of floating point values are grouped with +float and double assertions (see immediately following section). + + +### Configuration + +#### Floating Point Support Is Optional + +Support for floating point types is configurable. That is, by defining the +appropriate preprocessor symbols, floats and doubles can be individually enabled +or disabled in Unity code. This is useful for embedded targets with no floating +point math support (i.e. Unity compiles free of errors for fixed point only +platforms). See Unity documentation for specifics. + + +#### Maximum Data Type Width Is Configurable + +Not all targets support 64 bit wide types or even 32 bit wide types. Define the +appropriate preprocessor symbols and Unity will omit all operations from +compilation that exceed the maximum width of your target. See Unity +documentation for specifics. + + +## The Assertions in All Their Blessed Glory + +### Basic Fail and Ignore + +##### `TEST_FAIL()` + +This fella is most often used in special conditions where your test code is +performing logic beyond a simple assertion. That is, in practice, `TEST_FAIL()` +will always be found inside a conditional code block. + +_Examples:_ +- Executing a state machine multiple times that increments a counter your test +code then verifies as a final step. +- Triggering an exception and verifying it (as in Try / Catch / Throw - see the +[CException](https://github.com/ThrowTheSwitch/CException) project). + +##### `TEST_IGNORE()` + +Marks a test case (i.e. function meant to contain test assertions) as ignored. +Usually this is employed as a breadcrumb to come back and implement a test case. +An ignored test case has effects if other assertions are in the enclosing test +case (see Unity documentation for more). + +### Boolean + +##### `TEST_ASSERT (condition)` + +##### `TEST_ASSERT_TRUE (condition)` + +##### `TEST_ASSERT_FALSE (condition)` + +##### `TEST_ASSERT_UNLESS (condition)` + +A simple wording variation on `TEST_ASSERT_FALSE`.The semantics of +`TEST_ASSERT_UNLESS` aid readability in certain test constructions or +conditional statements. + +##### `TEST_ASSERT_NULL (pointer)` + +##### `TEST_ASSERT_NOT_NULL (pointer)` + + +### Signed and Unsigned Integers (of all sizes) + +Large integer sizes can be disabled for build targets that do not support them. +For example, if your target only supports up to 16 bit types, by defining the +appropriate symbols Unity can be configured to omit 32 and 64 bit operations +that would break compilation (see Unity documentation for more). Refer to +Advanced Asserting later in this document for advice on dealing with other word +sizes. + +##### `TEST_ASSERT_EQUAL_INT (expected, actual)` + +##### `TEST_ASSERT_EQUAL_INT8 (expected, actual)` + +##### `TEST_ASSERT_EQUAL_INT16 (expected, actual)` + +##### `TEST_ASSERT_EQUAL_INT32 (expected, actual)` + +##### `TEST_ASSERT_EQUAL_INT64 (expected, actual)` + +##### `TEST_ASSERT_EQUAL (expected, actual)` + +##### `TEST_ASSERT_NOT_EQUAL (expected, actual)` + +##### `TEST_ASSERT_EQUAL_UINT (expected, actual)` + +##### `TEST_ASSERT_EQUAL_UINT8 (expected, actual)` + +##### `TEST_ASSERT_EQUAL_UINT16 (expected, actual)` + +##### `TEST_ASSERT_EQUAL_UINT32 (expected, actual)` + +##### `TEST_ASSERT_EQUAL_UINT64 (expected, actual)` + + +### Unsigned Integers (of all sizes) in Hexadecimal + +All `_HEX` assertions are identical in function to unsigned integer assertions +but produce failure messages with the `expected` and `actual` values formatted +in hexadecimal. Unity output is big endian. + +##### `TEST_ASSERT_EQUAL_HEX (expected, actual)` + +##### `TEST_ASSERT_EQUAL_HEX8 (expected, actual)` + +##### `TEST_ASSERT_EQUAL_HEX16 (expected, actual)` + +##### `TEST_ASSERT_EQUAL_HEX32 (expected, actual)` + +##### `TEST_ASSERT_EQUAL_HEX64 (expected, actual)` + + +### Masked and Bit-level Assertions + +Masked and bit-level assertions produce output formatted in hexadecimal. Unity +output is big endian. + + +##### `TEST_ASSERT_BITS (mask, expected, actual)` + +Only compares the masked (i.e. high) bits of `expected` and `actual` parameters. + + +##### `TEST_ASSERT_BITS_HIGH (mask, actual)` + +Asserts the masked bits of the `actual` parameter are high. + + +##### `TEST_ASSERT_BITS_LOW (mask, actual)` + +Asserts the masked bits of the `actual` parameter are low. + + +##### `TEST_ASSERT_BIT_HIGH (bit, actual)` + +Asserts the specified bit of the `actual` parameter is high. + + +##### `TEST_ASSERT_BIT_LOW (bit, actual)` + +Asserts the specified bit of the `actual` parameter is low. + + +### Integer Ranges (of all sizes) + +These assertions verify that the `expected` parameter is within +/- `delta` +(inclusive) of the `actual` parameter. For example, if the expected value is 10 +and the delta is 3 then the assertion will fail for any value outside the range +of 7 - 13. + +##### `TEST_ASSERT_INT_WITHIN (delta, expected, actual)` + +##### `TEST_ASSERT_INT8_WITHIN (delta, expected, actual)` + +##### `TEST_ASSERT_INT16_WITHIN (delta, expected, actual)` + +##### `TEST_ASSERT_INT32_WITHIN (delta, expected, actual)` + +##### `TEST_ASSERT_INT64_WITHIN (delta, expected, actual)` + +##### `TEST_ASSERT_UINT_WITHIN (delta, expected, actual)` + +##### `TEST_ASSERT_UINT8_WITHIN (delta, expected, actual)` + +##### `TEST_ASSERT_UINT16_WITHIN (delta, expected, actual)` + +##### `TEST_ASSERT_UINT32_WITHIN (delta, expected, actual)` + +##### `TEST_ASSERT_UINT64_WITHIN (delta, expected, actual)` + +##### `TEST_ASSERT_HEX_WITHIN (delta, expected, actual)` + +##### `TEST_ASSERT_HEX8_WITHIN (delta, expected, actual)` + +##### `TEST_ASSERT_HEX16_WITHIN (delta, expected, actual)` + +##### `TEST_ASSERT_HEX32_WITHIN (delta, expected, actual)` + +##### `TEST_ASSERT_HEX64_WITHIN (delta, expected, actual)` + + +### Structs and Strings + +##### `TEST_ASSERT_EQUAL_PTR (expected, actual)` + +Asserts that the pointers point to the same memory location. + + +##### `TEST_ASSERT_EQUAL_STRING (expected, actual)` + +Asserts that the null terminated (`'\0'`)strings are identical. If strings are +of different lengths or any portion of the strings before their terminators +differ, the assertion fails. Two NULL strings (i.e. zero length) are considered +equivalent. + + +##### `TEST_ASSERT_EQUAL_MEMORY (expected, actual, len)` + +Asserts that the contents of the memory specified by the `expected` and `actual` +pointers is identical. The size of the memory blocks in bytes is specified by +the `len` parameter. + + +### Arrays + +`expected` and `actual` parameters are both arrays. `num_elements` specifies the +number of elements in the arrays to compare. + +`_HEX` assertions produce failure messages with expected and actual array +contents formatted in hexadecimal. + +For array of strings comparison behavior, see comments for +`TEST_ASSERT_EQUAL_STRING` in the preceding section. + +Assertions fail upon the first element in the compared arrays found not to +match. Failure messages specify the array index of the failed comparison. + +##### `TEST_ASSERT_EQUAL_INT_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_INT8_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_INT16_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_INT32_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_INT64_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_UINT_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_UINT8_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_UINT16_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_UINT32_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_UINT64_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_HEX_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_HEX8_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_HEX16_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_HEX32_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_HEX64_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_PTR_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_STRING_ARRAY (expected, actual, num_elements)` + +##### `TEST_ASSERT_EQUAL_MEMORY_ARRAY (expected, actual, len, num_elements)` + +`len` is the memory in bytes to be compared at each array element. + + +### Each Equal (Arrays to Single Value) + +`expected` are single values and `actual` are arrays. `num_elements` specifies +the number of elements in the arrays to compare. + +`_HEX` assertions produce failure messages with expected and actual array +contents formatted in hexadecimal. + +Assertions fail upon the first element in the compared arrays found not to +match. Failure messages specify the array index of the failed comparison. + +#### `TEST_ASSERT_EACH_EQUAL_INT (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_INT8 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_INT16 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_INT32 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_INT64 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_UINT (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_UINT8 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_UINT16 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_UINT32 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_UINT64 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_HEX (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_HEX8 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_HEX16 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_HEX32 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_HEX64 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_PTR (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_STRING (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_MEMORY (expected, actual, len, num_elements)` + +`len` is the memory in bytes to be compared at each array element. + + +### Floating Point (If enabled) + +##### `TEST_ASSERT_FLOAT_WITHIN (delta, expected, actual)` + +Asserts that the `actual` value is within +/- `delta` of the `expected` value. +The nature of floating point representation is such that exact evaluations of +equality are not guaranteed. + + +##### `TEST_ASSERT_EQUAL_FLOAT (expected, actual)` + +Asserts that the ?actual?value is "close enough to be considered equal" to the +`expected` value. If you are curious about the details, refer to the Advanced +Asserting section for more details on this. Omitting a user-specified delta in a +floating point assertion is both a shorthand convenience and a requirement of +code generation conventions for CMock. + + +##### `TEST_ASSERT_EQUAL_FLOAT_ARRAY (expected, actual, num_elements)` + +See Array assertion section for details. Note that individual array element +float comparisons are executed using T?EST_ASSERT_EQUAL_FLOAT?.That is, user +specified delta comparison values requires a custom-implemented floating point +array assertion. + + +##### `TEST_ASSERT_FLOAT_IS_INF (actual)` + +Asserts that `actual` parameter is equivalent to positive infinity floating +point representation. + + +##### `TEST_ASSERT_FLOAT_IS_NEG_INF (actual)` + +Asserts that `actual` parameter is equivalent to negative infinity floating +point representation. + + +##### `TEST_ASSERT_FLOAT_IS_NAN (actual)` + +Asserts that `actual` parameter is a Not A Number floating point representation. + + +##### `TEST_ASSERT_FLOAT_IS_DETERMINATE (actual)` + +Asserts that ?actual?parameter is a floating point representation usable for +mathematical operations. That is, the `actual` parameter is neither positive +infinity nor negative infinity nor Not A Number floating point representations. + + +##### `TEST_ASSERT_FLOAT_IS_NOT_INF (actual)` + +Asserts that `actual` parameter is a value other than positive infinity floating +point representation. + + +##### `TEST_ASSERT_FLOAT_IS_NOT_NEG_INF (actual)` + +Asserts that `actual` parameter is a value other than negative infinity floating +point representation. + + +##### `TEST_ASSERT_FLOAT_IS_NOT_NAN (actual)` + +Asserts that `actual` parameter is a value other than Not A Number floating +point representation. + + +##### `TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE (actual)` + +Asserts that `actual` parameter is not usable for mathematical operations. That +is, the `actual` parameter is either positive infinity or negative infinity or +Not A Number floating point representations. + + +### Double (If enabled) + +##### `TEST_ASSERT_DOUBLE_WITHIN (delta, expected, actual)` + +Asserts that the `actual` value is within +/- `delta` of the `expected` value. +The nature of floating point representation is such that exact evaluations of +equality are not guaranteed. + + +##### `TEST_ASSERT_EQUAL_DOUBLE (expected, actual)` + +Asserts that the `actual` value is "close enough to be considered equal" to the +`expected` value. If you are curious about the details, refer to the Advanced +Asserting section for more details. Omitting a user-specified delta in a +floating point assertion is both a shorthand convenience and a requirement of +code generation conventions for CMock. + + +##### `TEST_ASSERT_EQUAL_DOUBLE_ARRAY (expected, actual, num_elements)` + +See Array assertion section for details. Note that individual array element +double comparisons are executed using `TEST_ASSERT_EQUAL_DOUBLE`.That is, user +specified delta comparison values requires a custom implemented double array +assertion. + + +##### `TEST_ASSERT_DOUBLE_IS_INF (actual)` + +Asserts that `actual` parameter is equivalent to positive infinity floating +point representation. + + +##### `TEST_ASSERT_DOUBLE_IS_NEG_INF (actual)` + +Asserts that `actual` parameter is equivalent to negative infinity floating point +representation. + + +##### `TEST_ASSERT_DOUBLE_IS_NAN (actual)` + +Asserts that `actual` parameter is a Not A Number floating point representation. + + +##### `TEST_ASSERT_DOUBLE_IS_DETERMINATE (actual)` + +Asserts that `actual` parameter is a floating point representation usable for +mathematical operations. That is, the ?actual?parameter is neither positive +infinity nor negative infinity nor Not A Number floating point representations. + + +##### `TEST_ASSERT_DOUBLE_IS_NOT_INF (actual)` + +Asserts that `actual` parameter is a value other than positive infinity floating +point representation. + + +##### `TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF (actual)` + +Asserts that `actual` parameter is a value other than negative infinity floating +point representation. + + +##### `TEST_ASSERT_DOUBLE_IS_NOT_NAN (actual)` + +Asserts that `actual` parameter is a value other than Not A Number floating +point representation. + + +##### `TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE (actual)` + +Asserts that `actual` parameter is not usable for mathematical operations. That +is, the `actual` parameter is either positive infinity or negative infinity or +Not A Number floating point representations. + + +## Advanced Asserting: Details On Tricky Assertions + +This section helps you understand how to deal with some of the trickier +assertion situations you may run into. It will give you a glimpse into some of +the under-the-hood details of Unity's assertion mechanisms. If you're one of +those people who likes to know what is going on in the background, read on. If +not, feel free to ignore the rest of this document until you need it. + + +### How do the EQUAL assertions work for FLOAT and DOUBLE? + +As you may know, directly checking for equality between a pair of floats or a +pair of doubles is sloppy at best and an outright no-no at worst. Floating point +values can often be represented in multiple ways, particularly after a series of +operations on a value. Initializing a variable to the value of 2.0 is likely to +result in a floating point representation of 2 x 20,but a series of +mathematical operations might result in a representation of 8 x 2-2 +that also evaluates to a value of 2. At some point repeated operations cause +equality checks to fail. + +So Unity doesn't do direct floating point comparisons for equality. Instead, it +checks if two floating point values are "really close." If you leave Unity +running with defaults, "really close" means "within a significant bit or two." +Under the hood, `TEST_ASSERT_EQUAL_FLOAT` is really `TEST_ASSERT_FLOAT_WITHIN` +with the `delta` parameter calculated on the fly. For single precision, delta is +the expected value multiplied by 0.00001, producing a very small proportional +range around the expected value. + +If you are expecting a value of 20,000.0 the delta is calculated to be 0.2. So +any value between 19,999.8 and 20,000.2 will satisfy the equality check. This +works out to be roughly a single bit of range for a single-precision number, and +that's just about as tight a tolerance as you can reasonably get from a floating +point value. + +So what happens when it's zero? Zero - even more than other floating point +values - can be represented many different ways. It doesn't matter if you have +0 x 20or 0 x 263.It's still zero, right? Luckily, if you +subtract these values from each other, they will always produce a difference of +zero, which will still fall between 0 plus or minus a delta of 0. So it still +works! + +Double precision floating point numbers use a much smaller multiplier, again +approximating a single bit of error. + +If you don't like these ranges and you want to make your floating point equality +assertions less strict, you can change these multipliers to whatever you like by +defining UNITY_FLOAT_PRECISION and UNITY_DOUBLE_PRECISION. See Unity +documentation for more. + + +### How do we deal with targets with non-standard int sizes? + +It's "fun" that C is a standard where something as fundamental as an integer +varies by target. According to the C standard, an `int` is to be the target's +natural register size, and it should be at least 16-bits and a multiple of a +byte. It also guarantees an order of sizes: + +```C +char <= short <= int <= long <= long long +``` + +Most often, `int` is 32-bits. In many cases in the embedded world, `int` is +16-bits. There are rare microcontrollers out there that have 24-bit integers, +and this remains perfectly standard C. + +To make things even more interesting, there are compilers and targets out there +that have a hard choice to make. What if their natural register size is 10-bits +or 12-bits? Clearly they can't fulfill _both_ the requirement to be at least +16-bits AND the requirement to match the natural register size. In these +situations, they often choose the natural register size, leaving us with +something like this: + +```C +char (8 bit) <= short (12 bit) <= int (12 bit) <= long (16 bit) +``` + +Um... yikes. It's obviously breaking a rule or two... but they had to break SOME +rules, so they made a choice. + +When the C99 standard rolled around, it introduced alternate standard-size types. +It also introduced macros for pulling in MIN/MAX values for your integer types. +It's glorious! Unfortunately, many embedded compilers can't be relied upon to +use the C99 types (Sometimes because they have weird register sizes as described +above. Sometimes because they don't feel like it?). + +A goal of Unity from the beginning was to support every combination of +microcontroller or microprocessor and C compiler. Over time, we've gotten really +close to this. There are a few tricks that you should be aware of, though, if +you're going to do this effectively on some of these more idiosyncratic targets. + +First, when setting up Unity for a new target, you're going to want to pay +special attention to the macros for automatically detecting types +(where available) or manually configuring them yourself. You can get information +on both of these in Unity's documentation. + +What about the times where you suddenly need to deal with something odd, like a +24-bit `int`? The simplest solution is to use the next size up. If you have a +24-bit `int`, configure Unity to use 32-bit integers. If you have a 12-bit +`int`, configure Unity to use 16 bits. There are two ways this is going to +affect you: + +1. When Unity displays errors for you, it's going to pad the upper unused bits +with zeros. +2. You're going to have to be careful of assertions that perform signed +operations, particularly `TEST_ASSERT_INT_WITHIN`.Such assertions might wrap +your `int` in the wrong place, and you could experience false failures. You can +always back down to a simple `TEST_ASSERT` and do the operations yourself. + + +*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)* diff --git a/docs/UnityAssertionsReference.pdf b/docs/UnityAssertionsReference.pdf deleted file mode 100644 index d8b10cc8f964cb5f689906b19b80485b1fc9a1b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320499 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

x! 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 Agaq9Y%i_-89H2<)$eR$V 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 diff --git a/docs/UnityConfigurationGuide.md b/docs/UnityConfigurationGuide.md new file mode 100644 index 00000000..283d7799 --- /dev/null +++ b/docs/UnityConfigurationGuide.md @@ -0,0 +1,398 @@ +# Unity Configuration Guide + +## C Standards, Compilers and Microcontrollers + +The embedded software world contains its challenges. Compilers support different +revisions of the C Standard. They ignore requirements in places, sometimes to +make the language more usable in some special regard. Sometimes it's to simplify +their support. Sometimes it's due to specific quirks of the microcontroller they +are targeting. Simulators add another dimension to this menagerie. + +Unity is designed to run on almost anything that is targeted by a C compiler. It +would be awesome if this could be done with zero configuration. While there are +some targets that come close to this dream, it is sadly not universal. It is +likely that you are going to need at least a couple of the configuration options +described in this document. + +All of Unity's configuration options are `#defines`. Most of these are simple +definitions. A couple are macros with arguments. They live inside the +unity_internals.h header file. We don't necessarily recommend opening that file +unless you really need to. That file is proof that a cross-platform library is +challenging to build. From a more positive perspective, it is also proof that a +great deal of complexity can be centralized primarily to one place in order to +provide a more consistent and simple experience elsewhere. + + +### Using These Options + +It doesn't matter if you're using a target-specific compiler and a simulator or +a native compiler. In either case, you've got a couple choices for configuring +these options: + +1. Because these options are specified via C defines, you can pass most of these +options to your compiler through command line compiler flags. Even if you're +using an embedded target that forces you to use their overbearing IDE for all +configuration, there will be a place somewhere in your project to configure +defines for your compiler. +2. You can create a custom `unity_config.h` configuration file (present in your +toolchain's search paths). In this file, you will list definitions and macros +specific to your target. All you must do is define `UNITY_INCLUDE_CONFIG_H` and +Unity will rely on `unity_config.h` for any further definitions it may need. + + +## The Options + +### Integer Types + +If you've been a C developer for long, you probably already know that C's +concept of an integer varies from target to target. The C Standard has rules +about the `int` matching the register size of the target microprocessor. It has +rules about the `int` and how its size relates to other integer types. An `int` +on one target might be 16 bits while on another target it might be 64. There are +more specific types in compilers compliant with C99 or later, but that's +certainly not every compiler you are likely to encounter. Therefore, Unity has a +number of features for helping to adjust itself to match your required integer +sizes. It starts off by trying to do it automatically. + + +##### `UNITY_EXCLUDE_STDINT_H` + +The first thing that Unity does to guess your types is check `stdint.h`. +This file includes defines like `UINT_MAX` that Unity can make use of to +learn a lot about your system. It's possible you don't want it to do this +(um. why not?) or (more likely) it's possible that your system doesn't +support `stdint.h`. If that's the case, you're going to want to define this. +That way, Unity will know to skip the inclusion of this file and you won't +be left with a compiler error. + +_Example:_ + #define UNITY_EXCLUDE_STDINT_H + + +##### `UNITY_EXCLUDE_LIMITS_H` + +The second attempt to guess your types is to check `limits.h`. Some compilers +that don't support `stdint.h` could include `limits.h` instead. If you don't +want Unity to check this file either, define this to make it skip the inclusion. + +_Example:_ + #define UNITY_EXCLUDE_LIMITS_H + + +##### `UNITY_EXCLUDE_SIZEOF` + +The third and final attempt to guess your types is to use the `sizeof()` +operator. Even if the first two options don't work, this one covers most cases. +There _is_ a rare compiler or two out there that doesn't support sizeof() in the +preprocessing stage, though. For these, you have the ability to disable this +feature as well. + +_Example:_ + #define UNITY_EXCLUDE_SIZEOF + +If you've disabled all of the automatic options above, you're going to have to +do the configuration yourself. Don't worry. Even this isn't too bad... there are +just a handful of defines that you are going to specify if you don't like the +defaults. + + +##### `UNITY_INT_WIDTH` + +Define this to be the number of bits an `int` takes up on your system. The +default, if not autodetected, is 32 bits. + +_Example:_ + #define UNITY_INT_WIDTH 16 + + +##### `UNITY_LONG_WIDTH` + +Define this to be the number of bits a `long` takes up on your system. The +default, if not autodetected, is 32 bits. This is used to figure out what kind +of 64-bit support your system can handle. Does it need to specify a `long` or a +`long long` to get a 64-bit value. On 16-bit systems, this option is going to be +ignored. + +_Example:_ + #define UNITY_LONG_WIDTH 16 + + +##### `UNITY_POINTER_WIDTH` + +Define this to be the number of bits a pointer takes up on your system. The +default, if not autodetected, is 32-bits. If you're getting ugly compiler +warnings about casting from pointers, this is the one to look at. + +_Example:_ + #define UNITY_POINTER_WIDTH 64 + + +##### `UNITY_INCLUDE_64` + +Unity will automatically include 64-bit support if it auto-detects it, or if +your `int`, `long`, or pointer widths are greater than 32-bits. Define this to +enable 64-bit support if none of the other options already did it for you. There +can be a significant size and speed impact to enabling 64-bit support on small +targets, so don't define it if you don't need it. + +_Example:_ + #define UNITY_INCLUDE_64 + + +### Floating Point Types + +In the embedded world, it's not uncommon for targets to have no support for +floating point operations at all or to have support that is limited to only +single precision. We are able to guess integer sizes on the fly because integers +are always available in at least one size. Floating point, on the other hand, is +sometimes not available at all. Trying to include `float.h` on these platforms +would result in an error. This leaves manual configuration as the only option. + + +##### `UNITY_INCLUDE_FLOAT` + +##### `UNITY_EXCLUDE_FLOAT` + +##### `UNITY_INCLUDE_DOUBLE` + +##### `UNITY_EXCLUDE_DOUBLE` + +By default, Unity guesses that you will want single precision floating point +support, but not double precision. It's easy to change either of these using the +include and exclude options here. You may include neither, either, or both, as +suits your needs. For features that are enabled, the following floating point +options also become available. + +_Example:_ + + //what manner of strange processor is this? + #define UNITY_EXCLUDE_FLOAT + #define UNITY_INCLUDE_DOUBLE + + +##### `UNITY_FLOAT_VERBOSE` + +##### `UNITY_DOUBLE_VERBOSE` + +Unity aims for as small of a footprint as possible and avoids most standard +library calls (some embedded platforms don't have a standard library!). Because +of this, its routines for printing integer values are minimalist and hand-coded. +To keep Unity universal, though, we chose to _not_ develop our own floating +point print routines. Instead, the display of floating point values during a +failure are optional. By default, Unity will not print the actual results of +floating point assertion failure. So a failed assertion will produce a message +like `"Values Not Within Delta"`. If you would like verbose failure messages for +floating point assertions, use these options to give more explicit failure +messages (e.g. `"Expected 4.56 Was 4.68"`). Note that this feature requires the +use of `sprintf` so might not be desirable in all cases. + +_Example:_ + #define UNITY_DOUBLE_VERBOSE + + +##### `UNITY_FLOAT_TYPE` + +If enabled, Unity assumes you want your `FLOAT` asserts to compare standard C +floats. If your compiler supports a specialty floating point type, you can +always override this behavior by using this definition. + +_Example:_ + #define UNITY_FLOAT_TYPE float16_t + + +##### `UNITY_DOUBLE_TYPE` + +If enabled, Unity assumes you want your `DOUBLE` asserts to compare standard C +doubles. If you would like to change this, you can specify something else by +using this option. For example, defining `UNITY_DOUBLE_TYPE` to `long double` +could enable gargantuan floating point types on your 64-bit processor instead of +the standard `double`. + +_Example:_ + #define UNITY_DOUBLE_TYPE long double + + +##### `UNITY_FLOAT_PRECISION` + +##### `UNITY_DOUBLE_PRECISION` + +If you look up `UNITY_ASSERT_EQUAL_FLOAT` and `UNITY_ASSERT_EQUAL_DOUBLE` as +documented in the big daddy Unity Assertion Guide, you will learn that they are +not really asserting that two values are equal but rather that two values are +"close enough" to equal. "Close enough" is controlled by these precision +configuration options. If you are working with 32-bit floats and/or 64-bit +doubles (the normal on most processors), you should have no need to change these +options. They are both set to give you approximately 1 significant bit in either +direction. The float precision is 0.00001 while the double is 10-12. +For further details on how this works, see the appendix of the Unity Assertion +Guide. + +_Example:_ + #define UNITY_FLOAT_PRECISION 0.001f + + +### Toolset Customization + +In addition to the options listed above, there are a number of other options +which will come in handy to customize Unity's behavior for your specific +toolchain. It is possible that you may not need to touch any of these... but +certain platforms, particularly those running in simulators, may need to jump +through extra hoops to operate properly. These macros will help in those +situations. + + +##### `UNITY_OUTPUT_CHAR(a)` + +##### `UNITY_OUTPUT_FLUSH()` + +##### `UNITY_OUTPUT_START()` + +##### `UNITY_OUTPUT_COMPLETE()` + +By default, Unity prints its results to `stdout` as it runs. This works +perfectly fine in most situations where you are using a native compiler for +testing. It works on some simulators as well so long as they have `stdout` +routed back to the command line. There are times, however, where the simulator +will lack support for dumping results or you will want to route results +elsewhere for other reasons. In these cases, you should define the +`UNITY_OUTPUT_CHAR` macro. This macro accepts a single character at a time (as +an `int`, since this is the parameter type of the standard C `putchar` function +most commonly used). You may replace this with whatever function call you like. + +_Example:_ +Say you are forced to run your test suite on an embedded processor with no +`stdout` option. You decide to route your test result output to a custom serial +`RS232_putc()` function you wrote like thus: + + #define UNITY_OUTPUT_CHAR(a) RS232_putc(a) + #define UNITY_OUTPUT_START() RS232_config(115200,1,8,0) + #define UNITY_OUTPUT_FLUSH() RS232_flush() + #define UNITY_OUTPUT_COMPLETE() RS232_close() + +_Note:_ +`UNITY_OUTPUT_FLUSH()` can be set to the standard out flush function simply by +specifying `UNITY_USE_FLUSH_STDOUT`. No other defines are required. If you +specify a custom flush function instead with `UNITY_OUTPUT_FLUSH` directly, it +will declare an instance of your function by default. If you want to disable +this behavior, add `UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION`. + + +##### `UNITY_SUPPORT_WEAK` + +For some targets, Unity can make the otherwise required `setUp()` and +`tearDown()` functions optional. This is a nice convenience for test writers +since `setUp` and `tearDown` don't often actually _do_ anything. If you're using +gcc or clang, this option is automatically defined for you. Other compilers can +also support this behavior, if they support a C feature called weak functions. A +weak function is a function that is compiled into your executable _unless_ a +non-weak version of the same function is defined elsewhere. If a non-weak +version is found, the weak version is ignored as if it never existed. If your +compiler supports this feature, you can let Unity know by defining +`UNITY_SUPPORT_WEAK` as the function attributes that would need to be applied to +identify a function as weak. If your compiler lacks support for weak functions, +you will always need to define `setUp` and `tearDown` functions (though they can +be and often will be just empty). The most common options for this feature are: + +_Example:_ + #define UNITY_SUPPORT_WEAK weak + #define UNITY_SUPPORT_WEAK __attribute__((weak)) + + +##### `UNITY_PTR_ATTRIBUTE` + +Some compilers require a custom attribute to be assigned to pointers, like +`near` or `far`. In these cases, you can give Unity a safe default for these by +defining this option with the attribute you would like. + +_Example:_ + #define UNITY_PTR_ATTRIBUTE __attribute__((far)) + #define UNITY_PTR_ATTRIBUTE near + + +## Getting Into The Guts + +There will be cases where the options above aren't quite going to get everything +perfect. They are likely sufficient for any situation where you are compiling +and executing your tests with a native toolchain (e.g. clang on Mac). These +options may even get you through the majority of cases encountered in working +with a target simulator run from your local command line. But especially if you +must run your test suite on your target hardware, your Unity configuration will +require special help. This special help will usually reside in one of two +places: the `main()` function or the `RUN_TEST` macro. Let's look at how these +work. + + +##### `main()` + +Each test module is compiled and run on its own, separate from the other test +files in your project. Each test file, therefore, has a `main` function. This +`main` function will need to contain whatever code is necessary to initialize +your system to a workable state. This is particularly true for situations where +you must set up a memory map or initialize a communication channel for the +output of your test results. + +A simple main function looks something like this: + + int main(void) { + UNITY_BEGIN(); + RUN_TEST(test_TheFirst); + RUN_TEST(test_TheSecond); + RUN_TEST(test_TheThird); + return UNITY_END(); + } + +You can see that our main function doesn't bother taking any arguments. For our +most barebones case, we'll never have arguments because we just run all the +tests each time. Instead, we start by calling `UNITY_BEGIN`. We run each test +(in whatever order we wish). Finally, we call `UNITY_END`, returning its return +value (which is the total number of failures). + +It should be easy to see that you can add code before any test cases are run or +after all the test cases have completed. This allows you to do any needed +system-wide setup or teardown that might be required for your special +circumstances. + + +##### `RUN_TEST` + +The `RUN_TEST` macro is called with each test case function. Its job is to +perform whatever setup and teardown is necessary for executing a single test +case function. This includes catching failures, calling the test module's +`setUp()` and `tearDown()` functions, and calling `UnityConcludeTest()`. If +using CMock or test coverage, there will be additional stubs in use here. A +simple minimalist RUN_TEST macro looks something like this: + + #define RUN_TEST(testfunc) \ + UNITY_NEW_TEST(#testfunc) \ + if (TEST_PROTECT()) { \ + setUp(); \ + testfunc(); \ + } \ + if (TEST_PROTECT() && (!TEST_IS_IGNORED)) \ + tearDown(); \ + UnityConcludeTest(); + +So that's quite a macro, huh? It gives you a glimpse of what kind of stuff Unity +has to deal with for every single test case. For each test case, we declare that +it is a new test. Then we run `setUp` and our test function. These are run +within a `TEST_PROTECT` block, the function of which is to handle failures that +occur during the test. Then, assuming our test is still running and hasn't been +ignored, we run `tearDown`. No matter what, our last step is to conclude this +test before moving on to the next. + +Let's say you need to add a call to `fsync` to force all of your output data to +flush to a file after each test. You could easily insert this after your +`UnityConcludeTest` call. Maybe you want to write an xml tag before and after +each result set. Again, you could do this by adding lines to this macro. Updates +to this macro are for the occasions when you need an action before or after +every single test case throughout your entire suite of tests. + + +## Happy Porting + +The defines and macros in this guide should help you port Unity to just about +any C target we can imagine. If you run into a snag or two, don't be afraid of +asking for help on the forums. We love a good challenge! + + +*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)* diff --git a/docs/UnityConfigurationGuide.pdf b/docs/UnityConfigurationGuide.pdf deleted file mode 100644 index 5ca1a7f9a31fb4e079d97f38bad777301f9c7164..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253175 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 diff --git a/docs/UnityGettingStartedGuide.md b/docs/UnityGettingStartedGuide.md new file mode 100644 index 00000000..50fc91c7 --- /dev/null +++ b/docs/UnityGettingStartedGuide.md @@ -0,0 +1,191 @@ +# Unity - Getting Started + +## Welcome + +Congratulations. You're now the proud owner of your very own pile of bits! What +are you going to do with all these ones and zeros? This document should be able +to help you decide just that. + +Unity is a unit test framework. The goal has been to keep it small and +functional. The core Unity test framework is three files: a single C file and a +couple header files. These team up to provide functions and macros to make +testing easier. + +Unity was designed to be cross platform. It works hard to stick with C standards +while still providing support for the many embedded C compilers that bend the +rules. Unity has been used with many compilers, including GCC, IAR, Clang, +Green Hills, Microchip, and MS Visual Studio. It's not much work to get it to +work with a new target. + + +### Overview of the Documents + +#### Unity Assertions reference + +This document will guide you through all the assertion options provided by +Unity. This is going to be your unit testing bread and butter. You'll spend more +time with assertions than any other part of Unity. + + +#### Unity Assertions Cheat Sheet + +This document contains an abridged summary of the assertions described in the +previous document. It's perfect for printing and referencing while you +familiarize yourself with Unity's options. + + +#### Unity Configuration Guide + +This document is the one to reference when you are going to use Unity with a new +target or compiler. It'll guide you through the configuration options and will +help you customize your testing experience to meet your needs. + + +#### Unity Helper Scripts + +This document describes the helper scripts that are available for simplifying +your testing workflow. It describes the collection of optional Ruby scripts +included in the auto directory of your Unity installation. Neither Ruby nor +these scripts are necessary for using Unity. They are provided as a convenience +for those who wish to use them. + + +#### Unity License + +What's an open source project without a license file? This brief document +describes the terms you're agreeing to when you use this software. Basically, we +want it to be useful to you in whatever context you want to use it, but please +don't blame us if you run into problems. + + +### Overview of the Folders + +If you have obtained Unity through Github or something similar, you might be +surprised by just how much stuff you suddenly have staring you in the face. +Don't worry, Unity itself is very small. The rest of it is just there to make +your life easier. You can ignore it or use it at your convenience. Here's an +overview of everything in the project. + +- `src` - This is the code you care about! This folder contains a C file and two +header files. These three files _are_ Unity. +- `docs` - You're reading this document, so it's possible you have found your way +into this folder already. This is where all the handy documentation can be +found. +- `examples` - This contains a few examples of using Unity. +- `extras` - These are optional add ons to Unity that are not part of the core +project. If you've reached us through James Grenning's book, you're going to +want to look here. +- `test` - This is how Unity and its scripts are all tested. If you're just using +Unity, you'll likely never need to go in here. If you are the lucky team member +who gets to port Unity to a new toolchain, this is a good place to verify +everything is configured properly. +- `auto` - Here you will find helpful Ruby scripts for simplifying your test +workflow. They are purely optional and are not required to make use of Unity. + + +## How to Create A Test File + +Test files are C files. Most often you will create a single test file for each C +module that you want to test. The test file should include unity.h and the +header for your C module to be tested. + +Next, a test file will include a `setUp()` and `tearDown()` function. The setUp +function can contain anything you would like to run before each test. The +tearDown function can contain anything you would like to run after each test. +Both functions accept no arguments and return nothing. You may leave either or +both of these blank if you have no need for them. If you're using a compiler +that is configured to make these functions optional, you may leave them off +completely. Not sure? Give it a try. If you compiler complains that it can't +find setUp or tearDown when it links, you'll know you need to at least include +an empty function for these. + +The majority of the file will be a series of test functions. Test functions +follow the convention of starting with the word "test" or "spec". You don't HAVE +to name them this way, but it makes it clear what functions are tests for other +developers. Test functions take no arguments and return nothing. All test +accounting is handled internally in Unity. + +Finally, at the bottom of your test file, you will write a `main()` function. +This function will call `UNITY_BEGIN()`, then `RUN_TEST` for each test, and +finally `UNITY_END()`.This is what will actually trigger each of those test +functions to run, so it is important that each function gets its own `RUN_TEST` +call. + +Remembering to add each test to the main function can get to be tedious. If you +enjoy using helper scripts in your build process, you might consider making use +of our handy generate_test_runner.rb script. This will create the main function +and all the calls for you, assuming that you have followed the suggested naming +conventions. In this case, there is no need for you to include the main function +in your test file at all. + +When you're done, your test file will look something like this: + +```C +#include "unity.h" +#include "file_to_test.h" + +void setUp(void) { + // set stuff up here +} + +void tearDown(void) { + // clean stuff up here +} + +void test_function_should_doBlahAndBlah(void) { + //test stuff +} + +void test_function_should_doAlsoDoBlah(void) { + //more test stuff +} + +int main(void) { + UNITY_BEGIN(); + RUN_TEST(test_function_should_doBlahAndBlah); + RUN_TEST(test_function_should_doAlsoDoBlah); + return UNITY_END(); +} +``` + +It's possible that you will require more customization than this, eventually. +For that sort of thing, you're going to want to look at the configuration guide. +This should be enough to get you going, though. + + +## How to Build and Run A Test File + +This is the single biggest challenge to picking up a new unit testing framework, +at least in a language like C or C++. These languages are REALLY good at getting +you "close to the metal" (why is the phrase metal? Wouldn't it be more accurate +to say "close to the silicon"?). While this feature is usually a good thing, it +can make testing more challenging. + +You have two really good options for toolchains. Depending on where you're +coming from, it might surprise you that neither of these options is running the +unit tests on your hardware. +There are many reasons for this, but here's a short version: +- On hardware, you have too many constraints (processing power, memory, etc), +- On hardware, you don't have complete control over all registers, +- On hardware, unit testing is more challenging, +- Unit testing isn't System testing. Keep them separate. + +Instead of running your tests on your actual hardware, most developers choose to +develop them as native applications (using gcc or MSVC for example) or as +applications running on a simulator. Either is a good option. Native apps have +the advantages of being faster and easier to set up. Simulator apps have the +advantage of working with the same compiler as your target application. The +options for configuring these are discussed in the configuration guide. + +To get either to work, you might need to make a few changes to the file +containing your register set (discussed later). + +In either case, a test is built by linking unity, the test file, and the C +file(s) being tested. These files create an executable which can be run as the +test set for that module. Then, this process is repeated for the next test file. +This flexibility of separating tests into individual executables allows us to +much more thoroughly unit test our system and it keeps all the test code out of +our final release! + + +*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)* diff --git a/docs/UnityGettingStartedGuide.pdf b/docs/UnityGettingStartedGuide.pdf deleted file mode 100644 index 9d03233c0644d4f10206d076e892023ceda7d72c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166200 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 diff --git a/docs/UnityHelperScriptsGuide.md b/docs/UnityHelperScriptsGuide.md new file mode 100644 index 00000000..3a930096 --- /dev/null +++ b/docs/UnityHelperScriptsGuide.md @@ -0,0 +1,242 @@ +# Unity Helper Scripts + +## With a Little Help From Our Friends + +Sometimes what it takes to be a really efficient C programmer is a little non-C. +The Unity project includes a couple Ruby scripts for making your life just a tad +easier. They are completely optional. If you choose to use them, you'll need a +copy of Ruby, of course. Just install whatever the latest version is, and it is +likely to work. You can find Ruby at [ruby-lang.org](https://ruby-labg.org/). + + +### `generate_test_runner.rb` + +Are you tired of creating your own `main` function in your test file? Do you +keep forgetting to add a `RUN_TEST` call when you add a new test case to your +suite? Do you want to use CMock or other fancy add-ons but don't want to figure +out how to create your own `RUN_TEST` macro? + +Well then we have the perfect script for you! + +The `generate_test_runner` script processes a given test file and automatically +creates a separate test runner file that includes ?main?to execute the test +cases within the scanned test file. All you do then is add the generated runner +to your list of files to be compiled and linked, and presto you're done! + +This script searches your test file for void function signatures having a +function name beginning with "test" or "spec". It treats each of these +functions as a test case and builds up a test suite of them. For example, the +following includes three test cases: + +```C +void testVerifyThatUnityIsAwesomeAndWillMakeYourLifeEasier(void) +{ + ASSERT_TRUE(1); +} +void test_FunctionName_should_WorkProperlyAndReturn8(void) { + ASSERT_EQUAL_INT(8, FunctionName()); +} +void spec_Function_should_DoWhatItIsSupposedToDo(void) { + ASSERT_NOT_NULL(Function(5)); +} +``` + +You can run this script a couple of ways. The first is from the command line: + +```Shell +ruby generate_test_runner.rb TestFile.c NameOfRunner.c +``` + +Alternatively, if you include only the test file parameter, the script will copy +the name of the test file and automatically append "_Runner" to the name of the +generated file. The example immediately below will create TestFile_Runner.c. + +```Shell +ruby generate_test_runner.rb TestFile.c +``` + +You can also add a [YAML](http://www.yaml.org/) file to configure extra options. +Conveniently, this YAML file is of the same format as that used by Unity and +CMock. So if you are using YAML files already, you can simply pass the very same +file into the generator script. + +```Shell +ruby generate_test_runner.rb TestFile.c my_config.yml +``` + +The contents of the YAML file `my_config.yml` could look something like the +example below. If you're wondering what some of these options do, you're going +to love the next section of this document. + +```YAML +:unity: + :includes: + - stdio.h + - microdefs.h + :cexception: 1 + :suit_setup: "blah = malloc(1024);" + :suite_teardown: "free(blah);" +``` + +If you would like to force your generated test runner to include one or more +header files, you can just include those at the command line too. Just make sure +these are _after_ the YAML file, if you are using one: + +```Shell +ruby generate_test_runner.rb TestFile.c my_config.yml extras.h +``` + +Another option, particularly if you are already using Ruby to orchestrate your +builds - or more likely the Ruby-based build tool Rake - is requiring this +script directly. Anything that you would have specified in a YAML file can be +passed to the script as part of a hash. Let's push the exact same requirement +set as we did above but this time through Ruby code directly: + +```Ruby +require "generate_test_runner.rb" +options = { + :includes => ["stdio.h", "microdefs.h"], + :cexception => 1, + :suite_setup => "blah = malloc(1024);", + :suite_teardown => "free(blah);" +} +UnityTestRunnerGenerator.new.run(testfile, runner_name, options) +``` + +If you have multiple files to generate in a build script (such as a Rakefile), +you might want to instantiate a generator object with your options and call it +to generate each runner thereafter. Like thus: + +```Ruby +gen = UnityTestRunnerGenerator.new(options) +test_files.each do |f| + gen.run(f, File.basename(f,'.c')+"Runner.c" +end +``` + +#### Options accepted by generate_test_runner.rb: + +The following options are available when executing `generate_test_runner`. You +may pass these as a Ruby hash directly or specify them in a YAML file, both of +which are described above. In the `examples` directory, Example 3's Rakefile +demonstrates using a Ruby hash. + + +##### `:includes` + +This option specifies an array of file names to be ?#include?'d at the top of +your runner C file. You might use it to reference custom types or anything else +universally needed in your generated runners. + + +##### `:suite_setup` + +Define this option with C code to be executed _before any_ test cases are run. + + +##### `:suite_teardown` + +Define this option with C code to be executed ?after all?test cases have +finished. + + +##### `:enforce_strict_ordering` + +This option should be defined if you have the strict order feature enabled in +CMock (see CMock documentation). This generates extra variables required for +everything to run smoothly. If you provide the same YAML to the generator as +used in CMock's configuration, you've already configured the generator properly. + + +##### `:plugins` + +This option specifies an array of plugins to be used (of course, the array can +contain only a single plugin). This is your opportunity to enable support for +CException support, which will add a check for unhandled exceptions in each +test, reporting a failure if one is detected. To enable this feature using Ruby: + +```Ruby +:plugins => [ :cexception ] +``` + +Or as a yaml file: + +```YAML +:plugins: + -:cexception +``` + +If you are using CMock, it is very likely that you are already passing an array +of plugins to CMock. You can just use the same array here. This script will just +ignore the plugins that don't require additional support. + + +### `unity_test_summary.rb` + +A Unity test file contains one or more test case functions. Each test case can +pass, fail, or be ignored. Each test file is run individually producing results +for its collection of test cases. A given project will almost certainly be +composed of multiple test files. Therefore, the suite of tests is comprised of +one or more test cases spread across one or more test files. This script +aggregates individual test file results to generate a summary of all executed +test cases. The output includes how many tests were run, how many were ignored, +and how many failed. In addition, the output includes a listing of which +specific tests were ignored and failed. A good example of the breadth and +details of these results can be found in the `examples` directory. Intentionally +ignored and failing tests in this project generate corresponding entries in the +summary report. + +If you're interested in other (prettier?) output formats, check into the +Ceedling build tool project (ceedling.sourceforge.net) that works with Unity and +CMock and supports xunit-style xml as well as other goodies. + +This script assumes the existence of files ending with the extensions +`.testpass` and `.testfail`.The contents of these files includes the test +results summary corresponding to each test file executed with the extension set +according to the presence or absence of failures for that test file. The script +searches a specified path for these files, opens each one it finds, parses the +results, and aggregates and prints a summary. Calling it from the command line +looks like this: + +```Shell +ruby unity_test_summary.rb build/test/ +``` + +You can optionally specify a root path as well. This is really helpful when you +are using relative paths in your tools' setup, but you want to pull the summary +into an IDE like Eclipse for clickable shortcuts. + +```Shell +ruby unity_test_summary.rb build/test/ ~/projects/myproject/ +``` + +Or, if you're more of a Windows sort of person: + +```Shell +ruby unity_test_summary.rb build\teat\ C:\projects\myproject\ +``` + +When configured correctly, you'll see a final summary, like so: + +```Shell +-------------------------- +UNITY IGNORED TEST SUMMARY +-------------------------- +blah.c:22:test_sandwiches_should_HaveBreadOnTwoSides:IGNORE + +------------------------- +UNITY FAILED TEST SUMMARY +------------------------- +blah.c:87:test_sandwiches_should_HaveCondiments:FAIL:Expected 1 was 0 +meh.c:38:test_soda_should_BeCalledPop:FAIL:Expected "pop" was "coke" + +-------------------------- +OVERALL UNITY TEST SUMMARY +-------------------------- +45 TOTAL TESTS 2 TOTAL FAILURES 1 IGNORED +``` + +How convenient is that? + + +*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)* diff --git a/docs/UnityHelperScriptsGuide.pdf b/docs/UnityHelperScriptsGuide.pdf deleted file mode 100644 index e1618d75807a6b0982c49a6e99fd04afb8abd671..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181016 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

}uZ>7v;-FNj!q!r5n@zdtkmfW-0tiu3sm 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 CE`Z$t diff --git a/examples/example_3/rakefile.rb b/examples/example_3/rakefile.rb index 9f1dbeb7..bf9f42be 100644 --- a/examples/example_3/rakefile.rb +++ b/examples/example_3/rakefile.rb @@ -3,41 +3,41 @@ require 'rake' require 'rake/clean' -require HERE+'rakefile_helper' +require HERE + 'rakefile_helper' TEMP_DIRS = [ - File.join(HERE, 'build') -] + File.join(HERE, 'build') +].freeze TEMP_DIRS.each do |dir| directory(dir) CLOBBER.include(dir) end -task :prepare_for_tests => TEMP_DIRS +task prepare_for_tests: TEMP_DIRS include RakefileHelpers # Load default configuration, for now -DEFAULT_CONFIG_FILE = 'target_gcc_32.yml' +DEFAULT_CONFIG_FILE = 'target_gcc_32.yml'.freeze configure_toolchain(DEFAULT_CONFIG_FILE) -task :unit => [:prepare_for_tests] do - run_tests get_unit_test_files +task unit: [:prepare_for_tests] do + run_tests unit_test_files end -desc "Generate test summary" +desc 'Generate test summary' task :summary do report_summary end -desc "Build and test Unity" -task :all => [:clean, :unit, :summary] -task :default => [:clobber, :all] -task :ci => [:default] -task :cruise => [:default] +desc 'Build and test Unity' +task all: %i(clean unit summary) +task default: %i(clobber all) +task ci: [:default] +task cruise: [:default] -desc "Load configuration" -task :config, :config_file do |t, args| +desc 'Load configuration' +task :config, :config_file do |_t, args| configure_toolchain(args[:config_file]) end diff --git a/examples/example_3/rakefile_helper.rb b/examples/example_3/rakefile_helper.rb index ed41d806..a186cf0f 100644 --- a/examples/example_3/rakefile_helper.rb +++ b/examples/example_3/rakefile_helper.rb @@ -1,12 +1,11 @@ require 'yaml' require 'fileutils' -require UNITY_ROOT+'/auto/unity_test_summary' -require UNITY_ROOT+'/auto/generate_test_runner' -require UNITY_ROOT+'/auto/colour_reporter' +require UNITY_ROOT + '/auto/unity_test_summary' +require UNITY_ROOT + '/auto/generate_test_runner' +require UNITY_ROOT + '/auto/colour_reporter' module RakefileHelpers - - C_EXTENSION = '.c' + C_EXTENSION = '.c'.freeze def load_configuration(config_file) $cfg_file = config_file @@ -17,22 +16,22 @@ def configure_clean CLEAN.include($cfg['compiler']['build_path'] + '*.*') unless $cfg['compiler']['build_path'].nil? end - def configure_toolchain(config_file=DEFAULT_CONFIG_FILE) + def configure_toolchain(config_file = DEFAULT_CONFIG_FILE) config_file += '.yml' unless config_file =~ /\.yml$/ load_configuration(config_file) configure_clean end - def get_unit_test_files + def unit_test_files path = $cfg['compiler']['unit_tests_path'] + 'Test*' + C_EXTENSION - path.gsub!(/\\/, '/') + path.tr!('\\', '/') FileList.new(path) end - def get_local_include_dirs + def local_include_dirs include_dirs = $cfg['compiler']['includes']['items'].dup - include_dirs.delete_if {|dir| dir.is_a?(Array)} - return include_dirs + include_dirs.delete_if { |dir| dir.is_a?(Array) } + include_dirs end def extract_headers(filename) @@ -40,129 +39,126 @@ def extract_headers(filename) lines = File.readlines(filename) lines.each do |line| m = line.match(/^\s*#include\s+\"\s*(.+\.[hH])\s*\"/) - if not m.nil? - includes << m[1] - end + includes << m[1] unless m.nil? end - return includes + includes end def find_source_file(header, paths) paths.each do |dir| src_file = dir + header.ext(C_EXTENSION) - if (File.exists?(src_file)) - return src_file - end + return src_file if File.exist?(src_file) end - return nil + nil end def tackit(strings) - if strings.is_a?(Array) - result = "\"#{strings.join}\"" - else - result = strings - end - return result + result = if strings.is_a?(Array) + "\"#{strings.join}\"" + else + strings + end + result end def squash(prefix, items) result = '' items.each { |item| result += " #{prefix}#{tackit(item)}" } - return result + result end def build_compiler_fields - command = tackit($cfg['compiler']['path']) - if $cfg['compiler']['defines']['items'].nil? - defines = '' - else - defines = squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items']) - end + command = tackit($cfg['compiler']['path']) + defines = if $cfg['compiler']['defines']['items'].nil? + '' + else + squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items']) + end options = squash('', $cfg['compiler']['options']) includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) - return {:command => command, :defines => defines, :options => options, :includes => includes} + + { command: command, defines: defines, options: options, includes: includes } end - def compile(file, defines=[]) + def compile(file, _defines = []) compiler = build_compiler_fields - cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " + + cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " \ "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" obj_file = "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}" execute(cmd_str + obj_file) - return obj_file + obj_file end def build_linker_fields - command = tackit($cfg['linker']['path']) - if $cfg['linker']['options'].nil? - options = '' - else - options = squash('', $cfg['linker']['options']) - end - if ($cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil?) - includes = '' - else - includes = squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) - end - includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) - return {:command => command, :options => options, :includes => includes} + command = tackit($cfg['linker']['path']) + options = if $cfg['linker']['options'].nil? + '' + else + squash('', $cfg['linker']['options']) + end + includes = if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil? + '' + else + squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) + end.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + + { command: command, options: options, includes: includes } end def link_it(exe_name, obj_list) linker = build_linker_fields cmd_str = "#{linker[:command]}#{linker[:options]}#{linker[:includes]} " + - (obj_list.map{|obj|"#{$cfg['linker']['object_files']['path']}#{obj} "}).join + - $cfg['linker']['bin_files']['prefix'] + ' ' + - $cfg['linker']['bin_files']['destination'] + - exe_name + $cfg['linker']['bin_files']['extension'] + (obj_list.map { |obj| "#{$cfg['linker']['object_files']['path']}#{obj} " }).join + + $cfg['linker']['bin_files']['prefix'] + ' ' + + $cfg['linker']['bin_files']['destination'] + + exe_name + $cfg['linker']['bin_files']['extension'] execute(cmd_str) end def build_simulator_fields return nil if $cfg['simulator'].nil? - if $cfg['simulator']['path'].nil? - command = '' - else - command = (tackit($cfg['simulator']['path']) + ' ') - end - if $cfg['simulator']['pre_support'].nil? - pre_support = '' - else - pre_support = squash('', $cfg['simulator']['pre_support']) - end - if $cfg['simulator']['post_support'].nil? - post_support = '' - else - post_support = squash('', $cfg['simulator']['post_support']) - end - return {:command => command, :pre_support => pre_support, :post_support => post_support} - end - - def execute(command_string, verbose=true, raise_on_fail=true) + command = if $cfg['simulator']['path'].nil? + '' + else + (tackit($cfg['simulator']['path']) + ' ') + end + pre_support = if $cfg['simulator']['pre_support'].nil? + '' + else + squash('', $cfg['simulator']['pre_support']) + end + post_support = if $cfg['simulator']['post_support'].nil? + '' + else + squash('', $cfg['simulator']['post_support']) + end + + { command: command, pre_support: pre_support, post_support: post_support } + end + + def execute(command_string, verbose = true, raise_on_fail = true) report command_string output = `#{command_string}`.chomp - report(output) if (verbose && !output.nil? && (output.length > 0)) - if (($?.exitstatus != 0) and (raise_on_fail)) + report(output) if verbose && !output.nil? && !output.empty? + if !$?.exitstatus.zero? && raise_on_fail raise "Command failed. (Returned #{$?.exitstatus})" end - return output + output end def report_summary summary = UnityTestSummary.new - summary.set_root_path(HERE) + summary.root = HERE results_glob = "#{$cfg['compiler']['build_path']}*.test*" - results_glob.gsub!(/\\/, '/') + results_glob.tr!('\\', '/') results = Dir[results_glob] - summary.set_targets(results) + summary.targets = results summary.run - fail_out "FAIL: There were failures" if (summary.failures > 0) + fail_out 'FAIL: There were failures' if summary.failures > 0 end def run_tests(test_files) - report 'Running system tests...' # Tack on TEST define for compiling unit tests @@ -171,7 +167,7 @@ def run_tests(test_files) $cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil? $cfg['compiler']['defines']['items'] << 'TEST' - include_dirs = get_local_include_dirs + include_dirs = local_include_dirs # Build and execute each unit test test_files.each do |test| @@ -181,9 +177,7 @@ def run_tests(test_files) extract_headers(test).each do |header| # Compile corresponding source file if it exists src_file = find_source_file(header, include_dirs) - if !src_file.nil? - obj_list << compile(src_file, test_defines) - end + obj_list << compile(src_file, test_defines) unless src_file.nil? end # Build the test runner (generate if configured to do so) @@ -208,25 +202,24 @@ def run_tests(test_files) # Execute unit test and generate results file simulator = build_simulator_fields executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] - if simulator.nil? - cmd_str = executable - else - cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" - end + cmd_str = if simulator.nil? + executable + else + "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" + end output = execute(cmd_str, true, false) test_results = $cfg['compiler']['build_path'] + test_base - if output.match(/OK$/m).nil? - test_results += '.testfail' - else - test_results += '.testpass' - end + test_results += if output.match(/OK$/m).nil? + '.testfail' + else + '.testpass' + end File.open(test_results, 'w') { |f| f.print output } end end def build_application(main) - - report "Building application..." + report 'Building application...' obj_list = [] load_configuration($cfg_file) @@ -236,9 +229,7 @@ def build_application(main) include_dirs = get_local_include_dirs extract_headers(main_path).each do |header| src_file = find_source_file(header, include_dirs) - if !src_file.nil? - obj_list << compile(src_file) - end + obj_list << compile(src_file) unless src_file.nil? end # Build the main source file @@ -251,8 +242,8 @@ def build_application(main) def fail_out(msg) puts msg - puts "Not returning exit code so continuous integration can pass" -# exit(-1) # Only removed to pass example_3, which has failing tests on purpose. -# Still fail if the build fails for any other reason. + puts 'Not returning exit code so continuous integration can pass' + # exit(-1) # Only removed to pass example_3, which has failing tests on purpose. + # Still fail if the build fails for any other reason. end end diff --git a/extras/fixture/rakefile.rb b/extras/fixture/rakefile.rb index eb51d027..7603e574 100644 --- a/extras/fixture/rakefile.rb +++ b/extras/fixture/rakefile.rb @@ -12,34 +12,34 @@ require HERE + 'rakefile_helper' TEMP_DIRS = [ - File.join(HERE, 'build') -] + File.join(HERE, 'build') +].freeze TEMP_DIRS.each do |dir| directory(dir) CLOBBER.include(dir) end -task :prepare_for_tests => TEMP_DIRS +task prepare_for_tests: TEMP_DIRS include RakefileHelpers # Load default configuration, for now -DEFAULT_CONFIG_FILE = 'gcc_auto_stdint.yml' +DEFAULT_CONFIG_FILE = 'gcc_auto_stdint.yml'.freeze configure_toolchain(DEFAULT_CONFIG_FILE) -task :unit => [:prepare_for_tests] do +task unit: [:prepare_for_tests] do run_tests end -desc "Build and test Unity Framework" -task :all => [:clean, :unit] -task :default => [:clobber, :all] -task :ci => [:no_color, :default] -task :cruise => [:no_color, :default] +desc 'Build and test Unity Framework' +task all: %i(clean unit) +task default: %i(clobber all) +task ci: %i(no_color default) +task cruise: %i(no_color default) -desc "Load configuration" -task :config, :config_file do |t, args| +desc 'Load configuration' +task :config, :config_file do |_t, args| configure_toolchain(args[:config_file]) end diff --git a/extras/fixture/rakefile_helper.rb b/extras/fixture/rakefile_helper.rb index 85d714fe..5aa8e56a 100644 --- a/extras/fixture/rakefile_helper.rb +++ b/extras/fixture/rakefile_helper.rb @@ -6,28 +6,27 @@ require 'yaml' require 'fileutils' -require HERE+'../../auto/unity_test_summary' -require HERE+'../../auto/generate_test_runner' -require HERE+'../../auto/colour_reporter' +require HERE + '../../auto/unity_test_summary' +require HERE + '../../auto/generate_test_runner' +require HERE + '../../auto/colour_reporter' module RakefileHelpers - - C_EXTENSION = '.c' + C_EXTENSION = '.c'.freeze def load_configuration(config_file) - unless ($configured) - $cfg_file = HERE+"../../test/targets/#{config_file}" unless (config_file =~ /[\\|\/]/) - $cfg = YAML.load(File.read($cfg_file)) - $colour_output = false unless $cfg['colour'] - $configured = true if (config_file != DEFAULT_CONFIG_FILE) - end + return if $configured + + $cfg_file = HERE + "../../test/targets/#{config_file}" unless config_file =~ /[\\|\/]/ + $cfg = YAML.load(File.read($cfg_file)) + $colour_output = false unless $cfg['colour'] + $configured = true if config_file != DEFAULT_CONFIG_FILE end def configure_clean CLEAN.include($cfg['compiler']['build_path'] + '*.*') unless $cfg['compiler']['build_path'].nil? end - def configure_toolchain(config_file=DEFAULT_CONFIG_FILE) + def configure_toolchain(config_file = DEFAULT_CONFIG_FILE) config_file += '.yml' unless config_file =~ /\.yml$/ config_file = config_file unless config_file =~ /[\\|\/]/ load_configuration(config_file) @@ -35,105 +34,105 @@ def configure_toolchain(config_file=DEFAULT_CONFIG_FILE) end def tackit(strings) - if strings.is_a?(Array) - result = "\"#{strings.join}\"" - else - result = strings - end - return result + result = if strings.is_a?(Array) + "\"#{strings.join}\"" + else + strings + end + result end def squash(prefix, items) result = '' items.each { |item| result += " #{prefix}#{tackit(item)}" } - return result + result end def build_compiler_fields - command = tackit($cfg['compiler']['path']) - if $cfg['compiler']['defines']['items'].nil? - defines = '' - else - defines = squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=UnityOutputCharSpy_OutputChar']) - end + command = tackit($cfg['compiler']['path']) + defines = if $cfg['compiler']['defines']['items'].nil? + '' + else + squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=UnityOutputCharSpy_OutputChar']) + end options = squash('', $cfg['compiler']['options']) includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) - return {:command => command, :defines => defines, :options => options, :includes => includes} + + { command: command, defines: defines, options: options, includes: includes } end - def compile(file, defines=[]) + def compile(file, _defines = []) compiler = build_compiler_fields - unity_include = $cfg['compiler']['includes']['prefix']+'../../src' - cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{unity_include} #{file} " + - "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" + - "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}" + unity_include = $cfg['compiler']['includes']['prefix'] + '../../src' + cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{unity_include} #{file} " \ + "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" \ + "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}" + execute(cmd_str) end def build_linker_fields - command = tackit($cfg['linker']['path']) - if $cfg['linker']['options'].nil? - options = '' - else - options = squash('', $cfg['linker']['options']) - end - if ($cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil?) - includes = '' - else - includes = squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) - end - includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) - return {:command => command, :options => options, :includes => includes} + command = tackit($cfg['linker']['path']) + options = if $cfg['linker']['options'].nil? + '' + else + squash('', $cfg['linker']['options']) + end + includes = if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil? + '' + else + squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) + end.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + + { command: command, options: options, includes: includes } end def link_it(exe_name, obj_list) linker = build_linker_fields cmd_str = "#{linker[:command]}#{linker[:options]}#{linker[:includes]} " + - (obj_list.map{|obj|"#{$cfg['linker']['object_files']['path']}#{obj} "}).join + - $cfg['linker']['bin_files']['prefix'] + ' ' + - $cfg['linker']['bin_files']['destination'] + - exe_name + $cfg['linker']['bin_files']['extension'] + (obj_list.map { |obj| "#{$cfg['linker']['object_files']['path']}#{obj} " }).join + + $cfg['linker']['bin_files']['prefix'] + ' ' + + $cfg['linker']['bin_files']['destination'] + + exe_name + $cfg['linker']['bin_files']['extension'] execute(cmd_str) end def build_simulator_fields return nil if $cfg['simulator'].nil? - if $cfg['simulator']['path'].nil? - command = '' - else - command = (tackit($cfg['simulator']['path']) + ' ') - end - if $cfg['simulator']['pre_support'].nil? - pre_support = '' - else - pre_support = squash('', $cfg['simulator']['pre_support']) - end - if $cfg['simulator']['post_support'].nil? - post_support = '' - else - post_support = squash('', $cfg['simulator']['post_support']) - end - return {:command => command, :pre_support => pre_support, :post_support => post_support} + command = if $cfg['simulator']['path'].nil? + '' + else + (tackit($cfg['simulator']['path']) + ' ') + end + pre_support = if $cfg['simulator']['pre_support'].nil? + '' + else + squash('', $cfg['simulator']['pre_support']) + end + post_support = if $cfg['simulator']['post_support'].nil? + '' + else + squash('', $cfg['simulator']['post_support']) + end + { command: command, pre_support: pre_support, post_support: post_support } end - def execute(command_string, verbose=true) + def execute(command_string, verbose = true) report command_string output = `#{command_string}`.chomp - report(output) if (verbose && !output.nil? && (output.length > 0)) - if ($?.exitstatus != 0) - raise "Command failed. (Returned #{$?.exitstatus})" - end - return output + report(output) if verbose && !output.nil? && !output.empty? + raise "Command failed. (Returned #{$?.exitstatus})" if $?.exitstatus != 0 + output end def report_summary summary = UnityTestSummary.new - summary.set_root_path(HERE) + summary.root = HERE results_glob = "#{$cfg['compiler']['build_path']}*.test*" - results_glob.gsub!(/\\/, '/') + results_glob.tr!('\\', '/') results = Dir[results_glob] - summary.set_targets(results) + summary.targets = results summary.run end @@ -146,34 +145,34 @@ def run_tests $cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil? # Get a list of all source files needed - src_files = Dir[HERE+'src/*.c'] - src_files += Dir[HERE+'test/*.c'] - src_files += Dir[HERE+'test/main/*.c'] + src_files = Dir[HERE + 'src/*.c'] + src_files += Dir[HERE + 'test/*.c'] + src_files += Dir[HERE + 'test/main/*.c'] src_files << '../../src/unity.c' # Build object files src_files.each { |f| compile(f, test_defines) } - obj_list = src_files.map {|f| File.basename(f.ext($cfg['compiler']['object_files']['extension'])) } + obj_list = src_files.map { |f| File.basename(f.ext($cfg['compiler']['object_files']['extension'])) } # Link the test executable - test_base = "framework_test" + test_base = 'framework_test' link_it(test_base, obj_list) # Execute unit test and generate results file simulator = build_simulator_fields executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] - if simulator.nil? - cmd_str = executable + " -v -r" - else - cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" - end + cmd_str = if simulator.nil? + executable + ' -v -r' + else + "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" + end output = execute(cmd_str) test_results = $cfg['compiler']['build_path'] + test_base - if output.match(/OK$/m).nil? - test_results += '.testfail' - else - test_results += '.testpass' - end + test_results += if output.match(/OK$/m).nil? + '.testfail' + else + '.testpass' + end File.open(test_results, 'w') { |f| f.print output } end end diff --git a/extras/fixture/src/unity_fixture_malloc_overrides.h b/extras/fixture/src/unity_fixture_malloc_overrides.h index 1b176e73..7daba50a 100644 --- a/extras/fixture/src/unity_fixture_malloc_overrides.h +++ b/extras/fixture/src/unity_fixture_malloc_overrides.h @@ -26,6 +26,7 @@ * For example, when using FreeRTOS UNITY_FIXTURE_MALLOC becomes pvPortMalloc() * and UNITY_FIXTURE_FREE becomes vPortFree(). */ #if !defined(UNITY_FIXTURE_MALLOC) || !defined(UNITY_FIXTURE_FREE) + #include #define UNITY_FIXTURE_MALLOC(size) malloc(size) #define UNITY_FIXTURE_FREE(ptr) free(ptr) #else diff --git a/release/version.info b/release/version.info index 0f19985d..3b904b68 100644 --- a/release/version.info +++ b/release/version.info @@ -1,2 +1,2 @@ -2.4.0 +2.4.1 diff --git a/src/unity.c b/src/unity.c index 52663642..177af0f4 100644 --- a/src/unity.c +++ b/src/unity.c @@ -539,7 +539,8 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, const UNITY_UINT32 num_elements, const char* msg, const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style) + const UNITY_DISPLAY_STYLE_T style, + const UNITY_FLAGS_T flags) { UNITY_UINT32 elements = num_elements; unsigned int length = style & 0xF; @@ -569,17 +570,17 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected; actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual; break; - default: /* length 4 bytes */ - expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected; - actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual; - length = 4; - break; #ifdef UNITY_SUPPORT_64 case 8: expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected; actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual; break; #endif + default: /* length 4 bytes */ + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual; + length = 4; + break; } if (expect_val != actual_val) @@ -601,7 +602,10 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - expected = (UNITY_INTERNAL_PTR)(length + (const char*)expected); + if (flags == UNITY_ARRAY_TO_ARRAY) + { + expected = (UNITY_INTERNAL_PTR)(length + (const char*)expected); + } actual = (UNITY_INTERNAL_PTR)(length + (const char*)actual); } } @@ -645,7 +649,8 @@ void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual, const UNITY_UINT32 num_elements, const char* msg, - const UNITY_LINE_TYPE lineNumber) + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) { UNITY_UINT32 elements = num_elements; UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_expected = expected; @@ -673,7 +678,10 @@ void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - ptr_expected++; + if (flags == UNITY_ARRAY_TO_ARRAY) + { + ptr_expected++; + } ptr_actual++; } } @@ -771,7 +779,8 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expecte UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual, const UNITY_UINT32 num_elements, const char* msg, - const UNITY_LINE_TYPE lineNumber) + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) { UNITY_UINT32 elements = num_elements; UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_expected = expected; @@ -799,7 +808,10 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expecte UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - ptr_expected++; + if (flags == UNITY_ARRAY_TO_ARRAY) + { + ptr_expected++; + } ptr_actual++; } } @@ -898,16 +910,16 @@ void UnityAssertNumbersWithin(const UNITY_UINT delta, if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) { if (actual > expected) - Unity.CurrentTestFailed = ((UNITY_UINT)(actual - expected) > delta); + Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(actual - expected) > delta); else - Unity.CurrentTestFailed = ((UNITY_UINT)(expected - actual) > delta); + Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(expected - actual) > delta); } else { if ((UNITY_UINT)actual > (UNITY_UINT)expected) - Unity.CurrentTestFailed = ((UNITY_UINT)(actual - expected) > delta); + Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(actual - expected) > delta); else - Unity.CurrentTestFailed = ((UNITY_UINT)(expected - actual) > delta); + Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(expected - actual) > delta); } if (Unity.CurrentTestFailed) @@ -1004,13 +1016,17 @@ void UnityAssertEqualStringLen(const char* expected, } /*-----------------------------------------------*/ -void UnityAssertEqualStringArray(const char** expected, +void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, const char** actual, const UNITY_UINT32 num_elements, const char* msg, - const UNITY_LINE_TYPE lineNumber) + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) { - UNITY_UINT32 i, j = 0; + UNITY_UINT32 i = 0; + UNITY_UINT32 j = 0; + const char* exp = NULL; + const char* act = NULL; RETURN_IF_FAIL_OR_IGNORE; @@ -1020,18 +1036,35 @@ void UnityAssertEqualStringArray(const char** expected, UnityPrintPointlessAndBail(); } - if (expected == actual) return; /* Both are NULL or same pointer */ + if ((const void*)expected == (const void*)actual) + { + return; /* Both are NULL or same pointer */ + } + if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) + { UNITY_FAIL_AND_BAIL; + } + + if (flags != UNITY_ARRAY_TO_ARRAY) + { + exp = (const char*)expected; + } do { + act = actual[j]; + if (flags == UNITY_ARRAY_TO_ARRAY) + { + exp = ((const char* const*)expected)[j]; + } + /* if both pointers not null compare the strings */ - if (expected[j] && actual[j]) + if (exp && act) { - for (i = 0; expected[j][i] || actual[j][i]; i++) + for (i = 0; exp[i] || act[i]; i++) { - if (expected[j][i] != actual[j][i]) + if (exp[i] != act[i]) { Unity.CurrentTestFailed = 1; break; @@ -1040,7 +1073,7 @@ void UnityAssertEqualStringArray(const char** expected, } else { /* handle case of one pointers being null (if both null, test should pass) */ - if (expected[j] != actual[j]) + if (exp != act) { Unity.CurrentTestFailed = 1; } @@ -1054,7 +1087,7 @@ void UnityAssertEqualStringArray(const char** expected, UnityPrint(UnityStrElement); UnityPrintNumberUnsigned(j); } - UnityPrintExpectedAndActualStrings((const char*)(expected[j]), (const char*)(actual[j])); + UnityPrintExpectedAndActualStrings(exp, act); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } @@ -1067,7 +1100,8 @@ void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected, const UNITY_UINT32 length, const UNITY_UINT32 num_elements, const char* msg, - const UNITY_LINE_TYPE lineNumber) + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) { UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual; @@ -1111,9 +1145,70 @@ void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected, ptr_exp++; ptr_act++; } + if (flags == UNITY_ARRAY_TO_VAL) + { + ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; + } } } +/*-----------------------------------------------*/ + +static union +{ + UNITY_INT8 i8; + UNITY_INT16 i16; + UNITY_INT32 i32; +#ifdef UNITY_SUPPORT_64 + UNITY_INT64 i64; +#endif +#ifndef UNITY_EXCLUDE_FLOAT + float f; +#endif +#ifndef UNITY_EXCLUDE_DOUBLE + double d; +#endif +} UnityQuickCompare; + +UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size) +{ + switch(size) + { + case 1: + UnityQuickCompare.i8 = (UNITY_INT8)num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i8); + + case 2: + UnityQuickCompare.i16 = (UNITY_INT16)num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i16); + +#ifdef UNITY_SUPPORT_64 + case 8: + UnityQuickCompare.i64 = (UNITY_INT64)num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i64); +#endif + default: /* 4 bytes */ + UnityQuickCompare.i32 = (UNITY_INT32)num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i32); + } +} + +#ifndef UNITY_EXCLUDE_FLOAT +UNITY_INTERNAL_PTR UnityFloatToPtr(const float num) +{ + UnityQuickCompare.f = num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.f); +} +#endif + +#ifndef UNITY_EXCLUDE_DOUBLE +UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num) +{ + UnityQuickCompare.d = num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.d); +} +#endif + /*----------------------------------------------- * Control Functions *-----------------------------------------------*/ @@ -1177,6 +1272,7 @@ void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) #pragma weak tearDown void tearDown(void) { } #endif + /*-----------------------------------------------*/ void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) { @@ -1309,9 +1405,9 @@ int UnityParseOptions(int argc, char** argv) int IsStringInBiggerString(const char* longstring, const char* shortstring) { - char* lptr = (char*)longstring; - char* sptr = (char*)shortstring; - char* lnext = lptr; + const char* lptr = longstring; + const char* sptr = shortstring; + const char* lnext = lptr; if (*sptr == '*') return 1; @@ -1343,7 +1439,7 @@ int IsStringInBiggerString(const char* longstring, const char* shortstring) /* Otherwise we start in the long pointer 1 character further and try again */ lptr = lnext; - sptr = (char*)shortstring; + sptr = shortstring; } return 0; } diff --git a/src/unity.h b/src/unity.h index 30d0e91a..64342383 100644 --- a/src/unity.h +++ b/src/unity.h @@ -74,6 +74,10 @@ void tearDown(void); * This method allows you to abort a test immediately with a PASS state, ignoring the remainder of the test. */ #define TEST_PASS() TEST_ABORT() +/* This macro does nothing, but it is useful for build tools (like Ceedling) to make use of this to figure out + * which files should be linked to in order to perform a test. Use it like TEST_FILE("sandwiches.c") */ +#define TEST_FILE(a) + /*------------------------------------------------------- * Test Asserts (simple) *-------------------------------------------------------*/ @@ -153,10 +157,31 @@ void tearDown(void); #define TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) #define TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, NULL) +/* Arrays Compared To Single Value */ +#define TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT8((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT16((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT64((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT8((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT16((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT64((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX8((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX16((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, NULL) + /* Floating Point (If Enabled) */ #define TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, NULL) #define TEST_ASSERT_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, NULL) #define TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT((expected), (actual), (num_elements), __LINE__, NULL) #define TEST_ASSERT_FLOAT_IS_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, NULL) #define TEST_ASSERT_FLOAT_IS_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, NULL) #define TEST_ASSERT_FLOAT_IS_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, NULL) @@ -170,6 +195,7 @@ void tearDown(void); #define TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, NULL) #define TEST_ASSERT_EQUAL_DOUBLE(expected, actual) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, NULL) #define TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE((expected), (actual), (num_elements), __LINE__, NULL) #define TEST_ASSERT_DOUBLE_IS_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, NULL) #define TEST_ASSERT_DOUBLE_IS_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, NULL) #define TEST_ASSERT_DOUBLE_IS_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, NULL) @@ -258,10 +284,31 @@ void tearDown(void); #define TEST_ASSERT_EQUAL_STRING_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) #define TEST_ASSERT_EQUAL_MEMORY_ARRAY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, (message)) +/* Arrays Compared To Single Value*/ +#define TEST_ASSERT_EACH_EQUAL_INT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT8((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT16((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT64((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT8((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT16((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT64((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX8((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX16((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_PTR_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_STRING_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_MEMORY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, (message)) + /* Floating Point (If Enabled) */ #define TEST_ASSERT_FLOAT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, (message)) #define TEST_ASSERT_EQUAL_FLOAT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, (message)) #define TEST_ASSERT_EQUAL_FLOAT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_FLOAT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT((expected), (actual), (num_elements), __LINE__, (message)) #define TEST_ASSERT_FLOAT_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, (message)) #define TEST_ASSERT_FLOAT_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, (message)) #define TEST_ASSERT_FLOAT_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, (message)) @@ -275,6 +322,7 @@ void tearDown(void); #define TEST_ASSERT_DOUBLE_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, (message)) #define TEST_ASSERT_EQUAL_DOUBLE_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, (message)) #define TEST_ASSERT_EQUAL_DOUBLE_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_DOUBLE_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE((expected), (actual), (num_elements), __LINE__, (message)) #define TEST_ASSERT_DOUBLE_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, (message)) #define TEST_ASSERT_DOUBLE_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, (message)) #define TEST_ASSERT_DOUBLE_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, (message)) diff --git a/src/unity_internals.h b/src/unity_internals.h index bdcee922..cc20ea4f 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -252,14 +252,19 @@ extern void UNITY_OUTPUT_CHAR(int); #endif #ifndef UNITY_OUTPUT_FLUSH -/* Default to using fflush, which is defined in stdio.h */ +#ifdef UNITY_USE_FLUSH_STDOUT +/* We want to use the stdout flush utility */ #include #define UNITY_OUTPUT_FLUSH (void)fflush(stdout) #else - /* If defined as something else, make sure we declare it here so it's ready for use */ - #ifndef UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION +/* We've specified nothing, therefore flush should just be ignored */ +#define UNITY_OUTPUT_FLUSH +#endif +#else +/* We've defined flush as something else, so make sure we declare it here so it's ready for use */ +#ifndef UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION extern void UNITY_OUTPUT_FLUSH(void); - #endif +#endif #endif #ifndef UNITY_OUTPUT_FLUSH @@ -362,6 +367,12 @@ typedef enum UNITY_FLOAT_TRAIT } UNITY_FLOAT_TRAIT_T; #endif +typedef enum +{ + UNITY_ARRAY_TO_VAL = 0, + UNITY_ARRAY_TO_ARRAY +} UNITY_FLAGS_T; + struct UNITY_STORAGE_T { const char* TestFile; @@ -449,7 +460,8 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, const UNITY_UINT32 num_elements, const char* msg, const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style); + const UNITY_DISPLAY_STYLE_T style, + const UNITY_FLAGS_T flags); void UnityAssertBits(const UNITY_INT mask, const UNITY_INT expected, @@ -468,18 +480,20 @@ void UnityAssertEqualStringLen(const char* expected, const char* msg, const UNITY_LINE_TYPE lineNumber); -void UnityAssertEqualStringArray( const char** expected, +void UnityAssertEqualStringArray( UNITY_INTERNAL_PTR expected, const char** actual, const UNITY_UINT32 num_elements, const char* msg, - const UNITY_LINE_TYPE lineNumber); + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, UNITY_INTERNAL_PTR actual, const UNITY_UINT32 length, const UNITY_UINT32 num_elements, const char* msg, - const UNITY_LINE_TYPE lineNumber); + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); void UnityAssertNumbersWithin(const UNITY_UINT delta, const UNITY_INT expected, @@ -503,7 +517,8 @@ void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual, const UNITY_UINT32 num_elements, const char* msg, - const UNITY_LINE_TYPE lineNumber); + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); void UnityAssertFloatSpecial(const UNITY_FLOAT actual, const char* msg, @@ -522,7 +537,8 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expecte UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual, const UNITY_UINT32 num_elements, const char* msg, - const UNITY_LINE_TYPE lineNumber); + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, const char* msg, @@ -530,6 +546,18 @@ void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, const UNITY_FLOAT_TRAIT_T style); #endif +/*------------------------------------------------------- + * Helpers + *-------------------------------------------------------*/ + +UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size); +#ifndef UNITY_EXCLUDE_FLOAT +UNITY_INTERNAL_PTR UnityFloatToPtr(const float num); +#endif +#ifndef UNITY_EXCLUDE_DOUBLE +UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num); +#endif + /*------------------------------------------------------- * Error Strings We Might Need *-------------------------------------------------------*/ @@ -639,30 +667,48 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, line, message) UnityAssertEqualNumber((UNITY_PTR_TO_INT)(expected), (UNITY_PTR_TO_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) #define UNITY_TEST_ASSERT_EQUAL_STRING(expected, actual, line, message) UnityAssertEqualString((const char*)(expected), (const char*)(actual), (message), (UNITY_LINE_TYPE)(line)) #define UNITY_TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len, line, message) UnityAssertEqualStringLen((const char*)(expected), (const char*)(actual), (UNITY_UINT32)(len), (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_EQUAL_MEMORY(expected, actual, len, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), 1, (message), (UNITY_LINE_TYPE)(line)) - -#define UNITY_TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) -#define UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) -#define UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) -#define UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) -#define UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) -#define UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) -#define UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) -#define UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) -#define UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) -#define UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) -#define UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) -#define UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) -#define UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((const char**)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_MEMORY(expected, actual, len, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), 1, (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) + +#define UNITY_TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) + +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(int)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(unsigned int)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT16)expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT32)expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_PTR_TO_INT) expected, sizeof(int*)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) #ifdef UNITY_SUPPORT_64 #define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) #define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) #define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) -#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) -#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) -#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY) #define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) #define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) #define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) @@ -682,6 +728,7 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) #define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) #define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) #define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) #define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) #define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) @@ -693,7 +740,8 @@ int UnityTestMatches(void); #else #define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UnityAssertFloatsWithin((UNITY_FLOAT)(delta), (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line)) #define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((UNITY_FLOAT)(expected) * (UNITY_FLOAT)UNITY_FLOAT_PRECISION, (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (UNITY_LINE_TYPE)(line), (message)) -#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualFloatArray((UNITY_FLOAT*)(expected), (UNITY_FLOAT*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualFloatArray((UNITY_FLOAT*)(expected), (UNITY_FLOAT*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements, line, message) UnityAssertEqualFloatArray(UnityFloatToPtr(expected), (UNITY_FLOAT*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) #define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) #define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) @@ -708,6 +756,7 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) #define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) #define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) #define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) #define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) #define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) @@ -719,7 +768,8 @@ int UnityTestMatches(void); #else #define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesWithin((UNITY_DOUBLE)(delta), (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)line) #define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((UNITY_DOUBLE)(expected) * (UNITY_DOUBLE)UNITY_DOUBLE_PRECISION, (UNITY_DOUBLE)expected, (UNITY_DOUBLE)actual, (UNITY_LINE_TYPE)(line), message) -#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualDoubleArray((UNITY_DOUBLE*)(expected), (UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)line) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualDoubleArray((UNITY_DOUBLE*)(expected), (UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)line, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements, line, message) UnityAssertEqualDoubleArray(UnityDoubleToPtr(expected), (UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)line, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) #define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) #define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) diff --git a/test/.rubocop.yml b/test/.rubocop.yml new file mode 100644 index 00000000..c074ca9a --- /dev/null +++ b/test/.rubocop.yml @@ -0,0 +1,58 @@ +# This is the configuration used to check the rubocop source code. + +#inherit_from: .rubocop_todo.yml + +AllCops: + TargetRubyVersion: 2.1 + +# These are areas where ThrowTheSwitch's coding style diverges from the Ruby standard +Style/SpecialGlobalVars: + EnforcedStyle: use_perl_names +Style/FormatString: + Enabled: false +Style/GlobalVars: + Enabled: false +Style/RegexpLiteral: + AllowInnerSlashes: true +Style/HashSyntax: + EnforcedStyle: no_mixed_keys + +# This is disabled because it seems to get confused over nested hashes +Style/AlignHash: + Enabled: false + EnforcedHashRocketStyle: table + EnforcedColonStyle: table + +# We purposefully use these insecure features because they're what makes Ruby awesome +Security/Eval: + Enabled: false +Security/YAMLLoad: + Enabled: false + +# At this point, we're not ready to enforce inline documentation requirements +Style/Documentation: + Enabled: false +Style/DocumentationMethod: + Enabled: false + +# At this point, we're not ready to enforce any metrics +Metrics/AbcSize: + Enabled: false +Metrics/BlockLength: + Enabled: false +Metrics/BlockNesting: + Enabled: false +Metrics/ClassLength: + Enabled: false +Metrics/CyclomaticComplexity: + Enabled: false +Metrics/LineLength: + Enabled: false +Metrics/MethodLength: + Enabled: false +Metrics/ModuleLength: + Enabled: false +Metrics/ParameterLists: + Enabled: false +Metrics/PerceivedComplexity: + Enabled: false diff --git a/test/rakefile b/test/rakefile index 000ab009..4a2f3d2c 100644 --- a/test/rakefile +++ b/test/rakefile @@ -32,7 +32,7 @@ configure_toolchain(DEFAULT_CONFIG_FILE) desc "Test unity with its own unit tests" task :unit => [:prepare_for_tests] do - run_tests get_unit_test_files + run_tests unit_test_files end desc "Test unity's helper scripts" @@ -53,7 +53,7 @@ task :summary do end desc "Build and test Unity" -task :all => [:clean, :prepare_for_tests, :scripts, :unit, :summary] +task :all => [:clean, :prepare_for_tests, :scripts, :unit, :style, :summary] task :default => [:clobber, :all] task :ci => [:no_color, :default] task :cruise => [:no_color, :default] @@ -70,3 +70,56 @@ end task :verbose do $verbose = true end + +namespace :style do + desc "Check style" + task :check do + report "\nVERIFYING RUBY STYLE" + report execute("rubocop ../auto ../examples ../extras --config .rubocop.yml", true) + report "Styling Ruby:PASS" + end + + namespace :check do + Dir['../**/*.rb'].each do |f| + filename = File.basename(f, '.rb') + desc "Check Style of #{filename}" + task filename.to_sym => ['style:clean'] do + report execute("rubocop #{f} --color --config .rubocop.yml", true) + report "Style Checked for #{f}" + end + end + end + + desc "Fix Style of all C Code" + task :c do + run_astyle("../src/*.* ../extras/fixture/src/*.*") + end + + namespace :c do + Dir['../{src,extras/**}/*.{c,h}'].each do |f| + filename = File.basename(f)[0..-3] + desc "Check Style of #{filename}" + task filename.to_sym do + run_astyle f + end + end + end + + desc "Attempt to Autocorrect style" + task :auto => ['style:clean'] do + execute("rubocop ../auto ../examples ../extras --auto-correct --config .rubocop.yml") + report "Autocorrected What We Could." + end + + desc "Update style todo list" + task :todo => ['style:clean'] do + execute("rubocop ../auto ../examples ../extras --auto-gen-config --config .rubocop.yml") + report "Updated Style TODO List." + end + + task :clean do + File.delete(".rubocop_todo.yml") if File.exists?(".rubocop_todo.yml") + end +end + +task :style => ['style:check'] diff --git a/test/rakefile_helper.rb b/test/rakefile_helper.rb index 17bfb27e..be5bf3ea 100644 --- a/test/rakefile_helper.rb +++ b/test/rakefile_helper.rb @@ -11,39 +11,37 @@ require UNITY_ROOT + '../auto/colour_reporter' module RakefileHelpers - - C_EXTENSION = '.c' - + C_EXTENSION = '.c'.freeze def load_configuration(config_file) - unless ($configured) - $cfg_file = "targets/#{config_file}" unless (config_file =~ /[\\|\/]/) - $cfg = YAML.load(File.read($cfg_file)) - $colour_output = false unless $cfg['colour'] - $configured = true if (config_file != DEFAULT_CONFIG_FILE) - end + return if $configured + + $cfg_file = "targets/#{config_file}" unless config_file =~ /[\\|\/]/ + $cfg = YAML.load(File.read($cfg_file)) + $colour_output = false unless $cfg['colour'] + $configured = true if config_file != DEFAULT_CONFIG_FILE end def configure_clean CLEAN.include($cfg['compiler']['build_path'] + '*.*') unless $cfg['compiler']['build_path'].nil? end - def configure_toolchain(config_file=DEFAULT_CONFIG_FILE) + def configure_toolchain(config_file = DEFAULT_CONFIG_FILE) config_file += '.yml' unless config_file =~ /\.yml$/ config_file = config_file unless config_file =~ /[\\|\/]/ load_configuration(config_file) configure_clean end - def get_unit_test_files + def unit_test_files path = $cfg['compiler']['unit_tests_path'] + 'test*' + C_EXTENSION - path.gsub!(/\\/, '/') + path.tr!('\\', '/') FileList.new(path) end - def get_local_include_dirs + def local_include_dirs include_dirs = $cfg['compiler']['includes']['items'].dup - include_dirs.delete_if {|dir| dir.is_a?(Array)} - return include_dirs + include_dirs.delete_if { |dir| dir.is_a?(Array) } + include_dirs end def extract_headers(filename) @@ -51,41 +49,37 @@ def extract_headers(filename) lines = File.readlines(filename) lines.each do |line| m = line.match(/^\s*#include\s+\"\s*(.+\.[hH])\s*\"/) - if not m.nil? - includes << m[1] - end + includes << m[1] unless m.nil? end - return includes + includes end def find_source_file(header, paths) paths.each do |dir| src_file = dir + header.ext(C_EXTENSION) - if (File.exists?(src_file)) - return src_file - end + return src_file if File.exist?(src_file) end - return nil + nil end def tackit(strings) - if strings.is_a?(Array) - result = "\"#{strings.join}\"" - else - result = strings - end - return result + result = if strings.is_a?(Array) + "\"#{strings.join}\"" + else + strings + end + result end def squash(prefix, items) result = '' items.each { |item| result += " #{prefix}#{tackit(item)}" } - return result + result end def should(behave, &block) if block - puts "Should " + behave + puts 'Should ' + behave yield block else puts "UNIMPLEMENTED CASE: Should #{behave}" @@ -93,91 +87,103 @@ def should(behave, &block) end def build_compiler_fields(inject_defines) - command = tackit($cfg['compiler']['path']) - if $cfg['compiler']['defines']['items'].nil? - defines = '' - else - defines = squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=putcharSpy'] + inject_defines) - end - options = squash('', $cfg['compiler']['options']) + command = tackit($cfg['compiler']['path']) + defines = if $cfg['compiler']['defines']['items'].nil? + '' + else + squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=putcharSpy'] + inject_defines) + end + options = squash('', $cfg['compiler']['options']) includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) - return {:command => command, :defines => defines, :options => options, :includes => includes} + + { :command => command, :defines => defines, :options => options, :includes => includes } end - def compile(file, defines=[]) + def compile(file, defines = []) compiler = build_compiler_fields(defines) - defines = - cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " + + cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " \ "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" obj_file = "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}" execute(cmd_str + obj_file) - return obj_file + + obj_file end def build_linker_fields - command = tackit($cfg['linker']['path']) - if $cfg['linker']['options'].nil? - options = '' - else - options = squash('', $cfg['linker']['options']) - end - if ($cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil?) - includes = '' - else - includes = squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) - end - includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) - return {:command => command, :options => options, :includes => includes} + command = tackit($cfg['linker']['path']) + options = if $cfg['linker']['options'].nil? + '' + else + squash('', $cfg['linker']['options']) + end + includes = if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil? + '' + else + squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) + end.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + + { :command => command, :options => options, :includes => includes } end def link_it(exe_name, obj_list) linker = build_linker_fields cmd_str = "#{linker[:command]}#{linker[:options]}#{linker[:includes]} " + - (obj_list.map{|obj|"#{$cfg['linker']['object_files']['path']}#{obj} "}).join + - $cfg['linker']['bin_files']['prefix'] + ' ' + - $cfg['linker']['bin_files']['destination'] + - exe_name + $cfg['linker']['bin_files']['extension'] + (obj_list.map { |obj| "#{$cfg['linker']['object_files']['path']}#{obj} " }).join + + $cfg['linker']['bin_files']['prefix'] + ' ' + + $cfg['linker']['bin_files']['destination'] + + exe_name + $cfg['linker']['bin_files']['extension'] execute(cmd_str) end def build_simulator_fields return nil if $cfg['simulator'].nil? - if $cfg['simulator']['path'].nil? - command = '' - else - command = (tackit($cfg['simulator']['path']) + ' ') - end - if $cfg['simulator']['pre_support'].nil? - pre_support = '' - else - pre_support = squash('', $cfg['simulator']['pre_support']) - end - if $cfg['simulator']['post_support'].nil? - post_support = '' - else - post_support = squash('', $cfg['simulator']['post_support']) - end - return {:command => command, :pre_support => pre_support, :post_support => post_support} + command = if $cfg['simulator']['path'].nil? + '' + else + (tackit($cfg['simulator']['path']) + ' ') + end + pre_support = if $cfg['simulator']['pre_support'].nil? + '' + else + squash('', $cfg['simulator']['pre_support']) + end + post_support = if $cfg['simulator']['post_support'].nil? + '' + else + squash('', $cfg['simulator']['post_support']) + end + + { :command => command, :pre_support => pre_support, :post_support => post_support } + end + + def run_astyle(style_what) + report "Styling C Code..." + command = "AStyle " \ + "--style=allman --indent=spaces=4 --indent-switches --indent-preproc-define --indent-preproc-block " \ + "--pad-oper --pad-comma --unpad-paren --pad-header " \ + "--align-pointer=type --align-reference=name " \ + "--add-brackets --mode=c --suffix=none " \ + "#{style_what}" + execute(command, false) + report "Styling C:PASS" end - def execute(command_string, ok_to_fail=false) + def execute(command_string, ok_to_fail = false) report command_string if $verbose output = `#{command_string}`.chomp - report(output) if ($verbose && !output.nil? && (output.length > 0)) - if (($?.exitstatus != 0) && !ok_to_fail) - raise "Command failed. (Returned #{$?.exitstatus})" - end - return output + report(output) if $verbose && !output.nil? && !output.empty? + raise "Command failed. (Returned #{$?.exitstatus})" if !$?.exitstatus.zero? && !ok_to_fail + output end def report_summary summary = UnityTestSummary.new - summary.set_root_path(UNITY_ROOT) + summary.root = UNITY_ROOT results_glob = "#{$cfg['compiler']['build_path']}*.test*" - results_glob.gsub!(/\\/, '/') + results_glob.tr!('\\', '/') results = Dir[results_glob] - summary.set_targets(results) + summary.targets = results report summary.run end @@ -187,16 +193,16 @@ def run_tests(test_files) # Tack on TEST define for compiling unit tests load_configuration($cfg_file) test_defines = ['TEST'] - $cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil? + $cfg['compiler']['defines']['items'] ||= [] $cfg['compiler']['defines']['items'] << 'TEST' - include_dirs = get_local_include_dirs + include_dirs = local_include_dirs # Build and execute each unit test test_files.each do |test| obj_list = [] - if !$cfg['compiler']['aux_sources'].nil? + unless $cfg['compiler']['aux_sources'].nil? $cfg['compiler']['aux_sources'].each do |aux| obj_list << compile(aux, test_defines) end @@ -206,25 +212,23 @@ def run_tests(test_files) extract_headers(test).each do |header| # Compile corresponding source file if it exists src_file = find_source_file(header, include_dirs) - if !src_file.nil? - obj_list << compile(src_file, test_defines) - end + + obj_list << compile(src_file, test_defines) unless src_file.nil? end # Build the test runner (generate if configured to do so) test_base = File.basename(test, C_EXTENSION) runner_name = test_base + '_Runner.c' - runner_path = '' - if $cfg['compiler']['runner_path'].nil? - runner_path = $cfg['compiler']['build_path'] + runner_name - else - runner_path = $cfg['compiler']['runner_path'] + runner_name - end + runner_path = if $cfg['compiler']['runner_path'].nil? + $cfg['compiler']['build_path'] + runner_name + else + $cfg['compiler']['runner_path'] + runner_name + end options = $cfg[:unity] - options[:use_param_tests] = (test =~ /parameterized/) ? true : false + options[:use_param_tests] = test =~ /parameterized/ ? true : false UnityTestRunnerGenerator.new(options).run(test, runner_path) obj_list << compile(runner_path, test_defines) @@ -237,21 +241,20 @@ def run_tests(test_files) # Execute unit test and generate results file simulator = build_simulator_fields executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] - if simulator.nil? - cmd_str = executable - else - cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" - end + cmd_str = if simulator.nil? + executable + else + "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" + end output = execute(cmd_str) test_results = $cfg['compiler']['build_path'] + test_base if output.match(/OK$/m).nil? test_results += '.testfail' else - report output if (!$verbose) #verbose already prints this line, as does a failure + report output unless $verbose # Verbose already prints this line, as does a failure test_results += '.testpass' end File.open(test_results, 'w') { |f| f.print output } - end end end diff --git a/test/targets/clang_strict.yml b/test/targets/clang_strict.yml index b399d76e..ee05b2a9 100644 --- a/test/targets/clang_strict.yml +++ b/test/targets/clang_strict.yml @@ -36,7 +36,7 @@ compiler: - '-Wbad-function-cast' - '-fms-extensions' - '-fno-omit-frame-pointer' - - '-ffloat-store' + #- '-ffloat-store' - '-fno-common' - '-fstrict-aliasing' - '-std=gnu99' @@ -55,8 +55,6 @@ compiler: - UNITY_INCLUDE_DOUBLE - UNITY_SUPPORT_TEST_CASES - UNITY_SUPPORT_64 - - UNITY_OUTPUT_FLUSH - - UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION object_files: prefix: '-o' extension: '.o' diff --git a/test/testdata/testRunnerGeneratorSmall.c b/test/testdata/testRunnerGeneratorSmall.c index 9f4ec195..c6837494 100644 --- a/test/testdata/testRunnerGeneratorSmall.c +++ b/test/testdata/testRunnerGeneratorSmall.c @@ -4,6 +4,8 @@ #include "unity.h" #include "Defs.h" +TEST_FILE("some_file.c") + /* Notes about prefixes: test - normal default prefix. these are "always run" tests for this procedure spec - normal default prefix. required to run default setup/teardown calls. diff --git a/test/tests/test_generate_test_runner.rb b/test/tests/test_generate_test_runner.rb index 55a64c09..a3536d36 100644 --- a/test/tests/test_generate_test_runner.rb +++ b/test/tests/test_generate_test_runner.rb @@ -1170,11 +1170,11 @@ def runner_test(test, runner, expected, test_defines, cmdline_args) simulator = build_simulator_fields cmdline_args ||= "" executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] + " #{cmdline_args}" - if simulator.nil? - cmd_str = executable - else - cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" - end + cmd_str = if simulator.nil? + executable + else + "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" + end output = execute(cmd_str, true) #compare to the expected pass/fail diff --git a/test/tests/testunity.c b/test/tests/testunity.c index f062894a..3555fb2d 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -1519,6 +1519,61 @@ void testNotEqualStringArrayLengthZero(void) VERIFY_FAILS_END } +void testEqualStringEachEqual(void) +{ + const char *testStrings1[] = { "foo", "foo", "foo", "foo" }; + const char *testStrings2[] = { "boo", "boo", "boo", "zoo" }; + const char *testStrings3[] = { "", "", "", "" }; + + TEST_ASSERT_EACH_EQUAL_STRING("foo", testStrings1, 4); + TEST_ASSERT_EACH_EQUAL_STRING("foo", testStrings1, 1); + TEST_ASSERT_EACH_EQUAL_STRING("boo", testStrings2, 3); + TEST_ASSERT_EACH_EQUAL_STRING("", testStrings3, 4); +} + +void testNotEqualStringEachEqual1(void) +{ + const char *testStrings[] = { "foo", "foo", "foo", "moo" }; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_STRING("foo", testStrings, 4); + VERIFY_FAILS_END +} + +void testNotEqualStringEachEqual2(void) +{ + const char *testStrings[] = { "boo", "foo", "foo", "foo" }; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_STRING("foo", testStrings, 4); + VERIFY_FAILS_END +} + +void testNotEqualStringEachEqual3(void) +{ + const char *testStrings[] = { "foo", "foo", "foo", NULL }; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_STRING("foo", testStrings, 4); + VERIFY_FAILS_END +} + +void testNotEqualStringEachEqual4(void) +{ + const char *testStrings[] = { "foo", "foo", "woo", "foo" }; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_STRING("foo", testStrings, 4); + VERIFY_FAILS_END +} + +void testNotEqualStringEachEqual5(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_STRING("foo", NULL, 1); + VERIFY_FAILS_END +} + void testEqualMemory(void) { const char *testString = "whatever"; @@ -1641,6 +1696,65 @@ void testNotEqualIntArraysLengthZero(void) VERIFY_FAILS_END } +void testEqualIntEachEqual(void) +{ + int p0[] = {1, 1, 1, 1}; + int p1[] = {987, 987, 987, 987}; + int p2[] = {-2, -2, -2, -3}; + int p3[] = {1, 5, 600, 700}; + + TEST_ASSERT_EACH_EQUAL_INT(1, p0, 1); + TEST_ASSERT_EACH_EQUAL_INT(1, p0, 4); + TEST_ASSERT_EACH_EQUAL_INT(987, p1, 4); + TEST_ASSERT_EACH_EQUAL_INT(-2, p2, 3); + TEST_ASSERT_EACH_EQUAL_INT(1, p3, 1); +} + +void testNotEqualIntEachEqualNullActual(void) +{ + int* p1 = NULL; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_INT(1, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualIntEachEqual1(void) +{ + int p0[] = {1, 1, 1, -2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_INT(1, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualIntEachEqual2(void) +{ + int p0[] = {-5, -5, -1, -5}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_INT(-5, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualIntEachEqual3(void) +{ + int p0[] = {1, 88, 88, 88}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_INT(88, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualEachEqualLengthZero(void) +{ + UNITY_UINT32 p0[1] = {1}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_INT(0, p0, 0); + VERIFY_FAILS_END +} + void testEqualPtrArrays(void) { char A = 1; @@ -1721,6 +1835,77 @@ void testNotEqualPtrArrays3(void) VERIFY_FAILS_END } +void testEqualPtrEachEqual(void) +{ + char A = 1; + char B = 2; + char C = 3; + char* p0[] = {&A, &A, &A}; + char* p1[] = {&A, &B, &C, &A}; + char* p2[] = {&B, &B}; + char* p3[] = {&C}; + + TEST_ASSERT_EACH_EQUAL_PTR(&A, p0, 1); + TEST_ASSERT_EACH_EQUAL_PTR(&A, p0, 3); + TEST_ASSERT_EACH_EQUAL_PTR(&A, p1, 1); + TEST_ASSERT_EACH_EQUAL_PTR(&B, p2, 2); + TEST_ASSERT_EACH_EQUAL_PTR(&C, p3, 1); +} + +void testNotEqualPtrEachEqualNullExpected(void) +{ + char A = 1; + char B = 1; + char* p0[] = {&A, &B}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_PTR(&A, p0, 2); + VERIFY_FAILS_END +} + +void testNotEqualPtrEachEqualNullActual(void) +{ + char A = 1; + char** p0 = NULL; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_PTR(&A, p0, 2); + VERIFY_FAILS_END +} + +void testNotEqualPtrEachEqual1(void) +{ + char A = 1; + char B = 1; + char* p0[] = {&A, &A, &A, &B}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_PTR(&A, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualPtrEachEqual2(void) +{ + char A = 1; + char B = 1; + char* p0[] = {&B, &B, &A, &B}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_PTR(&B, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualPtrEachEqual3(void) +{ + char A = 1; + char B = 1; + char* p0[] = {&A, &B, &B, &B}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_PTR(&B, p0, 4); + VERIFY_FAILS_END +} + void testEqualInt8Arrays(void) { UNITY_INT8 p0[] = {1, 8, 117, -2}; @@ -1745,6 +1930,29 @@ void testNotEqualInt8Arrays(void) VERIFY_FAILS_END } +void testEqualInt8EachEqual(void) +{ + UNITY_INT8 p0[] = {1, 1, 1, 1}; + UNITY_INT8 p1[] = {117, 117, 117, -2}; + UNITY_INT8 p2[] = {-1, -1, 117, 2}; + UNITY_INT8 p3[] = {1, 50, 60, 70}; + + TEST_ASSERT_EACH_EQUAL_INT8(1, p0, 1); + TEST_ASSERT_EACH_EQUAL_INT8(1, p0, 4); + TEST_ASSERT_EACH_EQUAL_INT8(117, p1, 3); + TEST_ASSERT_EACH_EQUAL_INT8(-1, p2, 2); + TEST_ASSERT_EACH_EQUAL_INT8(1, p3, 1); +} + +void testNotEqualInt8EachEqual(void) +{ + UNITY_INT8 p0[] = {1, 8, 36, -2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_INT8(1, p0, 2); + VERIFY_FAILS_END +} + void testEqualUIntArrays(void) { unsigned int p0[] = {1, 8, 987, 65132u}; @@ -1789,6 +1997,47 @@ void testNotEqualUIntArrays3(void) VERIFY_FAILS_END } +void testEqualUIntEachEqual(void) +{ + unsigned int p0[] = {1, 1, 1, 1}; + unsigned int p1[] = {65132u, 65132u, 65132u, 65132u}; + unsigned int p2[] = {8, 8, 987, 2}; + unsigned int p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EACH_EQUAL_UINT(1, p0, 1); + TEST_ASSERT_EACH_EQUAL_UINT(1, p0, 4); + TEST_ASSERT_EACH_EQUAL_UINT(65132u, p1, 4); + TEST_ASSERT_EACH_EQUAL_UINT(8, p2, 2); + TEST_ASSERT_EACH_EQUAL_UINT(1, p3, 1); +} + +void testNotEqualUIntEachEqual1(void) +{ + unsigned int p0[] = {1, 65132u, 65132u, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT(65132u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualUIntEachEqual2(void) +{ + unsigned int p0[] = {987, 8, 987, 987}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT(987, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualUIntEachEqual3(void) +{ + unsigned int p0[] = {1, 1, 1, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT(1, p0, 4); + VERIFY_FAILS_END +} + void testEqualInt16Arrays(void) { UNITY_INT16 p0[] = {1, 8, 117, 3}; @@ -1813,6 +2062,29 @@ void testNotEqualInt16Arrays(void) VERIFY_FAILS_END } +void testEqualInt16EachEqual(void) +{ + UNITY_INT16 p0[] = {1, 1, 1, 1}; + UNITY_INT16 p1[] = {32111, 32111, 32111, 3}; + UNITY_INT16 p2[] = {-1, -1, -1, 2}; + UNITY_INT16 p3[] = {1, 50, 60, 70}; + + TEST_ASSERT_EACH_EQUAL_INT16(1, p0, 1); + TEST_ASSERT_EACH_EQUAL_INT16(1, p0, 4); + TEST_ASSERT_EACH_EQUAL_INT16(32111, p1, 3); + TEST_ASSERT_EACH_EQUAL_INT16(-1, p2, 3); + TEST_ASSERT_EACH_EQUAL_INT16(1, p3, 1); +} + +void testNotEqualInt16EachEqual(void) +{ + UNITY_INT16 p0[] = {127, 127, 127, 3}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_INT16(127, p0, 4); + VERIFY_FAILS_END +} + void testEqualInt32Arrays(void) { UNITY_INT32 p0[] = {1, 8, 117, 3}; @@ -1837,6 +2109,29 @@ void testNotEqualInt32Arrays(void) VERIFY_FAILS_END } +void testEqualInt32EachEqual(void) +{ + UNITY_INT32 p0[] = {8, 8, 8, 8}; + UNITY_INT32 p1[] = {65537, 65537, 65537, 65537}; + UNITY_INT32 p2[] = {-3, -3, -3, 2}; + UNITY_INT32 p3[] = {1, 50, 60, 70}; + + TEST_ASSERT_EACH_EQUAL_INT32(8, p0, 1); + TEST_ASSERT_EACH_EQUAL_INT32(8, p0, 4); + TEST_ASSERT_EACH_EQUAL_INT32(65537, p1, 4); + TEST_ASSERT_EACH_EQUAL_INT32(-3, p2, 3); + TEST_ASSERT_EACH_EQUAL_INT32(1, p3, 1); +} + +void testNotEqualInt32EachEqual(void) +{ + UNITY_INT32 p0[] = {127, 8, 127, 127}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_INT32(127, p0, 4); + VERIFY_FAILS_END +} + void testEqualUINT8Arrays(void) { UNITY_UINT8 p0[] = {1, 8, 100, 127}; @@ -2104,10 +2399,10 @@ void testNotEqualHEX16Arrays3(void) void testEqualHEX8Arrays(void) { - unsigned short p0[] = {1, 8, 254u, 123}; - unsigned short p1[] = {1, 8, 254u, 123}; - unsigned short p2[] = {1, 8, 254u, 2}; - unsigned short p3[] = {1, 23, 25, 26}; + unsigned char p0[] = {1, 8, 254u, 123}; + unsigned char p1[] = {1, 8, 254u, 123}; + unsigned char p2[] = {1, 8, 254u, 2}; + unsigned char p3[] = {1, 23, 25, 26}; TEST_ASSERT_EQUAL_HEX8_ARRAY(p0, p0, 1); TEST_ASSERT_EQUAL_HEX8_ARRAY(p0, p0, 4); @@ -2146,6 +2441,293 @@ void testNotEqualHEX8Arrays3(void) VERIFY_FAILS_END } +void testEqualUINT8EachEqual(void) +{ + UNITY_UINT8 p0[] = {127u, 127u, 127u, 127u}; + UNITY_UINT8 p1[] = {1u, 1u, 1u, 1u}; + UNITY_UINT8 p2[] = {128u, 128u, 128u, 2u}; + UNITY_UINT8 p3[] = {1u, 50u, 60u, 70u}; + + TEST_ASSERT_EACH_EQUAL_UINT8(127u, p0, 1); + TEST_ASSERT_EACH_EQUAL_UINT8(127u, p0, 4); + TEST_ASSERT_EACH_EQUAL_UINT8(1u, p1, 4); + TEST_ASSERT_EACH_EQUAL_UINT8(128u, p2, 3); + TEST_ASSERT_EACH_EQUAL_UINT8(1u, p3, 1); +} + +void testNotEqualUINT8EachEqual1(void) +{ + unsigned char p0[] = {127u, 127u, 128u, 127u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT8(127u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT8EachEqual2(void) +{ + unsigned char p0[] = {1, 1, 1, 127u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT8(1, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT8EachEqual3(void) +{ + unsigned char p0[] = {54u, 55u, 55u, 55u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT8(55u, p0, 4); + VERIFY_FAILS_END +} + +void testEqualUINT16EachEqual(void) +{ + unsigned short p0[] = {65132u, 65132u, 65132u, 65132u}; + unsigned short p1[] = {987, 987, 987, 987}; + unsigned short p2[] = {1, 1, 1, 2}; + unsigned short p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EACH_EQUAL_UINT16(65132u, p0, 1); + TEST_ASSERT_EACH_EQUAL_UINT16(65132u, p0, 4); + TEST_ASSERT_EACH_EQUAL_UINT16(987, p1, 4); + TEST_ASSERT_EACH_EQUAL_UINT16(1, p2, 3); + TEST_ASSERT_EACH_EQUAL_UINT16(1, p3, 1); +} + +void testNotEqualUINT16EachEqual1(void) +{ + unsigned short p0[] = {1, 65132u, 65132u, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT16(65132u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT16EachEqual2(void) +{ + unsigned short p0[] = {65132u, 65132u, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT16(65132u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT16EachEqual3(void) +{ + unsigned short p0[] = {65132u, 65132u, 65132u, 65133u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT16(65132u, p0, 4); + VERIFY_FAILS_END +} + +void testEqualUINT32EachEqual(void) +{ + UNITY_UINT32 p0[] = {65132u, 65132u, 65132u, 65132u}; + UNITY_UINT32 p1[] = {987, 987, 987, 987}; + UNITY_UINT32 p2[] = {8, 8, 8, 2}; + UNITY_UINT32 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EACH_EQUAL_UINT32(65132u, p0, 1); + TEST_ASSERT_EACH_EQUAL_UINT32(65132u, p0, 4); + TEST_ASSERT_EACH_EQUAL_UINT32(987, p1, 4); + TEST_ASSERT_EACH_EQUAL_UINT32(8, p2, 3); + TEST_ASSERT_EACH_EQUAL_UINT32(1, p3, 1); +} + +void testNotEqualUINT32EachEqual1(void) +{ + UNITY_UINT32 p0[] = {65132u, 65132u, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT32(65132u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT32EachEqual2(void) +{ + UNITY_UINT32 p0[] = {1, 987, 987, 987}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT32(987, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT32EachEqual3(void) +{ + UNITY_UINT32 p0[] = {1, 1, 1, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT32(1, p0, 4); + VERIFY_FAILS_END +} + +void testEqualHEXEachEqual(void) +{ + UNITY_UINT32 p0[] = {65132u, 65132u, 65132u, 65132u}; + UNITY_UINT32 p1[] = {987, 987, 987, 987}; + UNITY_UINT32 p2[] = {8, 8, 8, 2}; + UNITY_UINT32 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EACH_EQUAL_HEX(65132u, p0, 1); + TEST_ASSERT_EACH_EQUAL_HEX(65132u, p0, 4); + TEST_ASSERT_EACH_EQUAL_HEX(987, p1, 4); + TEST_ASSERT_EACH_EQUAL_HEX(8, p2, 3); + TEST_ASSERT_EACH_EQUAL_HEX(1, p3, 1); +} + +void testNotEqualHEXEachEqual1(void) +{ + UNITY_UINT32 p0[] = {1, 65132u, 65132u, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX32(65132u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEXEachEqual2(void) +{ + UNITY_UINT32 p0[] = {987, 987, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX32(987, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEXEachEqual3(void) +{ + UNITY_UINT32 p0[] = {8, 8, 987, 8}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX(8, p0, 4); + VERIFY_FAILS_END +} + +void testEqualHEX32EachEqual(void) +{ + UNITY_UINT32 p0[] = {65132u, 65132u, 65132u, 65132u}; + UNITY_UINT32 p1[] = {987, 987, 987, 987}; + UNITY_UINT32 p2[] = {8, 8, 8, 2}; + UNITY_UINT32 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EACH_EQUAL_HEX32(65132u, p0, 1); + TEST_ASSERT_EACH_EQUAL_HEX32(65132u, p0, 4); + TEST_ASSERT_EACH_EQUAL_HEX32(987, p1, 4); + TEST_ASSERT_EACH_EQUAL_HEX32(8, p2, 3); + TEST_ASSERT_EACH_EQUAL_HEX32(1, p3, 1); +} + +void testNotEqualHEX32EachEqual1(void) +{ + UNITY_UINT32 p0[] = {65132u, 8, 65132u, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX32(65132u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX32EachEqual2(void) +{ + UNITY_UINT32 p0[] = {1, 987, 987, 987}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX32(987, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX32EachEqual3(void) +{ + UNITY_UINT32 p0[] = {8, 8, 8, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX32(8, p0, 4); + VERIFY_FAILS_END +} + +void testEqualHEX16EachEqual(void) +{ + UNITY_UINT16 p0[] = {65132u, 65132u, 65132u, 65132u}; + UNITY_UINT16 p1[] = {987, 987, 987, 987}; + UNITY_UINT16 p2[] = {8, 8, 8, 2}; + UNITY_UINT16 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EACH_EQUAL_HEX16(65132u, p0, 1); + TEST_ASSERT_EACH_EQUAL_HEX16(65132u, p0, 4); + TEST_ASSERT_EACH_EQUAL_HEX16(987, p1, 4); + TEST_ASSERT_EACH_EQUAL_HEX16(8, p2, 3); + TEST_ASSERT_EACH_EQUAL_HEX16(1, p3, 1); +} + +void testNotEqualHEX16EachEqual1(void) +{ + unsigned short p0[] = {65132u, 65132u, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX16(65132u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX16EachEqual2(void) +{ + unsigned short p0[] = {1, 987, 987, 987}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX16(987, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX16EachEqual3(void) +{ + unsigned short p0[] = {8, 8, 8, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX16(8, p0, 4); + VERIFY_FAILS_END +} + +void testEqualHEX8EachEqual(void) +{ + unsigned char p0[] = {254u, 254u, 254u, 254u}; + unsigned char p1[] = {123, 123, 123, 123}; + unsigned char p2[] = {8, 8, 8, 2}; + unsigned char p3[] = {1, 23, 25, 26}; + + TEST_ASSERT_EACH_EQUAL_HEX8(254u, p0, 1); + TEST_ASSERT_EACH_EQUAL_HEX8(254u, p0, 4); + TEST_ASSERT_EACH_EQUAL_HEX8(123, p1, 4); + TEST_ASSERT_EACH_EQUAL_HEX8(8, p2, 3); + TEST_ASSERT_EACH_EQUAL_HEX8(1, p3, 1); +} + +void testNotEqualHEX8EachEqual1(void) +{ + unsigned char p0[] = {253u, 253u, 254u, 253u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX8(253u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX8EachEqual2(void) +{ + unsigned char p0[] = {254u, 254u, 254u, 253u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX8(254u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX8EachEqual3(void) +{ + unsigned char p0[] = {1, 8, 8, 8}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX8(8, p0, 4); + VERIFY_FAILS_END +} + void testEqualMemoryArrays(void) { int p0[] = {1, 8, 987, -2}; @@ -2210,6 +2792,71 @@ void testNotEqualMemoryArrays3(void) VERIFY_FAILS_END } +void testEqualMemoryEachEqual(void) +{ + int p0[] = {1, 8, 987, -2}; + int p1[] = {1, 8, 987, -2, 1, 8, 987, -2}; + int p2[] = {8, 8, 8, 2}; + int p3[] = {8, 500, 600, 700}; + int v = 8; + + TEST_ASSERT_EACH_EQUAL_MEMORY(p0, p0, sizeof(int)*4, 1); + TEST_ASSERT_EACH_EQUAL_MEMORY(p0, p1, sizeof(int)*4, 2); + TEST_ASSERT_EACH_EQUAL_MEMORY(p0, p1, sizeof(int)*4, 1); + TEST_ASSERT_EACH_EQUAL_MEMORY(&v, p2, sizeof(int), 3); + TEST_ASSERT_EACH_EQUAL_MEMORY(&v, p3, sizeof(int), 1); +} + +void testNotEqualMemoryEachEqualExpectedNull(void) +{ + int* p0 = NULL; + int p1[] = {1, 8, 987, 2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_MEMORY(p0, p1, sizeof(int), 4); + VERIFY_FAILS_END +} + +void testNotEqualMemoryEachEqualActualNull(void) +{ + int p0[] = {1, 8, 987, -2}; + int* p1 = NULL; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_MEMORY(p0, p1, sizeof(int), 4); + VERIFY_FAILS_END +} + +void testNotEqualMemoryEachEqual1(void) +{ + int p0[] = {1, 8, 987, -2}; + int p1[] = {9, 8, 987, -2, 1, 8, 987, -2, 1, 8, 987, -2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_MEMORY(p0, p1, sizeof(int)*4, 3); + VERIFY_FAILS_END +} + +void testNotEqualMemoryEachEqual2(void) +{ + int p0[] = {1, 8, 987, -2}; + int p1[] = {1, 8, 987, -2, 1, 8, 987, -2, 1, 8, 987, 9}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_MEMORY(p0, p1, sizeof(int)*4, 3); + VERIFY_FAILS_END +} + +void testNotEqualMemoryEachEqual3(void) +{ + int p0[] = {1, 8, 987, -2}; + int p1[] = {1, 8, 987, -2, 1, 9, 987, -2, 1, 8, 987, -2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_MEMORY(p0, p1, sizeof(int)*4, 3); + VERIFY_FAILS_END +} + void testProtection(void) { volatile int mask = 0; @@ -3255,6 +3902,150 @@ void testNotEqualFloatArraysLengthZero(void) #endif } +void testEqualFloatEachEqual(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {1.0f, 1.0f, 1.0f, 1.0f}; + float p1[] = {-0.123f, -0.123f, -0.123f, -0.123f}; + float p2[] = {25.4f, 25.4f, 25.4f, -0.2f}; + float p3[] = {1.0f, -23.0f, 25.0f, -0.26f}; + + TEST_ASSERT_EACH_EQUAL_FLOAT(1.0f, p0, 1); + TEST_ASSERT_EACH_EQUAL_FLOAT(1.0f, p0, 4); + TEST_ASSERT_EACH_EQUAL_FLOAT(-0.123f, p1, 4); + TEST_ASSERT_EACH_EQUAL_FLOAT(25.4f, p2, 3); + TEST_ASSERT_EACH_EQUAL_FLOAT(1.0f, p3, 1); +#endif +} + +void testNotEqualFloatEachEqualActualNull(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float* p0 = NULL; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_FLOAT(5, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatEachEqual1(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {0.253f, 8.0f, 0.253f, 0.253f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_FLOAT(0.253f, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatEachEqual2(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {8.0f, 8.0f, 8.0f, 0.253f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_FLOAT(8.0f, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatEachEqual3(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {1.0f, 1.0f, 1.0f, 0.253f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_FLOAT(1.0f, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatEachEqualNegative1(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {-1.0f, -0.253f, -0.253f, -0.253f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_FLOAT(-0.253f, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatEachEqualNegative2(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {-25.4f, -8.0f, -25.4f, -25.4f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_FLOAT(-25.4f, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatEachEqualNegative3(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {-8.0f, -8.0f, -8.0f, -0.253f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_FLOAT(-8.0f, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testEqualFloatEachEqualNaN(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {0.0f / f_zero, 0.0f / f_zero, 0.0f / f_zero, 0.0f / f_zero}; + + TEST_ASSERT_EACH_EQUAL_FLOAT(0.0f / f_zero, p0, 4); +#endif +} + +void testEqualFloatEachEqualInf(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {1.0f / f_zero, 1.0f / f_zero, 25.4f, 0.253f}; + + TEST_ASSERT_EACH_EQUAL_FLOAT(1.0f / f_zero, p0, 2); +#endif +} + +void testNotEqualFloatEachEqualLengthZero(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[1] = {0.0f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_FLOAT(0.0f, p0, 0); + VERIFY_FAILS_END +#endif +} + #define TEST_ASSERT_EQUAL_PRINT_FLOATING(expected, actual) { \ startPutcharSpy(); UnityPrintFloat((actual)); endPutcharSpy(); \ TEST_ASSERT_EQUAL_STRING((expected), getBufferPutcharSpy()); \ @@ -3953,6 +4744,150 @@ void testNotEqualDoubleArraysLengthZero(void) #endif } +void testEqualDoubleEachEqual(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {1.0, 1.0, 1.0, 1.0}; + double p1[] = {-0.123, -0.123, -0.123, -0.123}; + double p2[] = {25.4, 25.4, 25.4, -0.2}; + double p3[] = {1.0, -23.0, 25.0, -0.26}; + + TEST_ASSERT_EACH_EQUAL_DOUBLE(1.0, p0, 1); + TEST_ASSERT_EACH_EQUAL_DOUBLE(1.0, p0, 4); + TEST_ASSERT_EACH_EQUAL_DOUBLE(-0.123, p1, 4); + TEST_ASSERT_EACH_EQUAL_DOUBLE(25.4, p2, 3); + TEST_ASSERT_EACH_EQUAL_DOUBLE(1.0, p3, 1); +#endif +} + +void testNotEqualDoubleEachEqualActualNull(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double* p0 = NULL; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_DOUBLE(5, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleEachEqual1(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {0.253, 8.0, 0.253, 0.253}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_DOUBLE(0.253, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleEachEqual2(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {8.0, 8.0, 8.0, 0.253}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_DOUBLE(8.0, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleEachEqual3(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {1.0, 1.0, 1.0, 0.253}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_DOUBLE(1.0, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleEachEqualNegative1(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {-1.0, -0.253, -0.253, -0.253}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_DOUBLE(-0.253, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleEachEqualNegative2(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {-25.4, -8.0, -25.4, -25.4}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_DOUBLE(-25.4, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleEachEqualNegative3(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {-8.0, -8.0, -8.0, -0.253}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_DOUBLE(-8.0, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testEqualDoubleEachEqualNaN(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {0.0 / d_zero, 0.0 / d_zero, 0.0 / d_zero, 0.0 / d_zero}; + + TEST_ASSERT_EACH_EQUAL_DOUBLE(0.0 / d_zero, p0, 4); +#endif +} + +void testEqualDoubleEachEqualInf(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {1.0 / d_zero, 1.0 / d_zero, 25.4, 0.253}; + + TEST_ASSERT_EACH_EQUAL_DOUBLE(1.0 / d_zero, p0, 2); +#endif +} + +void testNotEqualDoubleEachEqualLengthZero(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[1] = {0.0}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_DOUBLE(0.0, p0, 0); + VERIFY_FAILS_END +#endif +} + void testDoublePrinting(void) { #if defined(UNITY_EXCLUDE_FLOAT_PRINT) || defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) From ee3c3bc80e23141f9dbc9425fb3fa0c071889fc1 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Thu, 27 Apr 2017 21:31:37 +0200 Subject: [PATCH 055/126] cJSONUtils_GeneratePatches: Fix multiple removes in arrays --- cJSON_Utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 5b8476cc..c6308bfd 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -822,7 +822,7 @@ static void cJSONUtils_CompareToPatch(cJSON *patches, const unsigned char *path, cJSONUtils_CompareToPatch(patches, newpath, from, to); } /* remove leftover elements from 'from' that are not in 'to' */ - for (; from; (void)(from = from->next), c++) + for (; from; (void)(from = from->next)) { /* check if conversion to unsigned long is valid * This should be eliminated at compile time by dead code elimination From 7fe8d53c193b978c4934a0e7eafe3f1ef16432c7 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 18 Apr 2017 14:13:07 +0200 Subject: [PATCH 056/126] Use json-patch-tests to test generation of tests with cJSON_Utils --- tests/json_patch_tests.c | 64 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/tests/json_patch_tests.c b/tests/json_patch_tests.c index dc13cce2..90cbaba8 100644 --- a/tests/json_patch_tests.c +++ b/tests/json_patch_tests.c @@ -119,6 +119,67 @@ static cJSON_bool test_apply_patch(const cJSON * const test) return successful; } +static cJSON_bool test_generate_test(cJSON *test __attribute__((unused))) +{ + cJSON *doc = NULL; + cJSON *patch = NULL; + cJSON *expected = NULL; + cJSON *disabled = NULL; + + cJSON *object = NULL; + cJSON_bool successful = false; + + char *printed_patch = NULL; + + disabled = cJSON_GetObjectItem(test, "disabled"); + if (cJSON_IsTrue(disabled)) + { + printf("SKIPPED\n"); + return true; + } + + doc = cJSON_GetObjectItem(test, "doc"); + TEST_ASSERT_NOT_NULL_MESSAGE(doc, "No \"doc\" in the test."); + + /* Make a working copy of 'doc' */ + object = cJSON_Duplicate(doc, true); + TEST_ASSERT_NOT_NULL(object); + + expected = cJSON_GetObjectItem(test, "expected"); + if (expected == NULL) + { + cJSON_Delete(object); + /* if there is no expected output, this test doesn't make sense */ + return true; + } + + patch = cJSONUtils_GeneratePatches(doc, expected); + TEST_ASSERT_NOT_NULL_MESSAGE(patch, "Failed to generate patches."); + + printed_patch = cJSON_Print(patch); + printf("%s\n", printed_patch); + free(printed_patch); + + /* apply the generated patch */ + TEST_ASSERT_EQUAL_INT_MESSAGE(0, cJSONUtils_ApplyPatches(object, patch), "Failed to apply generated patch."); + + successful = cJSON_Compare(object, expected, true); + + cJSON_Delete(patch); + cJSON_Delete(object); + + if (successful) + { + printf("generated patch: OK\n"); + } + else + { + printf("generated patch: FAILED\n"); + } + + return successful; +} + static void cjson_utils_should_pass_json_patch_test_tests(void) { cJSON *tests = parse_test_file("json-patch-tests/tests.json"); @@ -128,6 +189,7 @@ static void cjson_utils_should_pass_json_patch_test_tests(void) cJSON_ArrayForEach(test, tests) { failed |= !test_apply_patch(test); + failed |= !test_generate_test(test); } cJSON_Delete(tests); @@ -144,6 +206,7 @@ static void cjson_utils_should_pass_json_patch_test_spec_tests(void) cJSON_ArrayForEach(test, tests) { failed |= !test_apply_patch(test); + failed |= !test_generate_test(test); } cJSON_Delete(tests); @@ -160,6 +223,7 @@ static void cjson_utils_should_pass_json_patch_test_cjson_utils_tests(void) cJSON_ArrayForEach(test, tests) { failed |= !test_apply_patch(test); + failed |= !test_generate_test(test); } cJSON_Delete(tests); From 303660ae043d6bc1d71974913b313748a284b1d8 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Fri, 28 Apr 2017 13:58:51 +0200 Subject: [PATCH 057/126] Remove test_utils. (Replaced by old_utils_tests and json_patch_tests) --- CMakeLists.txt | 10 +------ test_utils.c | 78 -------------------------------------------------- 2 files changed, 1 insertion(+), 87 deletions(-) delete mode 100644 test_utils.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 4fd5aa45..e421f288 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -179,18 +179,10 @@ if(ENABLE_CJSON_TEST) endif() endif() - if(ENABLE_CJSON_UTILS) - set(TEST_CJSON_UTILS cJSON_test_utils) - add_executable("${TEST_CJSON_UTILS}" test_utils.c) - target_link_libraries("${TEST_CJSON_UTILS}" "${CJSON_UTILS_LIB}") - - add_test(NAME ${TEST_CJSON_UTILS} COMMAND "${CMAKE_CURRENT_BINARY_DIR}/${TEST_CJSON_UTILS}") - endif() - #"check" target that automatically builds everything and runs the tests add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure - DEPENDS ${TEST_CJSON} ${TEST_CJSON_UTILS}) + DEPENDS ${TEST_CJSON}) endif() add_subdirectory(tests) diff --git a/test_utils.c b/test_utils.c deleted file mode 100644 index 22024b03..00000000 --- a/test_utils.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - 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. -*/ - -#include -#include -#include -#include "cJSON_Utils.h" - -int main(void) -{ - /* Some variables */ - int i = 0; - - /* JSON Apply Patch tests: */ - const char *patches[15][3] = - { - {"{ \"foo\": \"bar\"}", "[{ \"op\": \"add\", \"path\": \"/baz\", \"value\": \"qux\" }]","{\"baz\": \"qux\",\"foo\": \"bar\"}"}, - {"{ \"foo\": [ \"bar\", \"baz\" ] }", "[{ \"op\": \"add\", \"path\": \"/foo/1\", \"value\": \"qux\" }]","{\"foo\": [ \"bar\", \"qux\", \"baz\" ] }"}, - {"{\"baz\": \"qux\",\"foo\": \"bar\"}"," [{ \"op\": \"remove\", \"path\": \"/baz\" }]","{\"foo\": \"bar\" }"}, - {"{ \"foo\": [ \"bar\", \"qux\", \"baz\" ] }","[{ \"op\": \"remove\", \"path\": \"/foo/1\" }]","{\"foo\": [ \"bar\", \"baz\" ] }"}, - {"{ \"baz\": \"qux\",\"foo\": \"bar\"}","[{ \"op\": \"replace\", \"path\": \"/baz\", \"value\": \"boo\" }]","{\"baz\": \"boo\",\"foo\": \"bar\"}"}, - {"{\"foo\": {\"bar\": \"baz\",\"waldo\": \"fred\"},\"qux\": {\"corge\": \"grault\"}}","[{ \"op\": \"move\", \"from\": \"/foo/waldo\", \"path\": \"/qux/thud\" }]","{\"foo\": {\"bar\": \"baz\"},\"qux\": {\"corge\": \"grault\",\"thud\": \"fred\"}}"}, - {"{ \"foo\": [ \"all\", \"grass\", \"cows\", \"eat\" ] }","[ { \"op\": \"move\", \"from\": \"/foo/1\", \"path\": \"/foo/3\" }]","{ \"foo\": [ \"all\", \"cows\", \"eat\", \"grass\" ] }"}, - {"{\"baz\": \"qux\",\"foo\": [ \"a\", 2, \"c\" ]}","[{ \"op\": \"test\", \"path\": \"/baz\", \"value\": \"qux\" },{ \"op\": \"test\", \"path\": \"/foo/1\", \"value\": 2 }]",""}, - {"{ \"baz\": \"qux\" }","[ { \"op\": \"test\", \"path\": \"/baz\", \"value\": \"bar\" }]",""}, - {"{ \"foo\": \"bar\" }","[{ \"op\": \"add\", \"path\": \"/child\", \"value\": { \"grandchild\": { } } }]","{\"foo\": \"bar\",\"child\": {\"grandchild\": {}}}"}, - {"{ \"foo\": \"bar\" }","[{ \"op\": \"add\", \"path\": \"/baz\", \"value\": \"qux\", \"xyz\": 123 }]","{\"foo\": \"bar\",\"baz\": \"qux\"}"}, - {"{ \"foo\": \"bar\" }","[{ \"op\": \"add\", \"path\": \"/baz/bat\", \"value\": \"qux\" }]",""}, - {"{\"/\": 9,\"~1\": 10}","[{\"op\": \"test\", \"path\": \"/~01\", \"value\": 10}]",""}, - {"{\"/\": 9,\"~1\": 10}","[{\"op\": \"test\", \"path\": \"/~01\", \"value\": \"10\"}]",""}, - {"{ \"foo\": [\"bar\"] }","[ { \"op\": \"add\", \"path\": \"/foo/-\", \"value\": [\"abc\", \"def\"] }]","{\"foo\": [\"bar\", [\"abc\", \"def\"]] }"} - }; - - /* JSON Generate Patch tests: */ - printf("JSON Generate Patch Tests\n"); - for (i = 0; i < 15; i++) - { - cJSON *from; - cJSON *to; - cJSON *patch; - char *out; - if (!strlen(patches[i][2])) - { - continue; - } - from = cJSON_Parse(patches[i][0]); - to = cJSON_Parse(patches[i][2]); - patch = cJSONUtils_GeneratePatches(from, to); - out = cJSON_Print(patch); - printf("Test %d: (patch: %s):\n%s\n\n", i + 1, patches[i][1], out); - - free(out); - cJSON_Delete(from); - cJSON_Delete(to); - cJSON_Delete(patch); - } - - return 0; -} From 28570ad095375ba459fc688e9c59ddbebd3881e3 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Fri, 28 Apr 2017 14:41:24 +0200 Subject: [PATCH 058/126] Add test for cJSON_SetNumberHelper --- tests/misc_tests.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/misc_tests.c b/tests/misc_tests.c index b638e4d4..249500dc 100644 --- a/tests/misc_tests.c +++ b/tests/misc_tests.c @@ -197,6 +197,27 @@ static void cjson_should_not_parse_to_deeply_nested_jsons(void) TEST_ASSERT_NULL_MESSAGE(cJSON_Parse(deep_json), "To deep JSONs should not be parsed."); } +static void cjson_set_number_value_should_set_numbers(void) +{ + cJSON number[1] = {{NULL, NULL, NULL, cJSON_Number, NULL, 0, 0, NULL}}; + + cJSON_SetNumberValue(number, 1.5); + TEST_ASSERT_EQUAL(1, number->valueint); + TEST_ASSERT_EQUAL_DOUBLE(1.5, number->valuedouble); + + cJSON_SetNumberValue(number, -1.5); + TEST_ASSERT_EQUAL(-1, number->valueint); + TEST_ASSERT_EQUAL_DOUBLE(-1.5, number->valuedouble); + + cJSON_SetNumberValue(number, 1 + (double)INT_MAX); + TEST_ASSERT_EQUAL(INT_MAX, number->valueint); + TEST_ASSERT_EQUAL_DOUBLE(1 + (double)INT_MAX, number->valuedouble); + + cJSON_SetNumberValue(number, -1 + (double)INT_MIN); + TEST_ASSERT_EQUAL(INT_MIN, number->valueint); + TEST_ASSERT_EQUAL_DOUBLE(-1 + (double)INT_MIN, number->valuedouble); +} + int main(void) { UNITY_BEGIN(); @@ -207,6 +228,7 @@ int main(void) RUN_TEST(cjson_get_object_item_case_sensitive_should_get_object_items); RUN_TEST(typecheck_functions_should_check_type); RUN_TEST(cjson_should_not_parse_to_deeply_nested_jsons); + RUN_TEST(cjson_set_number_value_should_set_numbers); return UNITY_END(); } From a69ad226397b11f76c9e9c74b45b0c4c4e6788fb Mon Sep 17 00:00:00 2001 From: Debora Grosse Date: Sat, 29 Apr 2017 13:08:10 -0400 Subject: [PATCH 059/126] Remove test for negative zero, as -0 is acceptable output --- cJSON.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cJSON.c b/cJSON.c index 9125de4b..960b3981 100644 --- a/cJSON.c +++ b/cJSON.c @@ -431,11 +431,6 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out { length = sprintf((char*)number_buffer, "null"); } - /* This checks for negative zero */ - else if (d == 0) - { - length = sprintf((char*)number_buffer, "0"); - } else { /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */ From 48b390994642e59eb1a461922a646b4c6544693c Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Mon, 1 May 2017 18:02:03 +0200 Subject: [PATCH 060/126] Squashed 'tests/json-patch-tests/' changes from 716417e..5405313 5405313 Add tests for replacing the root document (#30) git-subtree-dir: tests/json-patch-tests git-subtree-split: 54053131a31241ecccfffdc79753ff169aa9763c --- tests.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests.json b/tests.json index 3a42eab7..48bbd994 100644 --- a/tests.json +++ b/tests.json @@ -55,6 +55,21 @@ "expected": "bar", "disabled": true }, + { "comment": "replace object document with array document?", + "doc": {}, + "patch": [{"op": "add", "path": "", "value": []}], + "expected": [] }, + + { "comment": "replace array document with object document?", + "doc": [], + "patch": [{"op": "add", "path": "", "value": {}}], + "expected": {} }, + + { "comment": "append to root array document?", + "doc": [], + "patch": [{"op": "add", "path": "/-", "value": "hi"}], + "expected": ["hi"] }, + { "comment": "Add, / target", "doc": {}, "patch": [ {"op": "add", "path": "/", "value":1 } ], From 204c7ee43fd3ef3d9c1f4923c5937da9ab6d7c77 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Mon, 1 May 2017 21:56:40 +0200 Subject: [PATCH 061/126] CONTRIBUTORS.md: Add Debora Grosse --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 80cc3b75..bb0788f8 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -6,6 +6,7 @@ Contributors * [Anton Sergeev](https://github.com/anton-sergeev) * [Christian Schulze](https://github.com/ChristianSch) * [Dave Gamble](https://github.com/DaveGamble) +* [Debora Grosse](https://github.com/DeboraG) * [dieyushi](https://github.com/dieyushi) * [Dongwen Huang (黄东文)](https://github.com/DongwenHuang) * Eswar Yaganti From cc3a75dd393cf6555ac5275a91fc5f42428dd624 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Mon, 1 May 2017 21:56:55 +0200 Subject: [PATCH 062/126] Makefile: Remove test_utils --- Makefile | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Makefile b/Makefile index cc9dedd3..98ca9444 100644 --- a/Makefile +++ b/Makefile @@ -3,10 +3,8 @@ UTILS_OBJ = cJSON_Utils.o CJSON_LIBNAME = libcjson UTILS_LIBNAME = libcjson_utils CJSON_TEST = cJSON_test -UTILS_TEST = cJSON_test_utils CJSON_TEST_SRC = cJSON.c test.c -UTILS_TEST_SRC = cJSON.c cJSON_Utils.c test_utils.c LDLIBS = -lm @@ -71,9 +69,6 @@ test: tests #cJSON $(CJSON_TEST): $(CJSON_TEST_SRC) cJSON.h $(CC) $(R_CFLAGS) $(CJSON_TEST_SRC) -o $@ $(LDLIBS) -I. -#cJSON_Utils -$(UTILS_TEST): $(UTILS_TEST_SRC) cJSON.h cJSON_Utils.h - $(CC) $(R_CFLAGS) $(UTILS_TEST_SRC) -o $@ $(LDLIBS) -I. #static libraries #cJSON From c24c3e02858fbc3f27ce12da6925f87f1ab180ad Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Mon, 1 May 2017 23:15:00 +0200 Subject: [PATCH 063/126] Add cJSON_DetachItemViaPointer --- cJSON.c | 30 ++++++++++++++++++++++++++++++ cJSON.h | 1 + tests/misc_tests.c | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/cJSON.c b/cJSON.c index 3c3f10b2..e3fd23c2 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1814,6 +1814,36 @@ CJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *str cJSON_AddItemToObject(object, string, create_reference(item, &global_hooks)); } +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item) +{ + if ((parent == NULL) || (item == NULL)) + { + return NULL; + } + + if (item->prev != NULL) + { + /* not the first element */ + item->prev->next = item->next; + } + if (item->next != NULL) + { + /* not the last element */ + item->next->prev = item->prev; + } + + if (item == parent->child) + { + /* first element */ + parent->child = item->next; + } + /* make sure the detached item doesn't point anywhere anymore */ + item->prev = NULL; + item->next = NULL; + + return item; +} + static cJSON *DetachItemFromArray(cJSON *array, size_t which) { cJSON *c = array->child; diff --git a/cJSON.h b/cJSON.h index 1ef70f01..69868b00 100644 --- a/cJSON.h +++ b/cJSON.h @@ -203,6 +203,7 @@ CJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); CJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item); /* Remove/Detatch items from Arrays/Objects. */ +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item); CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which); CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which); CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string); diff --git a/tests/misc_tests.c b/tests/misc_tests.c index 249500dc..31a115b8 100644 --- a/tests/misc_tests.c +++ b/tests/misc_tests.c @@ -218,6 +218,45 @@ static void cjson_set_number_value_should_set_numbers(void) TEST_ASSERT_EQUAL_DOUBLE(-1 + (double)INT_MIN, number->valuedouble); } +static void cjson_detach_item_via_pointer_should_detach_items(void) +{ + cJSON list[4]; + cJSON parent[1]; + + memset(list, '\0', sizeof(list)); + + /* link the list */ + list[0].next = &(list[1]); + list[1].next = &(list[2]); + list[2].next = &(list[3]); + + list[3].prev = &(list[2]); + list[2].prev = &(list[1]); + list[1].prev = &(list[0]); + + parent->child = &list[0]; + + /* detach in the middle (list[1]) */ + TEST_ASSERT_TRUE_MESSAGE(cJSON_DetachItemViaPointer(parent, &(list[1])) == &(list[1]), "Failed to detach in the middle."); + TEST_ASSERT_TRUE_MESSAGE((list[1].prev == NULL) && (list[1].next == NULL), "Didn't set pointers of detached item to NULL."); + TEST_ASSERT_TRUE((list[0].next == &(list[2])) && (list[2].prev == &(list[0]))); + + /* detach beginning (list[0]) */ + TEST_ASSERT_TRUE_MESSAGE(cJSON_DetachItemViaPointer(parent, &(list[0])) == &(list[0]), "Failed to detach beginning."); + TEST_ASSERT_TRUE_MESSAGE((list[0].prev == NULL) && (list[0].next == NULL), "Didn't set pointers of detached item to NULL."); + TEST_ASSERT_TRUE_MESSAGE((list[2].prev == NULL) && (parent->child == &(list[2])), "Didn't set the new beginning."); + + /* detach end (list[3])*/ + TEST_ASSERT_TRUE_MESSAGE(cJSON_DetachItemViaPointer(parent, &(list[3])) == &(list[3]), "Failed to detach end."); + TEST_ASSERT_TRUE_MESSAGE((list[3].prev == NULL) && (list[3].next == NULL), "Didn't set pointers of detached item to NULL."); + TEST_ASSERT_TRUE_MESSAGE((list[2].next == NULL) && (parent->child == &(list[2])), "Didn't set the new end"); + + /* detach single item (list[2]) */ + TEST_ASSERT_TRUE_MESSAGE(cJSON_DetachItemViaPointer(parent, &list[2]) == &list[2], "Failed to detach single item."); + TEST_ASSERT_TRUE_MESSAGE((list[2].prev == NULL) && (list[2].next == NULL), "Didn't set pointers of detached item to NULL."); + TEST_ASSERT_NULL_MESSAGE(parent->child, "Child of the parent wasn't set to NULL."); +} + int main(void) { UNITY_BEGIN(); @@ -229,6 +268,7 @@ int main(void) RUN_TEST(typecheck_functions_should_check_type); RUN_TEST(cjson_should_not_parse_to_deeply_nested_jsons); RUN_TEST(cjson_set_number_value_should_set_numbers); + RUN_TEST(cjson_detach_item_via_pointer_should_detach_items); return UNITY_END(); } From acb0ca88df25b399056215eb55833b7bc561580a Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Mon, 1 May 2017 23:59:14 +0200 Subject: [PATCH 064/126] Use cJSON_DetachItemViaPointer internally --- cJSON.c | 30 ++---------------------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/cJSON.c b/cJSON.c index e3fd23c2..a8d8efda 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1852,28 +1852,8 @@ static cJSON *DetachItemFromArray(cJSON *array, size_t which) c = c->next; which--; } - if (!c) - { - /* item doesn't exist */ - return NULL; - } - if (c->prev) - { - /* not the first element */ - c->prev->next = c->next; - } - if (c->next) - { - c->next->prev = c->prev; - } - if (c==array->child) - { - array->child = c->next; - } - /* make sure the detached item doesn't point anywhere anymore */ - c->prev = c->next = NULL; - return c; + return cJSON_DetachItemViaPointer(array, c); } CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which) { @@ -1892,19 +1872,13 @@ CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which) CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string) { - size_t i = 0; cJSON *c = object->child; while (c && (case_insensitive_strcmp((unsigned char*)c->string, (const unsigned char*)string) != 0)) { - i++; c = c->next; } - if (c) - { - return DetachItemFromArray(object, i); - } - return NULL; + return cJSON_DetachItemViaPointer(object, c); } CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string) From 33193ea557b1d84ddec2d238b781487f30490289 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 2 May 2017 00:14:02 +0200 Subject: [PATCH 065/126] Internal function get_array_item --- cJSON.c | 87 +++++++++++++++++++++++++++++++-------------------------- cJSON.h | 2 +- 2 files changed, 49 insertions(+), 40 deletions(-) diff --git a/cJSON.c b/cJSON.c index a8d8efda..853b7239 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1665,16 +1665,33 @@ CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array) return (int)i; } -CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int item) +static cJSON* get_array_item(const cJSON *array, size_t index) { - cJSON *c = array ? array->child : NULL; - while (c && item > 0) + cJSON *current_child = NULL; + + if (array == NULL) { - item--; - c = c->next; + return NULL; + } + + current_child = array->child; + while ((current_child != NULL) && (index > 0)) + { + index--; + current_child = current_child->next; + } + + return current_child; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index) +{ + if (index < 0) + { + return NULL; } - return c; + return get_array_item(array, (size_t)index); } static cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive) @@ -1844,17 +1861,6 @@ CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const it return item; } -static cJSON *DetachItemFromArray(cJSON *array, size_t which) -{ - cJSON *c = array->child; - while (c && (which > 0)) - { - c = c->next; - which--; - } - - return cJSON_DetachItemViaPointer(array, c); -} CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which) { if (which < 0) @@ -1862,7 +1868,7 @@ CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which) return NULL; } - return DetachItemFromArray(array, (size_t)which); + return cJSON_DetachItemViaPointer(array, get_array_item(array, (size_t)which)); } CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which) @@ -1889,21 +1895,24 @@ CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string) /* Replace array/object items with new ones. */ CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem) { - cJSON *c = array->child; - while (c && (which > 0)) + cJSON *after_inserted = NULL; + + if (which < 0) { - c = c->next; - which--; + return; } - if (!c) + + after_inserted = get_array_item(array, (size_t)which); + if (after_inserted == NULL) { cJSON_AddItemToArray(array, newitem); return; } - newitem->next = c; - newitem->prev = c->prev; - c->prev = newitem; - if (c == array->child) + + newitem->next = after_inserted; + newitem->prev = after_inserted->prev; + after_inserted->prev = newitem; + if (after_inserted == array->child) { array->child = newitem; } @@ -1915,23 +1924,20 @@ CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newit static void ReplaceItemInArray(cJSON *array, size_t which, cJSON *newitem) { - cJSON *c = array->child; - while (c && (which > 0)) - { - c = c->next; - which--; - } - if (!c) + cJSON *replaced = get_array_item(array, which); + + if (replaced == NULL) { return; } - newitem->next = c->next; - newitem->prev = c->prev; + + newitem->next = replaced->next; + newitem->prev = replaced->prev; if (newitem->next) { newitem->next->prev = newitem; } - if (c == array->child) + if (replaced == array->child) { array->child = newitem; } @@ -1939,8 +1945,11 @@ static void ReplaceItemInArray(cJSON *array, size_t which, cJSON *newitem) { newitem->prev->next = newitem; } - c->next = c->prev = NULL; - cJSON_Delete(c); + + replaced->next = NULL; + replaced->prev = NULL; + + cJSON_Delete(replaced); } CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem) { diff --git a/cJSON.h b/cJSON.h index 69868b00..7247be7a 100644 --- a/cJSON.h +++ b/cJSON.h @@ -153,7 +153,7 @@ CJSON_PUBLIC(void) cJSON_Delete(cJSON *c); /* Returns the number of items in an array (or object). */ CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array); /* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */ -CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int item); +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index); /* Get item "string" from object. Case insensitive. */ CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON *object, const char *string); CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string); From 8816a568ab02ee907b0b6e1909680846b43d49e1 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 2 May 2017 00:34:17 +0200 Subject: [PATCH 066/126] Add cJSON_DetachItemFromObjectCaseSensitive --- cJSON.c | 15 +++++++++------ cJSON.h | 1 + 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/cJSON.c b/cJSON.c index 853b7239..74f17bae 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1878,13 +1878,16 @@ CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which) CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string) { - cJSON *c = object->child; - while (c && (case_insensitive_strcmp((unsigned char*)c->string, (const unsigned char*)string) != 0)) - { - c = c->next; - } + cJSON *to_detach = cJSON_GetObjectItem(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItemCaseSensitive(object, string); - return cJSON_DetachItemViaPointer(object, c); + return cJSON_DetachItemViaPointer(object, to_detach); } CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string) diff --git a/cJSON.h b/cJSON.h index 7247be7a..0d69601a 100644 --- a/cJSON.h +++ b/cJSON.h @@ -207,6 +207,7 @@ CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const it CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which); CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which); CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string); CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string); /* Update array items. */ From 2d07bbc9b2c50f895ce7191caba747916f7e805f Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 2 May 2017 00:36:10 +0200 Subject: [PATCH 067/126] Add cJSON_DeleteItemFromObjectCaseSensitive --- cJSON.c | 5 +++++ cJSON.h | 1 + 2 files changed, 6 insertions(+) diff --git a/cJSON.c b/cJSON.c index 74f17bae..5b32d013 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1895,6 +1895,11 @@ CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string) cJSON_Delete(cJSON_DetachItemFromObject(object, string)); } +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObjectCaseSensitive(object, string)); +} + /* Replace array/object items with new ones. */ CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem) { diff --git a/cJSON.h b/cJSON.h index 0d69601a..684efea2 100644 --- a/cJSON.h +++ b/cJSON.h @@ -209,6 +209,7 @@ CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which); CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string); CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string); CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string); /* Update array items. */ CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */ From 8b953d1202c591c86474a8ee287060d37f4e5030 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 2 May 2017 00:49:46 +0200 Subject: [PATCH 068/126] Add cJSON_ReplaceItemViaPointer --- cJSON.c | 57 +++++++++++++++++++--------------------------- cJSON.h | 1 + tests/misc_tests.c | 48 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 34 deletions(-) diff --git a/cJSON.c b/cJSON.c index 5b32d013..94f45b29 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1930,35 +1930,41 @@ CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newit } } -static void ReplaceItemInArray(cJSON *array, size_t which, cJSON *newitem) +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement) { - cJSON *replaced = get_array_item(array, which); + if ((parent == NULL) || (replacement == NULL)) + { + return false; + } - if (replaced == NULL) + if (replacement == item) { - return; + return true; } - newitem->next = replaced->next; - newitem->prev = replaced->prev; - if (newitem->next) + replacement->next = item->next; + replacement->prev = item->prev; + + if (replacement->next != NULL) { - newitem->next->prev = newitem; + replacement->next->prev = replacement; } - if (replaced == array->child) + if (replacement->prev != NULL) { - array->child = newitem; + replacement->prev->next = replacement; } - else + if (parent->child == item) { - newitem->prev->next = newitem; + parent->child = replacement; } - replaced->next = NULL; - replaced->prev = NULL; + item->next = NULL; + item->prev = NULL; + cJSON_Delete(item); - cJSON_Delete(replaced); + return true; } + CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem) { if (which < 0) @@ -1966,29 +1972,12 @@ CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newi return; } - ReplaceItemInArray(array, (size_t)which, newitem); + cJSON_ReplaceItemViaPointer(array, get_array_item(array, (size_t)which), newitem); } CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem) { - size_t i = 0; - cJSON *c = object->child; - while(c && (case_insensitive_strcmp((unsigned char*)c->string, (const unsigned char*)string) != 0)) - { - i++; - c = c->next; - } - if(c) - { - /* free the old string if not const */ - if (!(newitem->type & cJSON_StringIsConst) && newitem->string) - { - global_hooks.deallocate(newitem->string); - } - - newitem->string = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); - ReplaceItemInArray(object, i, newitem); - } + cJSON_ReplaceItemViaPointer(object, cJSON_GetObjectItem(object, string), newitem); } /* Create basic types: */ diff --git a/cJSON.h b/cJSON.h index 684efea2..eec11216 100644 --- a/cJSON.h +++ b/cJSON.h @@ -213,6 +213,7 @@ CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const /* Update array items. */ CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */ +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement); CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem); CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); diff --git a/tests/misc_tests.c b/tests/misc_tests.c index 31a115b8..24a390d3 100644 --- a/tests/misc_tests.c +++ b/tests/misc_tests.c @@ -257,6 +257,53 @@ static void cjson_detach_item_via_pointer_should_detach_items(void) TEST_ASSERT_NULL_MESSAGE(parent->child, "Child of the parent wasn't set to NULL."); } +static void cjson_replace_item_via_pointer_should_replace_items(void) +{ + cJSON replacements[3]; + cJSON *beginning = NULL; + cJSON *middle = NULL; + cJSON *end = NULL; + cJSON *array = NULL; + + beginning = cJSON_CreateNull(); + TEST_ASSERT_NOT_NULL(beginning); + middle = cJSON_CreateNull(); + TEST_ASSERT_NOT_NULL(middle); + end = cJSON_CreateNull(); + TEST_ASSERT_NOT_NULL(end); + + array = cJSON_CreateArray(); + TEST_ASSERT_NOT_NULL(array); + + cJSON_AddItemToArray(array, beginning); + cJSON_AddItemToArray(array, middle); + cJSON_AddItemToArray(array, end); + + + memset(replacements, '\0', sizeof(replacements)); + + /* replace beginning */ + TEST_ASSERT_TRUE(cJSON_ReplaceItemViaPointer(array, beginning, &(replacements[0]))); + TEST_ASSERT_NULL(replacements[0].prev); + TEST_ASSERT_TRUE(replacements[0].next == middle); + TEST_ASSERT_TRUE(middle->prev == &(replacements[0])); + TEST_ASSERT_TRUE(array->child == &(replacements[0])); + + /* replace middle */ + TEST_ASSERT_TRUE(cJSON_ReplaceItemViaPointer(array, middle, &(replacements[1]))); + TEST_ASSERT_TRUE(replacements[1].prev == &(replacements[0])); + TEST_ASSERT_TRUE(replacements[1].next == end); + TEST_ASSERT_TRUE(end->prev == &(replacements[1])); + + /* replace end */ + TEST_ASSERT_TRUE(cJSON_ReplaceItemViaPointer(array, end, &(replacements[2]))); + TEST_ASSERT_TRUE(replacements[2].prev == &(replacements[1])); + TEST_ASSERT_NULL(replacements[2].next); + TEST_ASSERT_TRUE(replacements[1].next == &(replacements[2])); + + cJSON_free(array); +} + int main(void) { UNITY_BEGIN(); @@ -269,6 +316,7 @@ int main(void) RUN_TEST(cjson_should_not_parse_to_deeply_nested_jsons); RUN_TEST(cjson_set_number_value_should_set_numbers); RUN_TEST(cjson_detach_item_via_pointer_should_detach_items); + RUN_TEST(cjson_replace_item_via_pointer_should_replace_items); return UNITY_END(); } From dede4e32463ecb77d48dd4954bfee505d894cbc6 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 2 May 2017 00:52:41 +0200 Subject: [PATCH 069/126] Add cJSON_ReplaceItemInObjectCaseSensitive --- cJSON.c | 5 +++++ cJSON.h | 1 + 2 files changed, 6 insertions(+) diff --git a/cJSON.c b/cJSON.c index 94f45b29..9e192366 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1980,6 +1980,11 @@ CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON_ReplaceItemViaPointer(object, cJSON_GetObjectItem(object, string), newitem); } +CJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object, const char *string, cJSON *newitem) +{ + cJSON_ReplaceItemViaPointer(object, cJSON_GetObjectItemCaseSensitive(object, string), newitem); +} + /* Create basic types: */ CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void) { diff --git a/cJSON.h b/cJSON.h index eec11216..b990a3ff 100644 --- a/cJSON.h +++ b/cJSON.h @@ -216,6 +216,7 @@ CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newit CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement); CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem); CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); +CJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem); /* Duplicate a cJSON item */ CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse); From bc622fcc151b6b0ee56ad93c74ea28d852b5121f Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 2 May 2017 00:56:28 +0200 Subject: [PATCH 070/126] README.md: Use cJSON_GetObjectItemCaseSensitive --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6b344cbf..1d6fb8ad 100644 --- a/README.md +++ b/README.md @@ -138,8 +138,8 @@ This is an object. We're in C. We don't have objects. But we do have structs. What's the framerate? ```c -cJSON *format = cJSON_GetObjectItem(root, "format"); -cJSON *framerate_item = cJSON_GetObjectItem(format, "frame rate"); +cJSON *format = cJSON_GetObjectItemCaseSensitive(root, "format"); +cJSON *framerate_item = cJSON_GetObjectItemCaseSensitive(format, "frame rate"); double framerate = 0; if (cJSON_IsNumber(framerate_item)) { @@ -150,7 +150,7 @@ if (cJSON_IsNumber(framerate_item)) Want to change the framerate? ```c -cJSON *framerate_item = cJSON_GetObjectItem(format, "frame rate"); +cJSON *framerate_item = cJSON_GetObjectItemCaseSensitive(format, "frame rate"); cJSON_SetNumberValue(framerate_item, 25); ``` From 055c7007e520c103c41b5b50101357531978d7aa Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 11:06:43 +0200 Subject: [PATCH 071/126] refactor cJSONUtils_strdup --- cJSON_Utils.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index c6308bfd..3b7cfbcc 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -30,17 +30,18 @@ #include "cJSON_Utils.h" -static unsigned char* cJSONUtils_strdup(const unsigned char* str) +static unsigned char* cJSONUtils_strdup(const unsigned char* const string) { - size_t len = 0; + size_t length = 0; unsigned char *copy = NULL; - len = strlen((const char*)str) + 1; - if (!(copy = (unsigned char*)cJSON_malloc(len))) + length = strlen((const char*)string) + sizeof(""); + copy = (unsigned char*) cJSON_malloc(length); + if (copy == NULL) { return NULL; } - memcpy(copy, str, len); + memcpy(copy, string, length); return copy; } From 44d313212b48f7d447fb6c6d97df402ad2d9dd31 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 12:52:29 +0200 Subject: [PATCH 072/126] refactor cJSONUtils_strcasecmp --- cJSON_Utils.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 3b7cfbcc..b69cfa0d 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -46,25 +46,28 @@ static unsigned char* cJSONUtils_strdup(const unsigned char* const string) return copy; } -static int cJSONUtils_strcasecmp(const unsigned char *s1, const unsigned char *s2) +/* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ +static int cJSONUtils_strcasecmp(const unsigned char *string1, const unsigned char *string2) { - if (!s1) + if ((string1 == NULL) || (string2 == NULL)) { - return (s1 == s2) ? 0 : 1; /* both NULL? */ + return 1; } - if (!s2) + + if (string1 == string2) { - return 1; + return 0; } - for(; tolower(*s1) == tolower(*s2); (void)++s1, ++s2) + + for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) { - if(*s1 == 0) + if (*string1 == '\0') { return 0; } } - return tolower(*s1) - tolower(*s2); + return tolower(*string1) - tolower(*string2); } /* JSON Pointer implementation: */ From b16bcc3c194a869629dc09d66def7e1f0e7ec2b7 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 12:53:00 +0200 Subject: [PATCH 073/126] refactor cJSONUtils_Pstrcasecmp --- cJSON_Utils.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index b69cfa0d..d07179fc 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -70,34 +70,35 @@ static int cJSONUtils_strcasecmp(const unsigned char *string1, const unsigned ch return tolower(*string1) - tolower(*string2); } -/* JSON Pointer implementation: */ -static int cJSONUtils_Pstrcasecmp(const unsigned char *a, const unsigned char *e) +/* Compare the next path element of two JSON pointers, two NULL pointers are considered unequal: */ +static int cJSONUtils_Pstrcasecmp(const unsigned char *name, const unsigned char *pointer) { - if (!a || !e) + if ((name == NULL) || (pointer == NULL)) { - return (a == e) ? 0 : 1; /* both NULL? */ + return 1; } - for (; *a && *e && (*e != '/'); (void)a++, e++) /* compare until next '/' */ + + for (; (*name != '\0') && (*pointer != '\0') && (*pointer != '/'); (void)name++, pointer++) /* compare until next '/' */ { - if (*e == '~') + if (*pointer == '~') { /* check for escaped '~' (~0) and '/' (~1) */ - if (!((e[1] == '0') && (*a == '~')) && !((e[1] == '1') && (*a == '/'))) + if (((pointer[1] != '0') || (*name != '~')) && ((pointer[1] != '1') || (*name != '/'))) { - /* invalid escape sequence or wrong character in *a */ + /* invalid escape sequence or wrong character in *name */ return 1; } else { - e++; + pointer++; } } - else if (tolower(*a) != tolower(*e)) + else if (tolower(*name) != tolower(*pointer)) { return 1; } } - if (((*e != 0) && (*e != '/')) != (*a != 0)) + if (((*pointer != 0) && (*pointer != '/')) != (*name != 0)) { /* one string has ended, the other not */ return 1; From b8e3673d0fc0f83fb6095e720411d0b0ed79b9ce Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 12:54:00 +0200 Subject: [PATCH 074/126] refactor cJSONUtils_PointerEncodedstrlen --- cJSON_Utils.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index d07179fc..0fd18ab5 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -107,18 +107,20 @@ static int cJSONUtils_Pstrcasecmp(const unsigned char *name, const unsigned char return 0; } -static size_t cJSONUtils_PointerEncodedstrlen(const unsigned char *s) +/* calculate the length of a string if encoded as JSON pointer with ~0 and ~1 escape sequences */ +static size_t cJSONUtils_PointerEncodedstrlen(const unsigned char *string) { - size_t l = 0; - for (; *s; (void)s++, l++) + size_t length; + for (length = 0; *string != '\0'; (void)string++, length++) { - if ((*s == '~') || (*s == '/')) + /* character needs to be escaped? */ + if ((*string == '~') || (*string == '/')) { - l++; + length++; } } - return l; + return length; } static void cJSONUtils_PointerEncodedstrcpy(unsigned char *d, const unsigned char *s) From 674a6788191b181e4a1bb086be652bb2865d6267 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 12:54:44 +0200 Subject: [PATCH 075/126] refactor cJSONUtils_PointerEncodedstrcpy --- cJSON_Utils.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 0fd18ab5..6689244a 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -123,27 +123,29 @@ static size_t cJSONUtils_PointerEncodedstrlen(const unsigned char *string) return length; } -static void cJSONUtils_PointerEncodedstrcpy(unsigned char *d, const unsigned char *s) +/* copy a string while escaping '~' and '/' with ~0 and ~1 JSON pointer escape codes */ +static void cJSONUtils_PointerEncodedstrcpy(unsigned char *destination, const unsigned char *source) { - for (; *s; s++) + for (; source[0] != '\0'; (void)source++, destination++) { - if (*s == '/') + if (source[0] == '/') { - *d++ = '~'; - *d++ = '1'; + destination[1] = '1'; + destination++; } - else if (*s == '~') + else if (source[0] == '~') { - *d++ = '~'; - *d++ = '0'; + destination[0] = '~'; + destination[1] = '1'; + destination++; } else { - *d++ = *s; + destination[0] = source[0]; } } - *d = '\0'; + destination[0] = '\0'; } CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(cJSON *object, cJSON *target) From 4932c80f26addcf5497a28d9398295525a07506f Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 12:56:02 +0200 Subject: [PATCH 076/126] refactor cJSONUtils_FindPointerFromObjectTo --- cJSON_Utils.c | 44 +++++++++++++++++++++++--------------------- cJSON_Utils.h | 2 +- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 6689244a..db8fd4bd 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -148,10 +148,10 @@ static void cJSONUtils_PointerEncodedstrcpy(unsigned char *destination, const un destination[0] = '\0'; } -CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(cJSON *object, cJSON *target) +CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const object, const cJSON * const target) { - size_t c = 0; - cJSON *obj = 0; + size_t child_index = 0; + cJSON *current_child = 0; if (object == target) { @@ -159,42 +159,44 @@ CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(cJSON *object, cJSON *ta return (char*)cJSONUtils_strdup((const unsigned char*)""); } - /* recursively search all children of the object */ - for (obj = object->child; obj; (void)(obj = obj->next), c++) + /* recursively search all children of the object or array */ + for (current_child = object->child; current_child != NULL; (void)(current_child = current_child->next), child_index++) { - unsigned char *found = (unsigned char*)cJSONUtils_FindPointerFromObjectTo(obj, target); - if (found) + unsigned char *target_pointer = (unsigned char*)cJSONUtils_FindPointerFromObjectTo(current_child, target); + /* found the target? */ + if (target_pointer != NULL) { if (cJSON_IsArray(object)) { /* reserve enough memory for a 64 bit integer + '/' and '\0' */ - unsigned char *ret = (unsigned char*)cJSON_malloc(strlen((char*)found) + 23); + unsigned char *full_pointer = (unsigned char*)cJSON_malloc(strlen((char*)target_pointer) + 20 + sizeof("/")); /* check if conversion to unsigned long is valid * This should be eliminated at compile time by dead code elimination * if size_t is an alias of unsigned long, or if it is bigger */ - if (c > ULONG_MAX) + if (child_index > ULONG_MAX) { - cJSON_free(found); + cJSON_free(target_pointer); return NULL; } - sprintf((char*)ret, "/%lu%s", (unsigned long)c, found); /* / */ - cJSON_free(found); + sprintf((char*)full_pointer, "/%lu%s", (unsigned long)child_index, target_pointer); /* / */ + cJSON_free(target_pointer); - return (char*)ret; + return (char*)full_pointer; } - else if (cJSON_IsObject(object)) + + if (cJSON_IsObject(object)) { - unsigned char *ret = (unsigned char*)cJSON_malloc(strlen((char*)found) + cJSONUtils_PointerEncodedstrlen((unsigned char*)obj->string) + 2); - *ret = '/'; - cJSONUtils_PointerEncodedstrcpy(ret + 1, (unsigned char*)obj->string); - strcat((char*)ret, (char*)found); - cJSON_free(found); + unsigned char *full_pointer = (unsigned char*)cJSON_malloc(strlen((char*)target_pointer) + cJSONUtils_PointerEncodedstrlen((unsigned char*)current_child->string) + 2); + full_pointer[0] = '/'; + cJSONUtils_PointerEncodedstrcpy(full_pointer + 1, (unsigned char*)current_child->string); + strcat((char*)full_pointer, (char*)target_pointer); + cJSON_free(target_pointer); - return (char*)ret; + return (char*)full_pointer; } /* reached leaf of the tree, found nothing */ - cJSON_free(found); + cJSON_free(target_pointer); return NULL; } } diff --git a/cJSON_Utils.h b/cJSON_Utils.h index e7cec143..6eab69ae 100644 --- a/cJSON_Utils.h +++ b/cJSON_Utils.h @@ -60,7 +60,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, cJSON *patch); CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON *from, cJSON *to); /* Given a root object and a target object, construct a pointer from one to the other. */ -CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(cJSON *object, cJSON *target); +CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const object, const cJSON * const target); /* Sorts the members of the object into alphabetical order. */ CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON *object); From 4642d6575fa00812d4c583ef68fb4dacfec458c8 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 12:56:45 +0200 Subject: [PATCH 077/126] refactor decode_array_index_from_pointer --- cJSON_Utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index db8fd4bd..9998dcd9 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -229,7 +229,7 @@ static cJSON_bool decode_array_index_from_pointer(const unsigned char * const po return 0; } - for (position = 0; (pointer[position] >= '0') && (*pointer <= '9'); position++) + for (position = 0; (pointer[position] >= '0') && (pointer[0] <= '9'); position++) { parsed_index = (10 * parsed_index) + (size_t)(pointer[position] - '0'); From 378a333ee21b086d8f2ec6a3197b471fe088016d Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 12:57:49 +0200 Subject: [PATCH 078/126] refactor cJSONUtils_GetPointer --- cJSON_Utils.c | 22 ++++++++++++---------- cJSON_Utils.h | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 9998dcd9..9c0c33e3 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -245,12 +245,14 @@ static cJSON_bool decode_array_index_from_pointer(const unsigned char * const po return 1; } -CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON *object, const char *pointer) +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *pointer) { + cJSON *current_element = object; /* follow path of the pointer */ - while ((*pointer++ == '/') && object) + while ((pointer[0] == '/') && (current_element != NULL)) { - if (cJSON_IsArray(object)) + pointer++; + if (cJSON_IsArray(current_element)) { size_t index = 0; if (!decode_array_index_from_pointer((const unsigned char*)pointer, &index)) @@ -258,18 +260,18 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON *object, const char *pointer) return NULL; } - object = get_array_item(object, index); + current_element = get_array_item(current_element, index); } - else if (cJSON_IsObject(object)) + else if (cJSON_IsObject(current_element)) { - object = object->child; + current_element = current_element->child; /* GetObjectItem. */ - while (object && cJSONUtils_Pstrcasecmp((unsigned char*)object->string, (const unsigned char*)pointer)) + while ((current_element != NULL) && cJSONUtils_Pstrcasecmp((unsigned char*)current_element->string, (const unsigned char*)pointer)) { - object = object->next; + current_element = current_element->next; } /* skip to the next path token or end of string */ - while (*pointer && (*pointer != '/')) + while ((pointer[0] != '\0') && (pointer[0] != '/')) { pointer++; } @@ -280,7 +282,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON *object, const char *pointer) } } - return object; + return current_element; } /* JSON Patch implementation. */ diff --git a/cJSON_Utils.h b/cJSON_Utils.h index 6eab69ae..8952645a 100644 --- a/cJSON_Utils.h +++ b/cJSON_Utils.h @@ -23,7 +23,7 @@ #include "cJSON.h" /* Implement RFC6901 (https://tools.ietf.org/html/rfc6901) JSON Pointer spec. */ -CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON *object, const char *pointer); +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *pointer); /* Implement RFC6902 (https://tools.ietf.org/html/rfc6902) JSON Patch spec. */ CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON *from, cJSON *to); From 4ba6bafe34af2a7334389ef84f64d291d91fdf74 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 13:00:16 +0200 Subject: [PATCH 079/126] refactor cJSONUtils_InplaceDecodePointerString --- cJSON_Utils.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 9c0c33e3..e9e809ca 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -288,22 +288,35 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *po /* JSON Patch implementation. */ static void cJSONUtils_InplaceDecodePointerString(unsigned char *string) { - unsigned char *s2 = string; + unsigned char *decoded_string = string; if (string == NULL) { return; } - for (; *string; (void)s2++, string++) + for (; *string; (void)decoded_string++, string++) { - *s2 = (unsigned char) ((*string != '~') - ? (*string) - : ((*(++string) == '0') - ? '~' - : '/')); + if (string[0] == '~') + { + if (string[1] == '0') + { + decoded_string[0] = '~'; + } + else if (string[1] == '1') + { + decoded_string[1] = '/'; + } + else + { + /* invalid escape sequence */ + return; + } + + string++; + } } - *s2 = '\0'; + decoded_string[0] = '\0'; } /* non-broken cJSON_DetachItemFromArray */ From 2040ce9004c88a3217a37edc653f8a7ca88535b6 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 13:01:04 +0200 Subject: [PATCH 080/126] refactor cJSONUtils_PatchDetach --- cJSON_Utils.c | 57 +++++++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index e9e809ca..38f81c31 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -354,52 +354,55 @@ static cJSON *detach_item_from_array(cJSON *array, size_t which) static cJSON *cJSONUtils_PatchDetach(cJSON *object, const unsigned char *path) { - unsigned char *parentptr = NULL; - unsigned char *childptr = NULL; + unsigned char *parent_pointer = NULL; + unsigned char *child_pointer = NULL; cJSON *parent = NULL; - cJSON *ret = NULL; + cJSON *detached_item = NULL; /* copy path and split it in parent and child */ - parentptr = cJSONUtils_strdup(path); - if (parentptr == NULL) { - return NULL; + parent_pointer = cJSONUtils_strdup(path); + if (parent_pointer == NULL) { + goto cleanup; } - childptr = (unsigned char*)strrchr((char*)parentptr, '/'); /* last '/' */ - if (childptr == NULL) + child_pointer = (unsigned char*)strrchr((char*)parent_pointer, '/'); /* last '/' */ + if (child_pointer == NULL) { - cJSON_free(parentptr); - return NULL; + goto cleanup; } /* split strings */ - *childptr++ = '\0'; + child_pointer[0] = '\0'; + child_pointer++; - parent = cJSONUtils_GetPointer(object, (char*)parentptr); - cJSONUtils_InplaceDecodePointerString(childptr); + parent = cJSONUtils_GetPointer(object, (char*)parent_pointer); + cJSONUtils_InplaceDecodePointerString(child_pointer); - if (!parent) - { - /* Couldn't find object to remove child from. */ - ret = NULL; - } - else if (cJSON_IsArray(parent)) + if (cJSON_IsArray(parent)) { size_t index = 0; - if (!decode_array_index_from_pointer(childptr, &index)) + if (!decode_array_index_from_pointer(child_pointer, &index)) { - cJSON_free(parentptr); - return NULL; + goto cleanup; } - ret = detach_item_from_array(parent, index); + detached_item = detach_item_from_array(parent, index); } else if (cJSON_IsObject(parent)) { - ret = cJSON_DetachItemFromObject(parent, (char*)childptr); + detached_item = cJSON_DetachItemFromObject(parent, (char*)child_pointer); + } + else + { + /* Couldn't find object to remove child from. */ + goto cleanup; + } + +cleanup: + if (parent_pointer != NULL) + { + cJSON_free(parent_pointer); } - cJSON_free(parentptr); - /* return the detachted item */ - return ret; + return detached_item; } static int cJSONUtils_Compare(cJSON *a, cJSON *b) From 63db67bfeb68d4107fb3366369daeff1d99ffaa7 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 13:06:09 +0200 Subject: [PATCH 081/126] refactor cJSONUtils_Compare --- cJSON_Utils.c | 64 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 38f81c31..ff08007a 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -416,49 +416,79 @@ static int cJSONUtils_Compare(cJSON *a, cJSON *b) { case cJSON_Number: /* numeric mismatch. */ - return ((a->valueint != b->valueint) || (a->valuedouble != b->valuedouble)) ? -2 : 0; + if ((a->valueint != b->valueint) || (a->valuedouble != b->valuedouble)) + { + return -2; + } + else + { + return 0; + } + case cJSON_String: /* string mismatch. */ - return (strcmp(a->valuestring, b->valuestring) != 0) ? -3 : 0; + if (strcmp(a->valuestring, b->valuestring) != 0) + { + return -3; + } + else + { + return 0; + } + case cJSON_Array: - for ((void)(a = a->child), b = b->child; a && b; (void)(a = a->next), b = b->next) + for ((void)(a = a->child), b = b->child; (a != NULL) && (b != NULL); (void)(a = a->next), b = b->next) { - int err = cJSONUtils_Compare(a, b); - if (err) + int status = cJSONUtils_Compare(a, b); + if (status != 0) { - return err; + return status; } } + /* array size mismatch? (one of both children is not NULL) */ - return (a || b) ? -4 : 0; + if ((a != NULL) || (b != NULL)) + { + return -4; + } + else + { + return 0; + } + case cJSON_Object: cJSONUtils_SortObject(a); cJSONUtils_SortObject(b); - a = a->child; - b = b->child; - while (a && b) + for ((void)(a = a->child), b = b->child; (a != NULL) && (b != NULL); (void)(a = a->next), b = b->next) { - int err = 0; + int status = 0; /* compare object keys */ if (cJSONUtils_strcasecmp((unsigned char*)a->string, (unsigned char*)b->string)) { /* missing member */ return -6; } - err = cJSONUtils_Compare(a, b); - if (err) + status = cJSONUtils_Compare(a, b); + if (status != 0) { - return err; + return status; } - a = a->next; - b = b->next; } + /* object length mismatch (one of both children is not null) */ - return (a || b) ? -5 : 0; + if ((a != NULL) || (b != NULL)) + { + return -5; + } + else + { + return 0; + } default: break; } + /* null, true or false */ return 0; } From 48c97985d6986b72e551f2ad7fb65d209879244c Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 13:11:14 +0200 Subject: [PATCH 082/126] refactor cJSONUtils_ApplyPatch --- cJSON_Utils.c | 253 ++++++++++++++++++++++++++++---------------------- 1 file changed, 143 insertions(+), 110 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index ff08007a..04c9819a 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -533,54 +533,100 @@ static cJSON_bool insert_item_in_array(cJSON *array, size_t which, cJSON *newite enum patch_operation { INVALID, ADD, REMOVE, REPLACE, MOVE, COPY, TEST }; -static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) +static enum patch_operation decode_patch_operation(const cJSON * const patch) { - cJSON *op = NULL; - cJSON *path = NULL; - cJSON *value = NULL; - cJSON *parent = NULL; - enum patch_operation opcode = INVALID; - unsigned char *parentptr = NULL; - unsigned char *childptr = NULL; + cJSON *operation = cJSON_GetObjectItem(patch, "op"); + if (!cJSON_IsString(operation)) + { + return INVALID; + } - op = cJSON_GetObjectItem(patch, "op"); - path = cJSON_GetObjectItem(patch, "path"); - if (!cJSON_IsString(op) || !cJSON_IsString(path)) + if (strcmp(operation->valuestring, "add") == 0) { - /* malformed patch. */ - return 2; + return ADD; } - /* decode operation */ - if (!strcmp(op->valuestring, "add")) + if (strcmp(operation->valuestring, "remove") == 0) { - opcode = ADD; + return REMOVE; } - else if (!strcmp(op->valuestring, "remove")) + + if (strcmp(operation->valuestring, "replace") == 0) { - opcode = REMOVE; + return REPLACE; } - else if (!strcmp(op->valuestring, "replace")) + + if (strcmp(operation->valuestring, "move") == 0) { - opcode = REPLACE; + return MOVE; } - else if (!strcmp(op->valuestring, "move")) + + if (strcmp(operation->valuestring, "copy") == 0) { - opcode = MOVE; + return COPY; } - else if (!strcmp(op->valuestring, "copy")) + + if (strcmp(operation->valuestring, "test") == 0) { - opcode = COPY; + return TEST; } - else if (!strcmp(op->valuestring, "test")) + + return INVALID; +} + +/* overwrite and existing item with another one and free resources on the way */ +static void overwrite_item(cJSON * const root, const cJSON replacement) +{ + if (root == NULL) { - /* compare value: {...} with the given path */ - return cJSONUtils_Compare(cJSONUtils_GetPointer(object, path->valuestring), cJSON_GetObjectItem(patch, "value")); + return; } - else + + if (root->string != NULL) + { + cJSON_free(root->string); + } + if (root->valuestring != NULL) + { + cJSON_free(root->valuestring); + } + if (root->child != NULL) + { + cJSON_Delete(root->child); + } + + memcpy(root, &replacement, sizeof(cJSON)); +} + +static int cJSONUtils_ApplyPatch(cJSON *object, const cJSON *patch) +{ + cJSON *path = NULL; + cJSON *value = NULL; + cJSON *parent = NULL; + enum patch_operation opcode = INVALID; + unsigned char *parent_pointer = NULL; + unsigned char *child_pointer = NULL; + int status = 0; + + path = cJSON_GetObjectItem(patch, "path"); + if (!cJSON_IsString(path)) { - /* unknown opcode. */ - return 3; + /* malformed patch. */ + status = 2; + goto cleanup; + } + + opcode = decode_patch_operation(patch); + if (opcode == INVALID) + { + status = 3; + goto cleanup; + } + else if (opcode == TEST) + { + /* compare value: {...} with the given path */ + status = cJSONUtils_Compare(cJSONUtils_GetPointer(object, path->valuestring), cJSON_GetObjectItem(patch, "value")); + goto cleanup; } /* special case for replacing the root */ @@ -588,73 +634,47 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) { if (opcode == REMOVE) { - /* remove possible children */ - if (object->child != NULL) - { - cJSON_Delete(object->child); - } + static const cJSON invalid = { NULL, NULL, NULL, cJSON_Invalid, NULL, 0, 0, NULL}; - /* remove other allocated resources */ - if (object->string != NULL) - { - cJSON_free(object->string); - } - if (object->valuestring != NULL) - { - cJSON_free(object->valuestring); - } - - /* make it invalid */ - memset(object, '\0', sizeof(cJSON)); + overwrite_item(object, invalid); - return 0; + status = 0; + goto cleanup; } if ((opcode == REPLACE) || (opcode == ADD)) { - /* remove possible children */ - if (object->child != NULL) - { - cJSON_Delete(object->child); - } - - /* remove other allocated resources */ - if (object->string != NULL) - { - cJSON_free(object->string); - } - if (object->valuestring != NULL) - { - cJSON_free(object->valuestring); - } - value = cJSON_GetObjectItem(patch, "value"); if (value == NULL) { /* missing "value" for add/replace. */ - return 7; + status = 7; + goto cleanup; } value = cJSON_Duplicate(value, 1); if (value == NULL) { /* out of memory for add/replace. */ - return 8; - } - /* the string "value" isn't needed */ - if (value->string != NULL) - { - cJSON_free(value->string); - value->string = NULL; + status = 8; + goto cleanup; } - /* copy over the value object */ - memcpy(object, value, sizeof(cJSON)); + overwrite_item(object, *value); /* delete the duplicated value */ cJSON_free(value); + value = NULL; - return 0; + /* the string "value" isn't needed */ + if (object->string != NULL) + { + cJSON_free(object->string); + object->string = NULL; + } + + status = 0; + goto cleanup; } } @@ -664,13 +684,15 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) cJSON *old_item = cJSONUtils_PatchDetach(object, (unsigned char*)path->valuestring); if (old_item == NULL) { - return 13; + status = 13; + goto cleanup; } cJSON_Delete(old_item); if (opcode == REMOVE) { /* For Remove, this job is done. */ - return 0; + status = 0; + goto cleanup; } } @@ -678,10 +700,11 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) if ((opcode == MOVE) || (opcode == COPY)) { cJSON *from = cJSON_GetObjectItem(patch, "from"); - if (!from) + if (from == NULL) { /* missing "from" for copy/move. */ - return 4; + status = 4; + goto cleanup; } if (opcode == MOVE) @@ -692,93 +715,103 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch) { value = cJSONUtils_GetPointer(object, from->valuestring); } - if (!value) + if (value == NULL) { /* missing "from" for copy/move. */ - return 5; + status = 5; + goto cleanup; } if (opcode == COPY) { value = cJSON_Duplicate(value, 1); } - if (!value) + if (value == NULL) { /* out of memory for copy/move. */ - return 6; + status = 6; + goto cleanup; } } else /* Add/Replace uses "value". */ { value = cJSON_GetObjectItem(patch, "value"); - if (!value) + if (value == NULL) { /* missing "value" for add/replace. */ - return 7; + status = 7; + goto cleanup; } value = cJSON_Duplicate(value, 1); - if (!value) + if (value == NULL) { /* out of memory for add/replace. */ - return 8; + status = 8; + goto cleanup; } } /* Now, just add "value" to "path". */ /* split pointer in parent and child */ - parentptr = cJSONUtils_strdup((unsigned char*)path->valuestring); - childptr = (unsigned char*)strrchr((char*)parentptr, '/'); - if (childptr) + parent_pointer = cJSONUtils_strdup((unsigned char*)path->valuestring); + child_pointer = (unsigned char*)strrchr((char*)parent_pointer, '/'); + if (child_pointer != NULL) { - *childptr++ = '\0'; + child_pointer[0] = '\0'; + child_pointer++; } - parent = cJSONUtils_GetPointer(object, (char*)parentptr); - cJSONUtils_InplaceDecodePointerString(childptr); + parent = cJSONUtils_GetPointer(object, (char*)parent_pointer); + cJSONUtils_InplaceDecodePointerString(child_pointer); /* add, remove, replace, move, copy, test. */ - if ((parent == NULL) || (childptr == NULL)) + if ((parent == NULL) || (child_pointer == NULL)) { /* Couldn't find object to add to. */ - free(parentptr); - cJSON_Delete(value); - return 9; + status = 9; + goto cleanup; } else if (cJSON_IsArray(parent)) { - if (!strcmp((char*)childptr, "-")) + if (strcmp((char*)child_pointer, "-") == 0) { cJSON_AddItemToArray(parent, value); + value = NULL; } else { size_t index = 0; - if (!decode_array_index_from_pointer(childptr, &index)) + if (!decode_array_index_from_pointer(child_pointer, &index)) { - free(parentptr); - cJSON_Delete(value); - return 11; + status = 11; + goto cleanup; } if (!insert_item_in_array(parent, index, value)) { - free(parentptr); - cJSON_Delete(value); - return 10; + status = 10; + goto cleanup; } + value = NULL; } } else if (cJSON_IsObject(parent)) { - cJSON_DeleteItemFromObject(parent, (char*)childptr); - cJSON_AddItemToObject(parent, (char*)childptr, value); + cJSON_DeleteItemFromObject(parent, (char*)child_pointer); + cJSON_AddItemToObject(parent, (char*)child_pointer, value); + value = NULL; } - else + +cleanup: + if (value != NULL) { cJSON_Delete(value); } - free(parentptr); + if (parent_pointer != NULL) + { + cJSON_free(parent_pointer); + } - return 0; + return status; } CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON *object, cJSON *patches) From bde341edd883de4978c78c97b510a40e54182aab Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 13:12:32 +0200 Subject: [PATCH 083/126] refactor cJSONUtils_ApplyPatches --- cJSON_Utils.c | 20 ++++++++++++-------- cJSON_Utils.h | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 04c9819a..8a1e14a1 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -814,26 +814,30 @@ static int cJSONUtils_ApplyPatch(cJSON *object, const cJSON *patch) return status; } -CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON *object, cJSON *patches) +CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * const patches) { - int err = 0; + const cJSON *current_patch = NULL; + int status = 0; if (!cJSON_IsArray(patches)) { /* malformed patches. */ return 1; } - if (patches) + + if (patches != NULL) { - patches = patches->child; + current_patch = patches->child; } - while (patches) + + while (current_patch != NULL) { - if ((err = cJSONUtils_ApplyPatch(object, patches))) + status = cJSONUtils_ApplyPatch(object, current_patch); + if (status != 0) { - return err; + return status; } - patches = patches->next; + current_patch = current_patch->next; } return 0; diff --git a/cJSON_Utils.h b/cJSON_Utils.h index 8952645a..572ab93e 100644 --- a/cJSON_Utils.h +++ b/cJSON_Utils.h @@ -30,7 +30,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON *from, cJSON *to); /* Utility for generating patch array entries. */ CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON *array, const char *op, const char *path, cJSON *val); /* Returns 0 for success. */ -CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON *object, cJSON *patches); +CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * const patches); /* // Note that ApplyPatches is NOT atomic on failure. To implement an atomic ApplyPatches, use: From e591d4173adffcc7a794ef93fc624207992f6af2 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 13:12:57 +0200 Subject: [PATCH 084/126] refactor cJSONUtils_GeneratePatch --- cJSON_Utils.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 8a1e14a1..a7061636 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -843,24 +843,35 @@ CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * co return 0; } -static void cJSONUtils_GeneratePatch(cJSON *patches, const unsigned char *op, const unsigned char *path, const unsigned char *suffix, cJSON *val) +static void cJSONUtils_GeneratePatch(cJSON * const patches, const unsigned char * const operation, const unsigned char * const path, const unsigned char *suffix, const cJSON * const value) { cJSON *patch = cJSON_CreateObject(); - cJSON_AddItemToObject(patch, "op", cJSON_CreateString((const char*)op)); - if (suffix) + if (patch == NULL) { - unsigned char *newpath = (unsigned char*)cJSON_malloc(strlen((const char*)path) + cJSONUtils_PointerEncodedstrlen(suffix) + 2); - cJSONUtils_PointerEncodedstrcpy(newpath + sprintf((char*)newpath, "%s/", (const char*)path), suffix); - cJSON_AddItemToObject(patch, "path", cJSON_CreateString((const char*)newpath)); - free(newpath); + return; } - else + cJSON_AddItemToObject(patch, "op", cJSON_CreateString((const char*)operation)); + + if (suffix == NULL) { cJSON_AddItemToObject(patch, "path", cJSON_CreateString((const char*)path)); } - if (val) + else + { + size_t suffix_length = cJSONUtils_PointerEncodedstrlen(suffix); + size_t path_length = strlen((const char*)path); + unsigned char *full_path = (unsigned char*)cJSON_malloc(path_length + suffix_length + sizeof("/")); + + sprintf((char*)full_path, "%s/", (const char*)path); + cJSONUtils_PointerEncodedstrcpy(full_path + path_length + 1, suffix); + + cJSON_AddItemToObject(patch, "path", cJSON_CreateString((const char*)full_path)); + free(full_path); + } + + if (value != NULL) { - cJSON_AddItemToObject(patch, "value", cJSON_Duplicate(val, 1)); + cJSON_AddItemToObject(patch, "value", cJSON_Duplicate(value, 1)); } cJSON_AddItemToArray(patches, patch); } From 512c313111194e446ff22067bea47e9483e97999 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 13:13:17 +0200 Subject: [PATCH 085/126] refactor cJSONUtils_AddPatchToArray --- cJSON_Utils.c | 4 ++-- cJSON_Utils.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index a7061636..a96045c1 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -876,9 +876,9 @@ static void cJSONUtils_GeneratePatch(cJSON * const patches, const unsigned char cJSON_AddItemToArray(patches, patch); } -CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON *array, const char *op, const char *path, cJSON *val) +CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * const operation, const char * const path, const cJSON * const value) { - cJSONUtils_GeneratePatch(array, (const unsigned char*)op, (const unsigned char*)path, 0, val); + cJSONUtils_GeneratePatch(array, (const unsigned char*)operation, (const unsigned char*)path, NULL, value); } static void cJSONUtils_CompareToPatch(cJSON *patches, const unsigned char *path, cJSON *from, cJSON *to) diff --git a/cJSON_Utils.h b/cJSON_Utils.h index 572ab93e..0d90cd6e 100644 --- a/cJSON_Utils.h +++ b/cJSON_Utils.h @@ -28,7 +28,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *po /* Implement RFC6902 (https://tools.ietf.org/html/rfc6902) JSON Patch spec. */ CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON *from, cJSON *to); /* Utility for generating patch array entries. */ -CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON *array, const char *op, const char *path, cJSON *val); +CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * const operation, const char * const path, const cJSON * const value); /* Returns 0 for success. */ CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * const patches); From a67c24c451062cc34f20af356034223176546713 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 13:14:29 +0200 Subject: [PATCH 086/126] refactor cJSONUtils_CompareToPatch --- cJSON_Utils.c | 99 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 62 insertions(+), 37 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index a96045c1..575d9fe0 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -881,7 +881,7 @@ CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * cJSONUtils_GeneratePatch(array, (const unsigned char*)operation, (const unsigned char*)path, NULL, value); } -static void cJSONUtils_CompareToPatch(cJSON *patches, const unsigned char *path, cJSON *from, cJSON *to) +static void cJSONUtils_CompareToPatch(cJSON * const patches, const unsigned char * const path, cJSON * const from, cJSON * const to) { if ((from == NULL) || (to == NULL)) { @@ -894,98 +894,123 @@ static void cJSONUtils_CompareToPatch(cJSON *patches, const unsigned char *path, return; } - switch ((from->type & 0xFF)) + switch (from->type & 0xFF) { case cJSON_Number: if ((from->valueint != to->valueint) || (from->valuedouble != to->valuedouble)) { - cJSONUtils_GeneratePatch(patches, (const unsigned char*)"replace", path, 0, to); + cJSONUtils_GeneratePatch(patches, (const unsigned char*)"replace", path, NULL, to); } return; case cJSON_String: if (strcmp(from->valuestring, to->valuestring) != 0) { - cJSONUtils_GeneratePatch(patches, (const unsigned char*)"replace", path, 0, to); + cJSONUtils_GeneratePatch(patches, (const unsigned char*)"replace", path, NULL, to); } return; case cJSON_Array: { - size_t c = 0; - unsigned char *newpath = (unsigned char*)cJSON_malloc(strlen((const char*)path) + 23); /* Allow space for 64bit int. */ - /* generate patches for all array elements that exist in "from" and "to" */ - for ((void)(c = 0), (void)(from = from->child), to = to->child; from && to; (void)(from = from->next), (void)(to = to->next), c++) + size_t index = 0; + cJSON *from_child = from->child; + cJSON *to_child = to->child; + unsigned char *new_path = (unsigned char*)cJSON_malloc(strlen((const char*)path) + 20 + sizeof("/")); /* Allow space for 64bit int. log10(2^64) = 20 */ + + /* generate patches for all array elements that exist in both "from" and "to" */ + for (index = 0; (from_child != NULL) && (to_child != NULL); (void)(from_child = from_child->next), (void)(to_child = to_child->next), index++) { /* check if conversion to unsigned long is valid * This should be eliminated at compile time by dead code elimination * if size_t is an alias of unsigned long, or if it is bigger */ - if (c > ULONG_MAX) + if (index > ULONG_MAX) { - free(newpath); + free(new_path); return; } - sprintf((char*)newpath, "%s/%lu", path, (unsigned long)c); /* path of the current array element */ - cJSONUtils_CompareToPatch(patches, newpath, from, to); + sprintf((char*)new_path, "%s/%lu", path, (unsigned long)index); /* path of the current array element */ + cJSONUtils_CompareToPatch(patches, new_path, from_child, to_child); } + /* remove leftover elements from 'from' that are not in 'to' */ - for (; from; (void)(from = from->next)) + for (; (from_child != NULL); (void)(from_child = from_child->next)) { /* check if conversion to unsigned long is valid * This should be eliminated at compile time by dead code elimination * if size_t is an alias of unsigned long, or if it is bigger */ - if (c > ULONG_MAX) + if (index > ULONG_MAX) { - free(newpath); + free(new_path); return; } - sprintf((char*)newpath, "%lu", (unsigned long)c); - cJSONUtils_GeneratePatch(patches, (const unsigned char*)"remove", path, newpath, 0); + sprintf((char*)new_path, "%lu", (unsigned long)index); + cJSONUtils_GeneratePatch(patches, (const unsigned char*)"remove", path, new_path, NULL); } /* add new elements in 'to' that were not in 'from' */ - for (; to; (void)(to = to->next), c++) + for (; (to_child != NULL); (void)(to_child = to_child->next), index++) { - cJSONUtils_GeneratePatch(patches, (const unsigned char*)"add", path, (const unsigned char*)"-", to); + cJSONUtils_GeneratePatch(patches, (const unsigned char*)"add", path, (const unsigned char*)"-", to_child); } - free(newpath); + free(new_path); return; } case cJSON_Object: { - cJSON *a = NULL; - cJSON *b = NULL; + cJSON *from_child = NULL; + cJSON *to_child = NULL; cJSONUtils_SortObject(from); cJSONUtils_SortObject(to); - a = from->child; - b = to->child; + from_child = from->child; + to_child = to->child; /* for all object values in the object with more of them */ - while (a || b) + while ((from_child != NULL) || (to_child != NULL)) { - int diff = (!a) ? 1 : ((!b) ? -1 : cJSONUtils_strcasecmp((unsigned char*)a->string, (unsigned char*)b->string)); - if (!diff) + int diff; + if (from_child == NULL) + { + diff = 1; + } + else if (to_child == NULL) + { + diff = -1; + } + else + { + diff = cJSONUtils_strcasecmp((unsigned char*)from_child->string, (unsigned char*)to_child->string); + } + + if (diff == 0) { /* both object keys are the same */ - unsigned char *newpath = (unsigned char*)cJSON_malloc(strlen((const char*)path) + cJSONUtils_PointerEncodedstrlen((unsigned char*)a->string) + 2); - cJSONUtils_PointerEncodedstrcpy(newpath + sprintf((char*)newpath, "%s/", path), (unsigned char*)a->string); + size_t path_length = strlen((const char*)path); + size_t from_child_name_length = cJSONUtils_PointerEncodedstrlen((unsigned char*)from_child->string); + unsigned char *new_path = (unsigned char*)cJSON_malloc(path_length + from_child_name_length + sizeof("/")); + + sprintf((char*)new_path, "%s/", path); + cJSONUtils_PointerEncodedstrcpy(new_path + path_length + 1, (unsigned char*)from_child->string); + /* create a patch for the element */ - cJSONUtils_CompareToPatch(patches, newpath, a, b); - free(newpath); - a = a->next; - b = b->next; + cJSONUtils_CompareToPatch(patches, new_path, from_child, to_child); + free(new_path); + + from_child = from_child->next; + to_child = to_child->next; } else if (diff < 0) { /* object element doesn't exist in 'to' --> remove it */ - cJSONUtils_GeneratePatch(patches, (const unsigned char*)"remove", path, (unsigned char*)a->string, 0); - a = a->next; + cJSONUtils_GeneratePatch(patches, (const unsigned char*)"remove", path, (unsigned char*)from_child->string, NULL); + + from_child = from_child->next; } else { /* object element doesn't exist in 'from' --> add it */ - cJSONUtils_GeneratePatch(patches, (const unsigned char*)"add", path, (unsigned char*)b->string, b); - b = b->next; + cJSONUtils_GeneratePatch(patches, (const unsigned char*)"add", path, (unsigned char*)to_child->string, to_child); + + to_child = to_child->next; } } return; From f030058183241d78e0d2fce775edae2f008352a4 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 13:15:18 +0200 Subject: [PATCH 087/126] refactor cJSONUtils_GeneratePatches --- cJSON_Utils.c | 2 +- cJSON_Utils.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 575d9fe0..032c2852 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -1021,7 +1021,7 @@ static void cJSONUtils_CompareToPatch(cJSON * const patches, const unsigned char } } -CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON *from, cJSON *to) +CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON * const from, cJSON * const to) { cJSON *patches = cJSON_CreateArray(); cJSONUtils_CompareToPatch(patches, (const unsigned char*)"", from, to); diff --git a/cJSON_Utils.h b/cJSON_Utils.h index 0d90cd6e..88898eea 100644 --- a/cJSON_Utils.h +++ b/cJSON_Utils.h @@ -26,7 +26,8 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *pointer); /* Implement RFC6902 (https://tools.ietf.org/html/rfc6902) JSON Patch spec. */ -CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON *from, cJSON *to); +/* 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); /* Utility for generating patch array entries. */ CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * const operation, const char * const path, const cJSON * const value); /* Returns 0 for success. */ From 7bf62ff4dc53ddf13773918cbd408ae0a049c712 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 13:16:30 +0200 Subject: [PATCH 088/126] refactor cJSONUtils_SortList --- cJSON_Utils.c | 104 ++++++++++++++++++++++++++------------------------ 1 file changed, 54 insertions(+), 50 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 032c2852..1b87d1be 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -1034,39 +1034,41 @@ static cJSON *cJSONUtils_SortList(cJSON *list) { cJSON *first = list; cJSON *second = list; - cJSON *ptr = list; + cJSON *current_item = list; + cJSON *result = list; + cJSON *result_tail = NULL; - if (!list || !list->next) + if ((list == NULL) || (list->next == NULL)) { /* One entry is sorted already. */ - return list; + return result; } - while (ptr && ptr->next && (cJSONUtils_strcasecmp((unsigned char*)ptr->string, (unsigned char*)ptr->next->string) < 0)) + while ((current_item != NULL) && (current_item->next != NULL) && (cJSONUtils_strcasecmp((unsigned char*)current_item->string, (unsigned char*)current_item->next->string) < 0)) { /* Test for list sorted. */ - ptr = ptr->next; + current_item = current_item->next; } - if (!ptr || !ptr->next) + if ((current_item == NULL) || (current_item->next == NULL)) { /* Leave sorted lists unmodified. */ - return list; + return result; } - /* reset ptr to the beginning */ - ptr = list; - while (ptr) + /* reset pointer to the beginning */ + current_item = list; + while (current_item != NULL) { /* Walk two pointers to find the middle. */ second = second->next; - ptr = ptr->next; - /* advances ptr two steps at a time */ - if (ptr) + current_item = current_item->next; + /* advances current_item two steps at a time */ + if (current_item != NULL) { - ptr = ptr->next; + current_item = current_item->next; } } - if (second && second->prev) + if ((second != NULL) && (second->prev != NULL)) { /* Split the lists */ second->prev->next = NULL; @@ -1075,65 +1077,67 @@ static cJSON *cJSONUtils_SortList(cJSON *list) /* Recursively sort the sub-lists. */ first = cJSONUtils_SortList(first); second = cJSONUtils_SortList(second); - list = ptr = NULL; + result = NULL; - while (first && second) /* Merge the sub-lists */ + /* Merge the sub-lists */ + while ((first != NULL) && (second != NULL)) { + cJSON *smaller = NULL; if (cJSONUtils_strcasecmp((unsigned char*)first->string, (unsigned char*)second->string) < 0) { - if (!list) - { - /* start merged list with the first element of the first list */ - list = ptr = first; - } - else - { - /* add first element of first list to merged list */ - ptr->next = first; - first->prev = ptr; - ptr = first; - } + smaller = first; + } + else + { + smaller = second; + } + + if (result == NULL) + { + /* start merged list with the smaller element */ + result_tail = smaller; + result = smaller; + } + else + { + /* add smaller element to the list */ + result_tail->next = smaller; + smaller->prev = result_tail; + result_tail = smaller; + } + + if (first == smaller) + { first = first->next; } else { - if (!list) - { - /* start merged list with the first element of the second list */ - list = ptr = second; - } - else - { - /* add first element of second list to merged list */ - ptr->next = second; - second->prev = ptr; - ptr = second; - } second = second->next; } } - if (first) + + if (first != NULL) { /* Append rest of first list. */ - if (!list) + if (result == NULL) { return first; } - ptr->next = first; - first->prev = ptr; + result_tail->next = first; + first->prev = result_tail; } - if (second) + if (second != NULL) { /* Append rest of second list */ - if (!list) + if (result == NULL) { return second; } - ptr->next = second; - second->prev = ptr; + result_tail->next = second; + second->prev = result_tail; } - return list; + return result; } CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON *object) From 01d656bebcbe43a61442030a0d1833eff1a0edef Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 13:16:58 +0200 Subject: [PATCH 089/126] refactor cJSONUtils_SortObject --- cJSON_Utils.c | 2 +- cJSON_Utils.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 1b87d1be..2f131a89 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -1140,7 +1140,7 @@ static cJSON *cJSONUtils_SortList(cJSON *list) return result; } -CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON *object) +CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object) { object->child = cJSONUtils_SortList(object->child); } diff --git a/cJSON_Utils.h b/cJSON_Utils.h index 88898eea..d7234bbe 100644 --- a/cJSON_Utils.h +++ b/cJSON_Utils.h @@ -64,4 +64,4 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON *from, cJSON *to); CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const object, const cJSON * const target); /* Sorts the members of the object into alphabetical order. */ -CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON *object); +CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object); From 11b8a8cd76e2541505e07dd11f84ed3571a2f373 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 13:17:39 +0200 Subject: [PATCH 090/126] refactor cJSONUtils_MergePatch --- cJSON_Utils.c | 18 ++++++++++-------- cJSON_Utils.h | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 2f131a89..85238b18 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -1145,8 +1145,10 @@ CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object) object->child = cJSONUtils_SortList(object->child); } -CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, cJSON *patch) +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch) { + cJSON *patch_child = NULL; + if (!cJSON_IsObject(patch)) { /* scalar value, array or NULL, just duplicate */ @@ -1160,20 +1162,20 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, cJSON *patch) target = cJSON_CreateObject(); } - patch = patch->child; - while (patch) + patch_child = patch->child; + while (patch_child != NULL) { - if (cJSON_IsNull(patch)) + if (cJSON_IsNull(patch_child)) { /* NULL is the indicator to remove a value, see RFC7396 */ - cJSON_DeleteItemFromObject(target, patch->string); + cJSON_DeleteItemFromObject(target, patch_child->string); } else { - cJSON *replaceme = cJSON_DetachItemFromObject(target, patch->string); - cJSON_AddItemToObject(target, patch->string, cJSONUtils_MergePatch(replaceme, patch)); + cJSON *replace_me = cJSON_DetachItemFromObject(target, patch_child->string); + cJSON_AddItemToObject(target, patch_child->string, cJSONUtils_MergePatch(replace_me, patch_child)); } - patch = patch->next; + patch_child = patch_child->next; } return target; } diff --git a/cJSON_Utils.h b/cJSON_Utils.h index d7234bbe..a7358625 100644 --- a/cJSON_Utils.h +++ b/cJSON_Utils.h @@ -56,7 +56,7 @@ CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * co /* Implement RFC7386 (https://tools.ietf.org/html/rfc7396) JSON Merge Patch spec. */ /* target will be modified by patch. return value is new ptr for target. */ -CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, cJSON *patch); +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch); /* generates a patch to move from -> to */ CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON *from, cJSON *to); From bb2f86812680c2cb489a38f3643fb58f4eb3482c Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 13:18:25 +0200 Subject: [PATCH 091/126] refactor cJSONUtils_GenerateMergePatch --- cJSON_Utils.c | 56 +++++++++++++++++++++++++++++++++++---------------- cJSON_Utils.h | 3 ++- 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 85238b18..50463286 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -1180,10 +1180,12 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const p return target; } -CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON *from, cJSON *to) +CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * const to) { + cJSON *from_child = NULL; + cJSON *to_child = NULL; cJSON *patch = NULL; - if (!to) + if (to == NULL) { /* patch to delete everything */ return cJSON_CreateNull(); @@ -1196,39 +1198,59 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON *from, cJSON *to) cJSONUtils_SortObject(from); cJSONUtils_SortObject(to); - from = from->child; - to = to->child; + from_child = from->child; + to_child = to->child; patch = cJSON_CreateObject(); - while (from || to) + while (from_child || to_child) { - int compare = from ? (to ? strcmp(from->string, to->string) : -1) : 1; - if (compare < 0) + int diff; + if (from_child != NULL) + { + if (to_child != NULL) + { + diff = strcmp(from_child->string, to_child->string); + } + else + { + diff = -1; + } + } + else + { + diff = 1; + } + + if (diff < 0) { /* from has a value that to doesn't have -> remove */ - cJSON_AddItemToObject(patch, from->string, cJSON_CreateNull()); - from = from->next; + cJSON_AddItemToObject(patch, from_child->string, cJSON_CreateNull()); + + from_child = from_child->next; } - else if (compare > 0) + else if (diff > 0) { /* to has a value that from doesn't have -> add to patch */ - cJSON_AddItemToObject(patch, to->string, cJSON_Duplicate(to, 1)); - to = to->next; + cJSON_AddItemToObject(patch, to_child->string, cJSON_Duplicate(to_child, 1)); + + to_child = to_child->next; } else { /* object key exists in both objects */ - if (cJSONUtils_Compare(from, to)) + if (cJSONUtils_Compare(from_child, to_child)) { /* not identical --> generate a patch */ - cJSON_AddItemToObject(patch, to->string, cJSONUtils_GenerateMergePatch(from, to)); + cJSON_AddItemToObject(patch, to_child->string, cJSONUtils_GenerateMergePatch(from_child, to_child)); } + /* next key in the object */ - from = from->next; - to = to->next; + from_child = from_child->next; + to_child = to_child->next; } } - if (!patch->child) + if (patch->child == NULL) { + /* no patch generated */ cJSON_Delete(patch); return NULL; } diff --git a/cJSON_Utils.h b/cJSON_Utils.h index a7358625..b20e5db0 100644 --- a/cJSON_Utils.h +++ b/cJSON_Utils.h @@ -58,7 +58,8 @@ CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * co /* target will be modified by patch. return value is new ptr for target. */ CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch); /* generates a patch to move from -> to */ -CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON *from, cJSON *to); +/* 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); /* Given a root object and a target object, construct a pointer from one to the other. */ CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const object, const cJSON * const target); From b73881a388c85a86ad75a4be68bc31007c79d731 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 14:19:01 +0200 Subject: [PATCH 092/126] cJSON_Utils: Add true/false --- cJSON_Utils.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 50463286..ad2805c8 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -30,6 +30,10 @@ #include "cJSON_Utils.h" +/* define our own boolean type */ +#define true ((cJSON_bool)1) +#define false ((cJSON_bool)0) + static unsigned char* cJSONUtils_strdup(const unsigned char* const string) { size_t length = 0; From 6b01dee7ca0b67e0493687f0ba18605166df22ff Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 14:19:52 +0200 Subject: [PATCH 093/126] Rename cJSONUtils_Pstrcasecmp to case_insensitive_pointer_comparison Also changes the return type to cJSON_bool --- cJSON_Utils.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index ad2805c8..6c2e9568 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -75,11 +75,11 @@ static int cJSONUtils_strcasecmp(const unsigned char *string1, const unsigned ch } /* Compare the next path element of two JSON pointers, two NULL pointers are considered unequal: */ -static int cJSONUtils_Pstrcasecmp(const unsigned char *name, const unsigned char *pointer) +static cJSON_bool case_insensitive_pointer_comparison(const unsigned char *name, const unsigned char *pointer) { if ((name == NULL) || (pointer == NULL)) { - return 1; + return false; } for (; (*name != '\0') && (*pointer != '\0') && (*pointer != '/'); (void)name++, pointer++) /* compare until next '/' */ @@ -90,7 +90,7 @@ static int cJSONUtils_Pstrcasecmp(const unsigned char *name, const unsigned char if (((pointer[1] != '0') || (*name != '~')) && ((pointer[1] != '1') || (*name != '/'))) { /* invalid escape sequence or wrong character in *name */ - return 1; + return false; } else { @@ -99,16 +99,16 @@ static int cJSONUtils_Pstrcasecmp(const unsigned char *name, const unsigned char } else if (tolower(*name) != tolower(*pointer)) { - return 1; + return false; } } if (((*pointer != 0) && (*pointer != '/')) != (*name != 0)) { /* one string has ended, the other not */ - return 1; + return false;; } - return 0; + return true; } /* calculate the length of a string if encoded as JSON pointer with ~0 and ~1 escape sequences */ @@ -270,7 +270,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *po { current_element = current_element->child; /* GetObjectItem. */ - while ((current_element != NULL) && cJSONUtils_Pstrcasecmp((unsigned char*)current_element->string, (const unsigned char*)pointer)) + while ((current_element != NULL) && !case_insensitive_pointer_comparison((unsigned char*)current_element->string, (const unsigned char*)pointer)) { current_element = current_element->next; } From e3ed64d56e934494a5edcc3f62f4597b05306325 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 14:24:01 +0200 Subject: [PATCH 094/126] cJSON_PointerEncodedstrlen -> pointer_encoded_length --- cJSON_Utils.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 6c2e9568..5847358d 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -112,7 +112,7 @@ static cJSON_bool case_insensitive_pointer_comparison(const unsigned char *name, } /* calculate the length of a string if encoded as JSON pointer with ~0 and ~1 escape sequences */ -static size_t cJSONUtils_PointerEncodedstrlen(const unsigned char *string) +static size_t pointer_encoded_length(const unsigned char *string) { size_t length; for (length = 0; *string != '\0'; (void)string++, length++) @@ -190,7 +190,7 @@ CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const obje if (cJSON_IsObject(object)) { - unsigned char *full_pointer = (unsigned char*)cJSON_malloc(strlen((char*)target_pointer) + cJSONUtils_PointerEncodedstrlen((unsigned char*)current_child->string) + 2); + unsigned char *full_pointer = (unsigned char*)cJSON_malloc(strlen((char*)target_pointer) + pointer_encoded_length((unsigned char*)current_child->string) + 2); full_pointer[0] = '/'; cJSONUtils_PointerEncodedstrcpy(full_pointer + 1, (unsigned char*)current_child->string); strcat((char*)full_pointer, (char*)target_pointer); @@ -862,7 +862,7 @@ static void cJSONUtils_GeneratePatch(cJSON * const patches, const unsigned char } else { - size_t suffix_length = cJSONUtils_PointerEncodedstrlen(suffix); + size_t suffix_length = pointer_encoded_length(suffix); size_t path_length = strlen((const char*)path); unsigned char *full_path = (unsigned char*)cJSON_malloc(path_length + suffix_length + sizeof("/")); @@ -989,7 +989,7 @@ static void cJSONUtils_CompareToPatch(cJSON * const patches, const unsigned char { /* both object keys are the same */ size_t path_length = strlen((const char*)path); - size_t from_child_name_length = cJSONUtils_PointerEncodedstrlen((unsigned char*)from_child->string); + size_t from_child_name_length = pointer_encoded_length((unsigned char*)from_child->string); unsigned char *new_path = (unsigned char*)cJSON_malloc(path_length + from_child_name_length + sizeof("/")); sprintf((char*)new_path, "%s/", path); From f4d9e2e1a1e9cb38e743aea4427b577808786391 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 14:28:06 +0200 Subject: [PATCH 095/126] cJSON_strcasecmp -> case_insensitive_strcmp --- cJSON_Utils.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 5847358d..58a7e64c 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -51,7 +51,7 @@ static unsigned char* cJSONUtils_strdup(const unsigned char* const string) } /* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ -static int cJSONUtils_strcasecmp(const unsigned char *string1, const unsigned char *string2) +static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2) { if ((string1 == NULL) || (string2 == NULL)) { @@ -467,7 +467,7 @@ static int cJSONUtils_Compare(cJSON *a, cJSON *b) { int status = 0; /* compare object keys */ - if (cJSONUtils_strcasecmp((unsigned char*)a->string, (unsigned char*)b->string)) + if (case_insensitive_strcmp((unsigned char*)a->string, (unsigned char*)b->string)) { /* missing member */ return -6; @@ -982,7 +982,7 @@ static void cJSONUtils_CompareToPatch(cJSON * const patches, const unsigned char } else { - diff = cJSONUtils_strcasecmp((unsigned char*)from_child->string, (unsigned char*)to_child->string); + diff = case_insensitive_strcmp((unsigned char*)from_child->string, (unsigned char*)to_child->string); } if (diff == 0) @@ -1048,7 +1048,7 @@ static cJSON *cJSONUtils_SortList(cJSON *list) return result; } - while ((current_item != NULL) && (current_item->next != NULL) && (cJSONUtils_strcasecmp((unsigned char*)current_item->string, (unsigned char*)current_item->next->string) < 0)) + while ((current_item != NULL) && (current_item->next != NULL) && (case_insensitive_strcmp((unsigned char*)current_item->string, (unsigned char*)current_item->next->string) < 0)) { /* Test for list sorted. */ current_item = current_item->next; @@ -1087,7 +1087,7 @@ static cJSON *cJSONUtils_SortList(cJSON *list) while ((first != NULL) && (second != NULL)) { cJSON *smaller = NULL; - if (cJSONUtils_strcasecmp((unsigned char*)first->string, (unsigned char*)second->string) < 0) + if (case_insensitive_strcmp((unsigned char*)first->string, (unsigned char*)second->string) < 0) { smaller = first; } From e6c239db2b8c604c76538f08948353ca85a8a524 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 14:31:36 +0200 Subject: [PATCH 096/126] cJSONUtils_PointerEncodedstrcpy -> encode_string_as_pointer --- cJSON_Utils.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 58a7e64c..12782646 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -128,7 +128,7 @@ static size_t pointer_encoded_length(const unsigned char *string) } /* copy a string while escaping '~' and '/' with ~0 and ~1 JSON pointer escape codes */ -static void cJSONUtils_PointerEncodedstrcpy(unsigned char *destination, const unsigned char *source) +static void encode_string_as_pointer(unsigned char *destination, const unsigned char *source) { for (; source[0] != '\0'; (void)source++, destination++) { @@ -192,7 +192,7 @@ CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const obje { unsigned char *full_pointer = (unsigned char*)cJSON_malloc(strlen((char*)target_pointer) + pointer_encoded_length((unsigned char*)current_child->string) + 2); full_pointer[0] = '/'; - cJSONUtils_PointerEncodedstrcpy(full_pointer + 1, (unsigned char*)current_child->string); + encode_string_as_pointer(full_pointer + 1, (unsigned char*)current_child->string); strcat((char*)full_pointer, (char*)target_pointer); cJSON_free(target_pointer); @@ -867,7 +867,7 @@ static void cJSONUtils_GeneratePatch(cJSON * const patches, const unsigned char unsigned char *full_path = (unsigned char*)cJSON_malloc(path_length + suffix_length + sizeof("/")); sprintf((char*)full_path, "%s/", (const char*)path); - cJSONUtils_PointerEncodedstrcpy(full_path + path_length + 1, suffix); + encode_string_as_pointer(full_path + path_length + 1, suffix); cJSON_AddItemToObject(patch, "path", cJSON_CreateString((const char*)full_path)); free(full_path); @@ -993,7 +993,7 @@ static void cJSONUtils_CompareToPatch(cJSON * const patches, const unsigned char unsigned char *new_path = (unsigned char*)cJSON_malloc(path_length + from_child_name_length + sizeof("/")); sprintf((char*)new_path, "%s/", path); - cJSONUtils_PointerEncodedstrcpy(new_path + path_length + 1, (unsigned char*)from_child->string); + encode_string_as_pointer(new_path + path_length + 1, (unsigned char*)from_child->string); /* create a patch for the element */ cJSONUtils_CompareToPatch(patches, new_path, from_child, to_child); From 7f645de32233d1391e12516d16bff5e631ec88b7 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 14:34:14 +0200 Subject: [PATCH 097/126] cJSONUtils_InplaceDecodePointerString -> decode_pointer_inplace --- cJSON_Utils.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 12782646..12f30c58 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -290,7 +290,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *po } /* JSON Patch implementation. */ -static void cJSONUtils_InplaceDecodePointerString(unsigned char *string) +static void decode_pointer_inplace(unsigned char *string) { unsigned char *decoded_string = string; @@ -379,7 +379,7 @@ static cJSON *cJSONUtils_PatchDetach(cJSON *object, const unsigned char *path) child_pointer++; parent = cJSONUtils_GetPointer(object, (char*)parent_pointer); - cJSONUtils_InplaceDecodePointerString(child_pointer); + decode_pointer_inplace(child_pointer); if (cJSON_IsArray(parent)) { @@ -765,7 +765,7 @@ static int cJSONUtils_ApplyPatch(cJSON *object, const cJSON *patch) child_pointer++; } parent = cJSONUtils_GetPointer(object, (char*)parent_pointer); - cJSONUtils_InplaceDecodePointerString(child_pointer); + decode_pointer_inplace(child_pointer); /* add, remove, replace, move, copy, test. */ if ((parent == NULL) || (child_pointer == NULL)) From aefe2f85ab16d3914bdc252fe4321e382ee227e7 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 14:36:21 +0200 Subject: [PATCH 098/126] cJSONUtils_PatchDetach -> detach_path --- cJSON_Utils.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 12f30c58..1f8caf8e 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -356,7 +356,8 @@ static cJSON *detach_item_from_array(cJSON *array, size_t which) return c; } -static cJSON *cJSONUtils_PatchDetach(cJSON *object, const unsigned char *path) +/* detach an item at the given path */ +static cJSON *detach_path(cJSON *object, const unsigned char *path) { unsigned char *parent_pointer = NULL; unsigned char *child_pointer = NULL; @@ -685,7 +686,7 @@ static int cJSONUtils_ApplyPatch(cJSON *object, const cJSON *patch) if ((opcode == REMOVE) || (opcode == REPLACE)) { /* Get rid of old. */ - cJSON *old_item = cJSONUtils_PatchDetach(object, (unsigned char*)path->valuestring); + cJSON *old_item = detach_path(object, (unsigned char*)path->valuestring); if (old_item == NULL) { status = 13; @@ -713,7 +714,7 @@ static int cJSONUtils_ApplyPatch(cJSON *object, const cJSON *patch) if (opcode == MOVE) { - value = cJSONUtils_PatchDetach(object, (unsigned char*)from->valuestring); + value = detach_path(object, (unsigned char*)from->valuestring); } if (opcode == COPY) { From cf1770b0ea219520a316a97d20c23eafe2038352 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 16:34:39 +0200 Subject: [PATCH 099/126] cJSONUtils_Compare -> compare_json --- cJSON_Utils.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 1f8caf8e..0e40dfb9 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -410,12 +410,12 @@ static cJSON *detach_path(cJSON *object, const unsigned char *path) return detached_item; } -static int cJSONUtils_Compare(cJSON *a, cJSON *b) +static cJSON_bool compare_json(cJSON *a, cJSON *b) { if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF))) { /* mismatched type. */ - return -1; + return false; } switch (a->type & 0xFF) { @@ -423,42 +423,42 @@ static int cJSONUtils_Compare(cJSON *a, cJSON *b) /* numeric mismatch. */ if ((a->valueint != b->valueint) || (a->valuedouble != b->valuedouble)) { - return -2; + return false; } else { - return 0; + return true; } case cJSON_String: /* string mismatch. */ if (strcmp(a->valuestring, b->valuestring) != 0) { - return -3; + return false; } else { - return 0; + return true; } case cJSON_Array: for ((void)(a = a->child), b = b->child; (a != NULL) && (b != NULL); (void)(a = a->next), b = b->next) { - int status = cJSONUtils_Compare(a, b); - if (status != 0) + cJSON_bool identical = compare_json(a, b); + if (!identical) { - return status; + return false; } } /* array size mismatch? (one of both children is not NULL) */ if ((a != NULL) || (b != NULL)) { - return -4; + return false; } else { - return 0; + return true; } case cJSON_Object: @@ -466,28 +466,28 @@ static int cJSONUtils_Compare(cJSON *a, cJSON *b) cJSONUtils_SortObject(b); for ((void)(a = a->child), b = b->child; (a != NULL) && (b != NULL); (void)(a = a->next), b = b->next) { - int status = 0; + cJSON_bool identical = false; /* compare object keys */ if (case_insensitive_strcmp((unsigned char*)a->string, (unsigned char*)b->string)) { /* missing member */ - return -6; + return false; } - status = cJSONUtils_Compare(a, b); - if (status != 0) + identical = compare_json(a, b); + if (!identical) { - return status; + return false; } } /* object length mismatch (one of both children is not null) */ if ((a != NULL) || (b != NULL)) { - return -5; + return false; } else { - return 0; + return true; } default: @@ -495,7 +495,7 @@ static int cJSONUtils_Compare(cJSON *a, cJSON *b) } /* null, true or false */ - return 0; + return true; } /* non broken version of cJSON_InsertItemInArray */ @@ -630,7 +630,7 @@ static int cJSONUtils_ApplyPatch(cJSON *object, const cJSON *patch) else if (opcode == TEST) { /* compare value: {...} with the given path */ - status = cJSONUtils_Compare(cJSONUtils_GetPointer(object, path->valuestring), cJSON_GetObjectItem(patch, "value")); + status = !compare_json(cJSONUtils_GetPointer(object, path->valuestring), cJSON_GetObjectItem(patch, "value")); goto cleanup; } @@ -1242,7 +1242,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * else { /* object key exists in both objects */ - if (cJSONUtils_Compare(from_child, to_child)) + if (!compare_json(from_child, to_child)) { /* not identical --> generate a patch */ cJSON_AddItemToObject(patch, to_child->string, cJSONUtils_GenerateMergePatch(from_child, to_child)); From 997ca129a2d3c5ec1251c6a08b8ee25ea4b94d8b Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 16:36:02 +0200 Subject: [PATCH 100/126] cJSONUtils_ApplyPatch -> apply_patch --- cJSON_Utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 0e40dfb9..9f526bfd 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -603,7 +603,7 @@ static void overwrite_item(cJSON * const root, const cJSON replacement) memcpy(root, &replacement, sizeof(cJSON)); } -static int cJSONUtils_ApplyPatch(cJSON *object, const cJSON *patch) +static int apply_patch(cJSON *object, const cJSON *patch) { cJSON *path = NULL; cJSON *value = NULL; @@ -837,7 +837,7 @@ CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * co while (current_patch != NULL) { - status = cJSONUtils_ApplyPatch(object, current_patch); + status = apply_patch(object, current_patch); if (status != 0) { return status; From 1d65f33d3de48839a15a5a16ec6dd561dad90b55 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 16:39:30 +0200 Subject: [PATCH 101/126] cJSONUtils_GeneratePatch -> compose_patch --- cJSON_Utils.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 9f526bfd..772f56a6 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -848,7 +848,7 @@ CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * co return 0; } -static void cJSONUtils_GeneratePatch(cJSON * const patches, const unsigned char * const operation, const unsigned char * const path, const unsigned char *suffix, const cJSON * const value) +static void compose_patch(cJSON * const patches, const unsigned char * const operation, const unsigned char * const path, const unsigned char *suffix, const cJSON * const value) { cJSON *patch = cJSON_CreateObject(); if (patch == NULL) @@ -883,7 +883,7 @@ static void cJSONUtils_GeneratePatch(cJSON * const patches, const unsigned char CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * const operation, const char * const path, const cJSON * const value) { - cJSONUtils_GeneratePatch(array, (const unsigned char*)operation, (const unsigned char*)path, NULL, value); + compose_patch(array, (const unsigned char*)operation, (const unsigned char*)path, NULL, value); } static void cJSONUtils_CompareToPatch(cJSON * const patches, const unsigned char * const path, cJSON * const from, cJSON * const to) @@ -895,7 +895,7 @@ static void cJSONUtils_CompareToPatch(cJSON * const patches, const unsigned char if ((from->type & 0xFF) != (to->type & 0xFF)) { - cJSONUtils_GeneratePatch(patches, (const unsigned char*)"replace", path, 0, to); + compose_patch(patches, (const unsigned char*)"replace", path, 0, to); return; } @@ -904,14 +904,14 @@ static void cJSONUtils_CompareToPatch(cJSON * const patches, const unsigned char case cJSON_Number: if ((from->valueint != to->valueint) || (from->valuedouble != to->valuedouble)) { - cJSONUtils_GeneratePatch(patches, (const unsigned char*)"replace", path, NULL, to); + compose_patch(patches, (const unsigned char*)"replace", path, NULL, to); } return; case cJSON_String: if (strcmp(from->valuestring, to->valuestring) != 0) { - cJSONUtils_GeneratePatch(patches, (const unsigned char*)"replace", path, NULL, to); + compose_patch(patches, (const unsigned char*)"replace", path, NULL, to); } return; @@ -949,12 +949,12 @@ static void cJSONUtils_CompareToPatch(cJSON * const patches, const unsigned char return; } sprintf((char*)new_path, "%lu", (unsigned long)index); - cJSONUtils_GeneratePatch(patches, (const unsigned char*)"remove", path, new_path, NULL); + compose_patch(patches, (const unsigned char*)"remove", path, new_path, NULL); } /* add new elements in 'to' that were not in 'from' */ for (; (to_child != NULL); (void)(to_child = to_child->next), index++) { - cJSONUtils_GeneratePatch(patches, (const unsigned char*)"add", path, (const unsigned char*)"-", to_child); + compose_patch(patches, (const unsigned char*)"add", path, (const unsigned char*)"-", to_child); } free(new_path); return; @@ -1006,14 +1006,14 @@ static void cJSONUtils_CompareToPatch(cJSON * const patches, const unsigned char else if (diff < 0) { /* object element doesn't exist in 'to' --> remove it */ - cJSONUtils_GeneratePatch(patches, (const unsigned char*)"remove", path, (unsigned char*)from_child->string, NULL); + compose_patch(patches, (const unsigned char*)"remove", path, (unsigned char*)from_child->string, NULL); from_child = from_child->next; } else { /* object element doesn't exist in 'from' --> add it */ - cJSONUtils_GeneratePatch(patches, (const unsigned char*)"add", path, (unsigned char*)to_child->string, to_child); + compose_patch(patches, (const unsigned char*)"add", path, (unsigned char*)to_child->string, to_child); to_child = to_child->next; } From a29c468b68e058761853dc53880b01661ccd294c Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 16:49:37 +0200 Subject: [PATCH 102/126] cJSON_CompareToPatch -> create_patches --- cJSON_Utils.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 772f56a6..f3dfd789 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -886,7 +886,7 @@ CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * compose_patch(array, (const unsigned char*)operation, (const unsigned char*)path, NULL, value); } -static void cJSONUtils_CompareToPatch(cJSON * const patches, const unsigned char * const path, cJSON * const from, cJSON * const to) +static void create_patches(cJSON * const patches, const unsigned char * const path, cJSON * const from, cJSON * const to) { if ((from == NULL) || (to == NULL)) { @@ -934,7 +934,7 @@ static void cJSONUtils_CompareToPatch(cJSON * const patches, const unsigned char return; } sprintf((char*)new_path, "%s/%lu", path, (unsigned long)index); /* path of the current array element */ - cJSONUtils_CompareToPatch(patches, new_path, from_child, to_child); + create_patches(patches, new_path, from_child, to_child); } /* remove leftover elements from 'from' that are not in 'to' */ @@ -997,7 +997,7 @@ static void cJSONUtils_CompareToPatch(cJSON * const patches, const unsigned char encode_string_as_pointer(new_path + path_length + 1, (unsigned char*)from_child->string); /* create a patch for the element */ - cJSONUtils_CompareToPatch(patches, new_path, from_child, to_child); + create_patches(patches, new_path, from_child, to_child); free(new_path); from_child = from_child->next; @@ -1029,7 +1029,7 @@ static void cJSONUtils_CompareToPatch(cJSON * const patches, const unsigned char CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON * const from, cJSON * const to) { cJSON *patches = cJSON_CreateArray(); - cJSONUtils_CompareToPatch(patches, (const unsigned char*)"", from, to); + create_patches(patches, (const unsigned char*)"", from, to); return patches; } From 23cbb173d4029a1ed8c53d1f3307b403370174a2 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 16:53:35 +0200 Subject: [PATCH 103/126] cJSONUtils_SortList -> sort_list --- cJSON_Utils.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index f3dfd789..29c3d358 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -1035,7 +1035,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON * const from, cJSON * con } /* sort lists using mergesort */ -static cJSON *cJSONUtils_SortList(cJSON *list) +static cJSON *sort_list(cJSON *list) { cJSON *first = list; cJSON *second = list; @@ -1080,8 +1080,8 @@ static cJSON *cJSONUtils_SortList(cJSON *list) } /* Recursively sort the sub-lists. */ - first = cJSONUtils_SortList(first); - second = cJSONUtils_SortList(second); + first = sort_list(first); + second = sort_list(second); result = NULL; /* Merge the sub-lists */ @@ -1147,7 +1147,7 @@ static cJSON *cJSONUtils_SortList(cJSON *list) CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object) { - object->child = cJSONUtils_SortList(object->child); + object->child = sort_list(object->child); } CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch) From 2616db9e92bfc2e5d7551c178319174a168fc713 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 19:13:16 +0200 Subject: [PATCH 104/126] Add compare_strings: configurable case_sensitivity --- cJSON_Utils.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 29c3d358..78c9b1d9 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -50,8 +50,8 @@ static unsigned char* cJSONUtils_strdup(const unsigned char* const string) return copy; } -/* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ -static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2) +/* string comparison which doesn't consider NULL pointers equal */ +static int compare_strings(const unsigned char *string1, const unsigned char *string2, const cJSON_bool case_sensitive) { if ((string1 == NULL) || (string2 == NULL)) { @@ -63,6 +63,11 @@ static int case_insensitive_strcmp(const unsigned char *string1, const unsigned return 0; } + if (case_sensitive) + { + return strcmp((const char*)string1, (const char*)string2); + } + for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) { if (*string1 == '\0') @@ -432,7 +437,7 @@ static cJSON_bool compare_json(cJSON *a, cJSON *b) case cJSON_String: /* string mismatch. */ - if (strcmp(a->valuestring, b->valuestring) != 0) + if (compare_strings((unsigned char*)a->valuestring, (unsigned char*)b->valuestring, true) != 0) { return false; } @@ -468,7 +473,7 @@ static cJSON_bool compare_json(cJSON *a, cJSON *b) { cJSON_bool identical = false; /* compare object keys */ - if (case_insensitive_strcmp((unsigned char*)a->string, (unsigned char*)b->string)) + if (compare_strings((unsigned char*)a->string, (unsigned char*)b->string, false)) { /* missing member */ return false; @@ -909,7 +914,7 @@ static void create_patches(cJSON * const patches, const unsigned char * const pa return; case cJSON_String: - if (strcmp(from->valuestring, to->valuestring) != 0) + if (compare_strings((unsigned char*)from->valuestring, (unsigned char*)to->valuestring, true) != 0) { compose_patch(patches, (const unsigned char*)"replace", path, NULL, to); } @@ -983,7 +988,7 @@ static void create_patches(cJSON * const patches, const unsigned char * const pa } else { - diff = case_insensitive_strcmp((unsigned char*)from_child->string, (unsigned char*)to_child->string); + diff = compare_strings((unsigned char*)from_child->string, (unsigned char*)to_child->string, false); } if (diff == 0) @@ -1049,7 +1054,7 @@ static cJSON *sort_list(cJSON *list) return result; } - while ((current_item != NULL) && (current_item->next != NULL) && (case_insensitive_strcmp((unsigned char*)current_item->string, (unsigned char*)current_item->next->string) < 0)) + while ((current_item != NULL) && (current_item->next != NULL) && (compare_strings((unsigned char*)current_item->string, (unsigned char*)current_item->next->string, false) < 0)) { /* Test for list sorted. */ current_item = current_item->next; @@ -1088,7 +1093,7 @@ static cJSON *sort_list(cJSON *list) while ((first != NULL) && (second != NULL)) { cJSON *smaller = NULL; - if (case_insensitive_strcmp((unsigned char*)first->string, (unsigned char*)second->string) < 0) + if (compare_strings((unsigned char*)first->string, (unsigned char*)second->string, false) < 0) { smaller = first; } @@ -1213,7 +1218,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * { if (to_child != NULL) { - diff = strcmp(from_child->string, to_child->string); + diff = compare_strings((unsigned char*)from_child->string, (unsigned char*)to_child->string, true); } else { From 1d854508831ef85bfb85817a1cd9a36a473fef91 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 19:30:26 +0200 Subject: [PATCH 105/126] fix configurable compare_stirings --- cJSON_Utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 78c9b1d9..bc4734fe 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -437,7 +437,7 @@ static cJSON_bool compare_json(cJSON *a, cJSON *b) case cJSON_String: /* string mismatch. */ - if (compare_strings((unsigned char*)a->valuestring, (unsigned char*)b->valuestring, true) != 0) + if (strcmp(a->valuestring, b->valuestring) != 0) { return false; } From 487a8b76a1036170a9faf2477032eaf288a18869 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 19:38:05 +0200 Subject: [PATCH 106/126] fix another compare_strings --- cJSON_Utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index bc4734fe..8760433a 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -914,7 +914,7 @@ static void create_patches(cJSON * const patches, const unsigned char * const pa return; case cJSON_String: - if (compare_strings((unsigned char*)from->valuestring, (unsigned char*)to->valuestring, true) != 0) + if (strcmp((unsigned char*)from->valuestring, (unsigned char*)to->valuestring) != 0) { compose_patch(patches, (const unsigned char*)"replace", path, NULL, to); } From eb017abe72a146f5aa486060061df407ef4c125c Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 19:42:16 +0200 Subject: [PATCH 107/126] fix update fix --- cJSON_Utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 8760433a..793aa54b 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -914,7 +914,7 @@ static void create_patches(cJSON * const patches, const unsigned char * const pa return; case cJSON_String: - if (strcmp((unsigned char*)from->valuestring, (unsigned char*)to->valuestring) != 0) + if (strcmp(from->valuestring, to->valuestring) != 0) { compose_patch(patches, (const unsigned char*)"replace", path, NULL, to); } From 30906a01c0b5db2cea69a81004910698b116ed6d Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 19:48:46 +0200 Subject: [PATCH 108/126] another compare_strings fix --- cJSON_Utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 793aa54b..7b792561 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -1218,7 +1218,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * { if (to_child != NULL) { - diff = compare_strings((unsigned char*)from_child->string, (unsigned char*)to_child->string, true); + diff = strcmp(from_child->string, to_child->string); } else { From 2f33e8ec9b3aa7bf4dca480ff40b702369302117 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 19:17:55 +0200 Subject: [PATCH 109/126] Add compare_pointers: Configurable case sensitivity --- cJSON_Utils.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 7b792561..4465db8a 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -80,7 +80,7 @@ static int compare_strings(const unsigned char *string1, const unsigned char *st } /* Compare the next path element of two JSON pointers, two NULL pointers are considered unequal: */ -static cJSON_bool case_insensitive_pointer_comparison(const unsigned char *name, const unsigned char *pointer) +static cJSON_bool compare_pointers(const unsigned char *name, const unsigned char *pointer, const cJSON_bool case_sensitive) { if ((name == NULL) || (pointer == NULL)) { @@ -102,7 +102,7 @@ static cJSON_bool case_insensitive_pointer_comparison(const unsigned char *name, pointer++; } } - else if (tolower(*name) != tolower(*pointer)) + else if ((!case_sensitive && (tolower(*name) != tolower(*pointer))) || (case_sensitive && (*name != *pointer))) { return false; } @@ -275,7 +275,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *po { current_element = current_element->child; /* GetObjectItem. */ - while ((current_element != NULL) && !case_insensitive_pointer_comparison((unsigned char*)current_element->string, (const unsigned char*)pointer)) + while ((current_element != NULL) && !compare_pointers((unsigned char*)current_element->string, (const unsigned char*)pointer, false)) { current_element = current_element->next; } From af9c76e37e2a11547e2bf06e1244e1b572408be6 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 19:25:37 +0200 Subject: [PATCH 110/126] Add get_item_from_pointer: Configurable case sensitivity --- cJSON_Utils.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 4465db8a..054c7992 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -254,7 +254,7 @@ static cJSON_bool decode_array_index_from_pointer(const unsigned char * const po return 1; } -CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *pointer) +static cJSON *get_item_from_pointer(cJSON * const object, const char * pointer, const cJSON_bool case_sensitive) { cJSON *current_element = object; /* follow path of the pointer */ @@ -275,7 +275,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *po { current_element = current_element->child; /* GetObjectItem. */ - while ((current_element != NULL) && !compare_pointers((unsigned char*)current_element->string, (const unsigned char*)pointer, false)) + while ((current_element != NULL) && !compare_pointers((unsigned char*)current_element->string, (const unsigned char*)pointer, case_sensitive)) { current_element = current_element->next; } @@ -294,6 +294,11 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *po return current_element; } +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *pointer) +{ + return get_item_from_pointer(object, pointer, false); +} + /* JSON Patch implementation. */ static void decode_pointer_inplace(unsigned char *string) { @@ -364,6 +369,7 @@ static cJSON *detach_item_from_array(cJSON *array, size_t which) /* detach an item at the given path */ static cJSON *detach_path(cJSON *object, const unsigned char *path) { + cJSON_bool case_sensitive = false; unsigned char *parent_pointer = NULL; unsigned char *child_pointer = NULL; cJSON *parent = NULL; @@ -384,7 +390,7 @@ static cJSON *detach_path(cJSON *object, const unsigned char *path) child_pointer[0] = '\0'; child_pointer++; - parent = cJSONUtils_GetPointer(object, (char*)parent_pointer); + parent = get_item_from_pointer(object, (char*)parent_pointer, case_sensitive); decode_pointer_inplace(child_pointer); if (cJSON_IsArray(parent)) @@ -610,6 +616,7 @@ static void overwrite_item(cJSON * const root, const cJSON replacement) static int apply_patch(cJSON *object, const cJSON *patch) { + cJSON_bool case_sensitive = false; cJSON *path = NULL; cJSON *value = NULL; cJSON *parent = NULL; @@ -635,7 +642,7 @@ static int apply_patch(cJSON *object, const cJSON *patch) else if (opcode == TEST) { /* compare value: {...} with the given path */ - status = !compare_json(cJSONUtils_GetPointer(object, path->valuestring), cJSON_GetObjectItem(patch, "value")); + status = !compare_json(get_item_from_pointer(object, path->valuestring, case_sensitive), cJSON_GetObjectItem(patch, "value")); goto cleanup; } @@ -723,7 +730,7 @@ static int apply_patch(cJSON *object, const cJSON *patch) } if (opcode == COPY) { - value = cJSONUtils_GetPointer(object, from->valuestring); + value = get_item_from_pointer(object, from->valuestring, case_sensitive); } if (value == NULL) { @@ -770,7 +777,7 @@ static int apply_patch(cJSON *object, const cJSON *patch) child_pointer[0] = '\0'; child_pointer++; } - parent = cJSONUtils_GetPointer(object, (char*)parent_pointer); + parent = get_item_from_pointer(object, (char*)parent_pointer, case_sensitive); decode_pointer_inplace(child_pointer); /* add, remove, replace, move, copy, test. */ From 7de847eeeab7e31b536525f18f5ec707fdb46d7b Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 19:28:20 +0200 Subject: [PATCH 111/126] detach_path: Configurable case sensitivity --- cJSON_Utils.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 054c7992..38540a19 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -367,9 +367,8 @@ static cJSON *detach_item_from_array(cJSON *array, size_t which) } /* detach an item at the given path */ -static cJSON *detach_path(cJSON *object, const unsigned char *path) +static cJSON *detach_path(cJSON *object, const unsigned char *path, const cJSON_bool case_sensitive) { - cJSON_bool case_sensitive = false; unsigned char *parent_pointer = NULL; unsigned char *child_pointer = NULL; cJSON *parent = NULL; @@ -698,7 +697,7 @@ static int apply_patch(cJSON *object, const cJSON *patch) if ((opcode == REMOVE) || (opcode == REPLACE)) { /* Get rid of old. */ - cJSON *old_item = detach_path(object, (unsigned char*)path->valuestring); + cJSON *old_item = detach_path(object, (unsigned char*)path->valuestring, case_sensitive); if (old_item == NULL) { status = 13; @@ -726,7 +725,7 @@ static int apply_patch(cJSON *object, const cJSON *patch) if (opcode == MOVE) { - value = detach_path(object, (unsigned char*)from->valuestring); + value = detach_path(object, (unsigned char*)from->valuestring, case_sensitive); } if (opcode == COPY) { From 62b08f1336a3cd7566b19b4898945a8fa91de48d Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 19:32:37 +0200 Subject: [PATCH 112/126] compare_json: configurable case sensitivity --- cJSON_Utils.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 38540a19..7b4d8f3b 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -420,7 +420,7 @@ static cJSON *detach_path(cJSON *object, const unsigned char *path, const cJSON_ return detached_item; } -static cJSON_bool compare_json(cJSON *a, cJSON *b) +static cJSON_bool compare_json(cJSON *a, cJSON *b, const cJSON_bool case_sensitive) { if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF))) { @@ -454,7 +454,7 @@ static cJSON_bool compare_json(cJSON *a, cJSON *b) case cJSON_Array: for ((void)(a = a->child), b = b->child; (a != NULL) && (b != NULL); (void)(a = a->next), b = b->next) { - cJSON_bool identical = compare_json(a, b); + cJSON_bool identical = compare_json(a, b, case_sensitive); if (!identical) { return false; @@ -478,12 +478,12 @@ static cJSON_bool compare_json(cJSON *a, cJSON *b) { cJSON_bool identical = false; /* compare object keys */ - if (compare_strings((unsigned char*)a->string, (unsigned char*)b->string, false)) + if (compare_strings((unsigned char*)a->string, (unsigned char*)b->string, case_sensitive)) { /* missing member */ return false; } - identical = compare_json(a, b); + identical = compare_json(a, b, case_sensitive); if (!identical) { return false; @@ -641,7 +641,7 @@ static int apply_patch(cJSON *object, const cJSON *patch) else if (opcode == TEST) { /* compare value: {...} with the given path */ - status = !compare_json(get_item_from_pointer(object, path->valuestring, case_sensitive), cJSON_GetObjectItem(patch, "value")); + status = !compare_json(get_item_from_pointer(object, path->valuestring, case_sensitive), cJSON_GetObjectItem(patch, "value"), case_sensitive); goto cleanup; } @@ -1198,6 +1198,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const p CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * const to) { + cJSON_bool case_sensitive = false; cJSON *from_child = NULL; cJSON *to_child = NULL; cJSON *patch = NULL; @@ -1253,7 +1254,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * else { /* object key exists in both objects */ - if (!compare_json(from_child, to_child)) + if (!compare_json(from_child, to_child, case_sensitive)) { /* not identical --> generate a patch */ cJSON_AddItemToObject(patch, to_child->string, cJSONUtils_GenerateMergePatch(from_child, to_child)); From 222686513e3201902b7ef0f73917ee7a18803d06 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 19:36:51 +0200 Subject: [PATCH 113/126] apply_patch: configurable case sensitivity --- cJSON_Utils.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 7b4d8f3b..50370ec3 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -613,9 +613,8 @@ static void overwrite_item(cJSON * const root, const cJSON replacement) memcpy(root, &replacement, sizeof(cJSON)); } -static int apply_patch(cJSON *object, const cJSON *patch) +static int apply_patch(cJSON *object, const cJSON *patch, const cJSON_bool case_sensitive) { - cJSON_bool case_sensitive = false; cJSON *path = NULL; cJSON *value = NULL; cJSON *parent = NULL; @@ -848,7 +847,7 @@ CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * co while (current_patch != NULL) { - status = apply_patch(object, current_patch); + status = apply_patch(object, current_patch, false); if (status != 0) { return status; From e88be8681de10b66695dc8ce6afb510f312e0944 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 19:40:27 +0200 Subject: [PATCH 114/126] create_patches: Configurable case sensitivity --- cJSON_Utils.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 50370ec3..c07167d0 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -896,7 +896,7 @@ CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * compose_patch(array, (const unsigned char*)operation, (const unsigned char*)path, NULL, value); } -static void create_patches(cJSON * const patches, const unsigned char * const path, cJSON * const from, cJSON * const to) +static void create_patches(cJSON * const patches, const unsigned char * const path, cJSON * const from, cJSON * const to, const cJSON_bool case_sensitive) { if ((from == NULL) || (to == NULL)) { @@ -944,7 +944,7 @@ static void create_patches(cJSON * const patches, const unsigned char * const pa return; } sprintf((char*)new_path, "%s/%lu", path, (unsigned long)index); /* path of the current array element */ - create_patches(patches, new_path, from_child, to_child); + create_patches(patches, new_path, from_child, to_child, case_sensitive); } /* remove leftover elements from 'from' that are not in 'to' */ @@ -993,7 +993,7 @@ static void create_patches(cJSON * const patches, const unsigned char * const pa } else { - diff = compare_strings((unsigned char*)from_child->string, (unsigned char*)to_child->string, false); + diff = compare_strings((unsigned char*)from_child->string, (unsigned char*)to_child->string, case_sensitive); } if (diff == 0) @@ -1007,7 +1007,7 @@ static void create_patches(cJSON * const patches, const unsigned char * const pa encode_string_as_pointer(new_path + path_length + 1, (unsigned char*)from_child->string); /* create a patch for the element */ - create_patches(patches, new_path, from_child, to_child); + create_patches(patches, new_path, from_child, to_child, case_sensitive); free(new_path); from_child = from_child->next; @@ -1039,7 +1039,7 @@ static void create_patches(cJSON * const patches, const unsigned char * const pa CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON * const from, cJSON * const to) { cJSON *patches = cJSON_CreateArray(); - create_patches(patches, (const unsigned char*)"", from, to); + create_patches(patches, (const unsigned char*)"", from, to, false); return patches; } From 0aaef1a8fadec0dfeb7fd5f070382a0398506784 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 19:44:55 +0200 Subject: [PATCH 115/126] sort_list: configurable case sensitivity --- cJSON_Utils.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index c07167d0..48aeb071 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -1045,7 +1045,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON * const from, cJSON * con } /* sort lists using mergesort */ -static cJSON *sort_list(cJSON *list) +static cJSON *sort_list(cJSON *list, const cJSON_bool case_sensitive) { cJSON *first = list; cJSON *second = list; @@ -1059,7 +1059,7 @@ static cJSON *sort_list(cJSON *list) return result; } - while ((current_item != NULL) && (current_item->next != NULL) && (compare_strings((unsigned char*)current_item->string, (unsigned char*)current_item->next->string, false) < 0)) + while ((current_item != NULL) && (current_item->next != NULL) && (compare_strings((unsigned char*)current_item->string, (unsigned char*)current_item->next->string, case_sensitive) < 0)) { /* Test for list sorted. */ current_item = current_item->next; @@ -1090,8 +1090,8 @@ static cJSON *sort_list(cJSON *list) } /* Recursively sort the sub-lists. */ - first = sort_list(first); - second = sort_list(second); + first = sort_list(first, case_sensitive); + second = sort_list(second, case_sensitive); result = NULL; /* Merge the sub-lists */ @@ -1157,7 +1157,7 @@ static cJSON *sort_list(cJSON *list) CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object) { - object->child = sort_list(object->child); + object->child = sort_list(object->child, false); } CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch) From 73823c4b6d592550822bd0eee18826b4b2a068ed Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 19:55:44 +0200 Subject: [PATCH 116/126] Add get_object_item: configurable case_sensitivity --- cJSON_Utils.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 48aeb071..50950ecd 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -546,11 +546,21 @@ static cJSON_bool insert_item_in_array(cJSON *array, size_t which, cJSON *newite return 1; } +static cJSON *get_object_item(const cJSON * const object, const char* name, const cJSON_bool case_sensitive) +{ + if (case_sensitive) + { + return cJSON_GetObjectItemCaseSensitive(object, name); + } + + return cJSON_GetObjectItem(object, name); +} + enum patch_operation { INVALID, ADD, REMOVE, REPLACE, MOVE, COPY, TEST }; -static enum patch_operation decode_patch_operation(const cJSON * const patch) +static enum patch_operation decode_patch_operation(const cJSON * const patch, const cJSON_bool case_sensitive) { - cJSON *operation = cJSON_GetObjectItem(patch, "op"); + cJSON *operation = get_object_item(patch, "op", case_sensitive); if (!cJSON_IsString(operation)) { return INVALID; @@ -623,7 +633,7 @@ static int apply_patch(cJSON *object, const cJSON *patch, const cJSON_bool case_ unsigned char *child_pointer = NULL; int status = 0; - path = cJSON_GetObjectItem(patch, "path"); + path = get_object_item(patch, "path", case_sensitive); if (!cJSON_IsString(path)) { /* malformed patch. */ @@ -631,7 +641,7 @@ static int apply_patch(cJSON *object, const cJSON *patch, const cJSON_bool case_ goto cleanup; } - opcode = decode_patch_operation(patch); + opcode = decode_patch_operation(patch, case_sensitive); if (opcode == INVALID) { status = 3; @@ -640,7 +650,7 @@ static int apply_patch(cJSON *object, const cJSON *patch, const cJSON_bool case_ else if (opcode == TEST) { /* compare value: {...} with the given path */ - status = !compare_json(get_item_from_pointer(object, path->valuestring, case_sensitive), cJSON_GetObjectItem(patch, "value"), case_sensitive); + status = !compare_json(get_item_from_pointer(object, path->valuestring, case_sensitive), get_object_item(patch, "value", case_sensitive), case_sensitive); goto cleanup; } @@ -659,7 +669,7 @@ static int apply_patch(cJSON *object, const cJSON *patch, const cJSON_bool case_ if ((opcode == REPLACE) || (opcode == ADD)) { - value = cJSON_GetObjectItem(patch, "value"); + value = get_object_item(patch, "value", case_sensitive); if (value == NULL) { /* missing "value" for add/replace. */ @@ -714,7 +724,7 @@ static int apply_patch(cJSON *object, const cJSON *patch, const cJSON_bool case_ /* Copy/Move uses "from". */ if ((opcode == MOVE) || (opcode == COPY)) { - cJSON *from = cJSON_GetObjectItem(patch, "from"); + cJSON *from = get_object_item(patch, "from", case_sensitive); if (from == NULL) { /* missing "from" for copy/move. */ @@ -749,7 +759,7 @@ static int apply_patch(cJSON *object, const cJSON *patch, const cJSON_bool case_ } else /* Add/Replace uses "value". */ { - value = cJSON_GetObjectItem(patch, "value"); + value = get_object_item(patch, "value", case_sensitive); if (value == NULL) { /* missing "value" for add/replace. */ From cd4d7b9b6e9fe45fd984f300989758a4ca2786db Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 19:58:00 +0200 Subject: [PATCH 117/126] Add cJSONUtils_GetPointerCaseSensitive --- cJSON_Utils.c | 5 +++++ cJSON_Utils.h | 1 + 2 files changed, 6 insertions(+) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 50950ecd..b4dacf3b 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -299,6 +299,11 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *po return get_item_from_pointer(object, pointer, false); } +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointerCaseSensitive(cJSON * const object, const char *pointer) +{ + return get_item_from_pointer(object, pointer, true); +} + /* JSON Patch implementation. */ static void decode_pointer_inplace(unsigned char *string) { diff --git a/cJSON_Utils.h b/cJSON_Utils.h index b20e5db0..4ff21f80 100644 --- a/cJSON_Utils.h +++ b/cJSON_Utils.h @@ -24,6 +24,7 @@ /* Implement RFC6901 (https://tools.ietf.org/html/rfc6901) JSON Pointer spec. */ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *pointer); +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointerCaseSensitive(cJSON * const object, const char *pointer); /* Implement RFC6902 (https://tools.ietf.org/html/rfc6902) JSON Patch spec. */ /* NOTE: This modifies objects in 'from' and 'to' by sorting the elements by their key */ From 3bf2913634979c93527ef84427d0e2e546d12e57 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 19:59:05 +0200 Subject: [PATCH 118/126] Add cJSONUtils_GeneratePatchesCaseSensitive --- cJSON_Utils.c | 8 ++++++++ cJSON_Utils.h | 1 + 2 files changed, 9 insertions(+) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index b4dacf3b..22794df6 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -1059,6 +1059,14 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON * const from, cJSON * con return patches; } +CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatchesCaseSensitive(cJSON * const from, cJSON * const to) +{ + cJSON *patches = cJSON_CreateArray(); + create_patches(patches, (const unsigned char*)"", from, to, true); + + return patches; +} + /* sort lists using mergesort */ static cJSON *sort_list(cJSON *list, const cJSON_bool case_sensitive) { diff --git a/cJSON_Utils.h b/cJSON_Utils.h index 4ff21f80..e61bb611 100644 --- a/cJSON_Utils.h +++ b/cJSON_Utils.h @@ -29,6 +29,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointerCaseSensitive(cJSON * const object, c /* Implement RFC6902 (https://tools.ietf.org/html/rfc6902) JSON Patch spec. */ /* 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); +CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatchesCaseSensitive(cJSON * const from, cJSON * const to); /* Utility for generating patch array entries. */ CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * const operation, const char * const path, const cJSON * const value); /* Returns 0 for success. */ From 94057fb0692999834cc34225316dafb8ee9b9cf5 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 20:01:56 +0200 Subject: [PATCH 119/126] Add cJSONUtils_ApplyPatchesCaseSensitive --- cJSON_Utils.c | 29 +++++++++++++++++++++++++++++ cJSON_Utils.h | 1 + 2 files changed, 30 insertions(+) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 22794df6..2ff4c9df 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -873,6 +873,35 @@ CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * co return 0; } +CJSON_PUBLIC(int) cJSONUtils_ApplyPatchesCaseSensitive(cJSON * const object, const cJSON * const patches) +{ + const cJSON *current_patch = NULL; + int status = 0; + + if (!cJSON_IsArray(patches)) + { + /* malformed patches. */ + return 1; + } + + if (patches != NULL) + { + current_patch = patches->child; + } + + while (current_patch != NULL) + { + status = apply_patch(object, current_patch, true); + if (status != 0) + { + return status; + } + current_patch = current_patch->next; + } + + return 0; +} + static void compose_patch(cJSON * const patches, const unsigned char * const operation, const unsigned char * const path, const unsigned char *suffix, const cJSON * const value) { cJSON *patch = cJSON_CreateObject(); diff --git a/cJSON_Utils.h b/cJSON_Utils.h index e61bb611..7cd06af8 100644 --- a/cJSON_Utils.h +++ b/cJSON_Utils.h @@ -34,6 +34,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatchesCaseSensitive(cJSON * const from CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * const operation, const char * const path, const cJSON * const value); /* Returns 0 for success. */ CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * const patches); +CJSON_PUBLIC(int) cJSONUtils_ApplyPatchesCaseSensitive(cJSON * const object, const cJSON * const patches); /* // Note that ApplyPatches is NOT atomic on failure. To implement an atomic ApplyPatches, use: From b674519695997ec55917ad8ed969ce26c606f44d Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 20:04:44 +0200 Subject: [PATCH 120/126] Add cJSONUtils_GenerateMergePatchCaseSensitive --- cJSON_Utils.c | 13 +++++++++++-- cJSON_Utils.h | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 2ff4c9df..3552af70 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -1247,9 +1247,8 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const p return target; } -CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * const to) +static cJSON *generate_merge_patch(cJSON * const from, cJSON * const to, const cJSON_bool case_sensitive) { - cJSON_bool case_sensitive = false; cJSON *from_child = NULL; cJSON *to_child = NULL; cJSON *patch = NULL; @@ -1325,3 +1324,13 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * return patch; } + +CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * const to) +{ + return generate_merge_patch(from, to, false); +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatchCaseSensitive(cJSON * const from, cJSON * const to) +{ + return generate_merge_patch(from, to, true); +} diff --git a/cJSON_Utils.h b/cJSON_Utils.h index 7cd06af8..d8268181 100644 --- a/cJSON_Utils.h +++ b/cJSON_Utils.h @@ -63,6 +63,7 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const p /* generates a patch to move from -> to */ /* 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); +CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatchCaseSensitive(cJSON * const from, cJSON * const to); /* Given a root object and a target object, construct a pointer from one to the other. */ CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const object, const cJSON * const target); From 7f22948eecf91e839e973a207a46cc7276eeca0b Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sun, 30 Apr 2017 20:09:54 +0200 Subject: [PATCH 121/126] Add cJSONUtils_SortObjectCaseSensitive --- cJSON_Utils.c | 242 ++++++++++++++++++++++++++------------------------ cJSON_Utils.h | 1 + 2 files changed, 127 insertions(+), 116 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 3552af70..8c5cddd7 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -425,6 +425,122 @@ static cJSON *detach_path(cJSON *object, const unsigned char *path, const cJSON_ return detached_item; } +/* sort lists using mergesort */ +static cJSON *sort_list(cJSON *list, const cJSON_bool case_sensitive) +{ + cJSON *first = list; + cJSON *second = list; + cJSON *current_item = list; + cJSON *result = list; + cJSON *result_tail = NULL; + + if ((list == NULL) || (list->next == NULL)) + { + /* One entry is sorted already. */ + return result; + } + + while ((current_item != NULL) && (current_item->next != NULL) && (compare_strings((unsigned char*)current_item->string, (unsigned char*)current_item->next->string, case_sensitive) < 0)) + { + /* Test for list sorted. */ + current_item = current_item->next; + } + if ((current_item == NULL) || (current_item->next == NULL)) + { + /* Leave sorted lists unmodified. */ + return result; + } + + /* reset pointer to the beginning */ + current_item = list; + while (current_item != NULL) + { + /* Walk two pointers to find the middle. */ + second = second->next; + current_item = current_item->next; + /* advances current_item two steps at a time */ + if (current_item != NULL) + { + current_item = current_item->next; + } + } + if ((second != NULL) && (second->prev != NULL)) + { + /* Split the lists */ + second->prev->next = NULL; + } + + /* Recursively sort the sub-lists. */ + first = sort_list(first, case_sensitive); + second = sort_list(second, case_sensitive); + result = NULL; + + /* Merge the sub-lists */ + while ((first != NULL) && (second != NULL)) + { + cJSON *smaller = NULL; + if (compare_strings((unsigned char*)first->string, (unsigned char*)second->string, false) < 0) + { + smaller = first; + } + else + { + smaller = second; + } + + if (result == NULL) + { + /* start merged list with the smaller element */ + result_tail = smaller; + result = smaller; + } + else + { + /* add smaller element to the list */ + result_tail->next = smaller; + smaller->prev = result_tail; + result_tail = smaller; + } + + if (first == smaller) + { + first = first->next; + } + else + { + second = second->next; + } + } + + if (first != NULL) + { + /* Append rest of first list. */ + if (result == NULL) + { + return first; + } + result_tail->next = first; + first->prev = result_tail; + } + if (second != NULL) + { + /* Append rest of second list */ + if (result == NULL) + { + return second; + } + result_tail->next = second; + second->prev = result_tail; + } + + return result; +} + +static void sort_object(cJSON * const object, const cJSON_bool case_sensitive) +{ + object->child = sort_list(object->child, case_sensitive); +} + static cJSON_bool compare_json(cJSON *a, cJSON *b, const cJSON_bool case_sensitive) { if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF))) @@ -477,8 +593,8 @@ static cJSON_bool compare_json(cJSON *a, cJSON *b, const cJSON_bool case_sensiti } case cJSON_Object: - cJSONUtils_SortObject(a); - cJSONUtils_SortObject(b); + sort_object(a, case_sensitive); + sort_object(b, case_sensitive); for ((void)(a = a->child), b = b->child; (a != NULL) && (b != NULL); (void)(a = a->next), b = b->next) { cJSON_bool identical = false; @@ -1018,8 +1134,8 @@ static void create_patches(cJSON * const patches, const unsigned char * const pa { cJSON *from_child = NULL; cJSON *to_child = NULL; - cJSONUtils_SortObject(from); - cJSONUtils_SortObject(to); + sort_object(from, case_sensitive); + sort_object(to, case_sensitive); from_child = from->child; to_child = to->child; @@ -1096,120 +1212,14 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatchesCaseSensitive(cJSON * const from return patches; } -/* sort lists using mergesort */ -static cJSON *sort_list(cJSON *list, const cJSON_bool case_sensitive) +CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object) { - cJSON *first = list; - cJSON *second = list; - cJSON *current_item = list; - cJSON *result = list; - cJSON *result_tail = NULL; - - if ((list == NULL) || (list->next == NULL)) - { - /* One entry is sorted already. */ - return result; - } - - while ((current_item != NULL) && (current_item->next != NULL) && (compare_strings((unsigned char*)current_item->string, (unsigned char*)current_item->next->string, case_sensitive) < 0)) - { - /* Test for list sorted. */ - current_item = current_item->next; - } - if ((current_item == NULL) || (current_item->next == NULL)) - { - /* Leave sorted lists unmodified. */ - return result; - } - - /* reset pointer to the beginning */ - current_item = list; - while (current_item != NULL) - { - /* Walk two pointers to find the middle. */ - second = second->next; - current_item = current_item->next; - /* advances current_item two steps at a time */ - if (current_item != NULL) - { - current_item = current_item->next; - } - } - if ((second != NULL) && (second->prev != NULL)) - { - /* Split the lists */ - second->prev->next = NULL; - } - - /* Recursively sort the sub-lists. */ - first = sort_list(first, case_sensitive); - second = sort_list(second, case_sensitive); - result = NULL; - - /* Merge the sub-lists */ - while ((first != NULL) && (second != NULL)) - { - cJSON *smaller = NULL; - if (compare_strings((unsigned char*)first->string, (unsigned char*)second->string, false) < 0) - { - smaller = first; - } - else - { - smaller = second; - } - - if (result == NULL) - { - /* start merged list with the smaller element */ - result_tail = smaller; - result = smaller; - } - else - { - /* add smaller element to the list */ - result_tail->next = smaller; - smaller->prev = result_tail; - result_tail = smaller; - } - - if (first == smaller) - { - first = first->next; - } - else - { - second = second->next; - } - } - - if (first != NULL) - { - /* Append rest of first list. */ - if (result == NULL) - { - return first; - } - result_tail->next = first; - first->prev = result_tail; - } - if (second != NULL) - { - /* Append rest of second list */ - if (result == NULL) - { - return second; - } - result_tail->next = second; - second->prev = result_tail; - } - - return result; + sort_object(object, false); } -CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object) +CJSON_PUBLIC(void) cJSONUtils_SortObjectCaseSensitive(cJSON * const object) { - object->child = sort_list(object->child, false); + sort_object(object, true); } CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch) @@ -1262,8 +1272,8 @@ static cJSON *generate_merge_patch(cJSON * const from, cJSON * const to, const c return cJSON_Duplicate(to, 1); } - cJSONUtils_SortObject(from); - cJSONUtils_SortObject(to); + sort_object(from, case_sensitive); + sort_object(to, case_sensitive); from_child = from->child; to_child = to->child; diff --git a/cJSON_Utils.h b/cJSON_Utils.h index d8268181..3ecc1e9c 100644 --- a/cJSON_Utils.h +++ b/cJSON_Utils.h @@ -70,3 +70,4 @@ CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const obje /* Sorts the members of the object into alphabetical order. */ CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object); +CJSON_PUBLIC(void) cJSONUtils_SortObjectCaseSensitive(cJSON * const object); From 66f75619d9c073523b36c77100a86f9889bce4e7 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Mon, 1 May 2017 22:41:19 +0200 Subject: [PATCH 122/126] Add cJSONUtils_MergePatchCaseSensitive --- cJSON_Utils.c | 42 ++++++++++++++++++++++++++++++++++++++---- cJSON_Utils.h | 1 + 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 8c5cddd7..5d61c76e 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -1222,7 +1222,7 @@ CJSON_PUBLIC(void) cJSONUtils_SortObjectCaseSensitive(cJSON * const object) sort_object(object, true); } -CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch) +static cJSON *merge_patch(cJSON *target, const cJSON * const patch, const cJSON_bool case_sensitive) { cJSON *patch_child = NULL; @@ -1245,18 +1245,52 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const p if (cJSON_IsNull(patch_child)) { /* NULL is the indicator to remove a value, see RFC7396 */ - cJSON_DeleteItemFromObject(target, patch_child->string); + if (case_sensitive) + { + cJSON_DeleteItemFromObjectCaseSensitive(target, patch_child->string); + } + else + { + cJSON_DeleteItemFromObject(target, patch_child->string); + } } else { - cJSON *replace_me = cJSON_DetachItemFromObject(target, patch_child->string); - cJSON_AddItemToObject(target, patch_child->string, cJSONUtils_MergePatch(replace_me, patch_child)); + cJSON *replace_me = NULL; + cJSON *replacement = NULL; + + if (case_sensitive) + { + replace_me = cJSON_DetachItemFromObjectCaseSensitive(target, patch_child->string); + } + else + { + replace_me = cJSON_DetachItemFromObject(target, patch_child->string); + } + + replacement = merge_patch(replace_me, patch_child, case_sensitive); + if (replacement == NULL) + { + return NULL; + } + + cJSON_AddItemToObject(target, patch_child->string, replacement); } patch_child = patch_child->next; } return target; } +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch) +{ + return merge_patch(target, patch, false); +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatchCaseSensitive(cJSON *target, const cJSON * const patch) +{ + return merge_patch(target, patch, true); +} + static cJSON *generate_merge_patch(cJSON * const from, cJSON * const to, const cJSON_bool case_sensitive) { cJSON *from_child = NULL; diff --git a/cJSON_Utils.h b/cJSON_Utils.h index 3ecc1e9c..03ec10c9 100644 --- a/cJSON_Utils.h +++ b/cJSON_Utils.h @@ -60,6 +60,7 @@ CJSON_PUBLIC(int) cJSONUtils_ApplyPatchesCaseSensitive(cJSON * const object, con /* Implement RFC7386 (https://tools.ietf.org/html/rfc7396) JSON Merge Patch spec. */ /* target will be modified by patch. return value is new ptr for target. */ CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch); +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatchCaseSensitive(cJSON *target, const cJSON * const patch); /* generates a patch to move from -> to */ /* 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); From 1d277eb99dd904aa38a21da72c80488efda80e60 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 2 May 2017 01:48:14 +0200 Subject: [PATCH 123/126] README.md: Case sensitivity caveat --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 1d6fb8ad..ebef2b49 100644 --- a/README.md +++ b/README.md @@ -402,6 +402,10 @@ However it is thread safe under the following conditions: * `cJSON_InitHooks` is only ever called before using cJSON in any threads. * `setlocale` is never called before all calls to cJSON functions have returned. +#### Case Sensitivity + +When cJSON was originally created, it didn't follow the JSON standard and didn't make a distinction between uppercase and lowercase letters. If you want the correct, standard compliant, behavior, you need to use the `CaseSensitive` functions where available. + # Enjoy cJSON! - Dave Gamble, Aug 2009 From e1f6470dae441e1a90f64240f39466b0d5f4ddb9 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 2 May 2017 01:54:49 +0200 Subject: [PATCH 124/126] json_patch_tests.c: Use case sensitive functions --- tests/json_patch_tests.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/json_patch_tests.c b/tests/json_patch_tests.c index 90cbaba8..3d4df418 100644 --- a/tests/json_patch_tests.c +++ b/tests/json_patch_tests.c @@ -59,7 +59,7 @@ static cJSON_bool test_apply_patch(const cJSON * const test) cJSON_bool successful = false; /* extract all the data out of the test */ - comment = cJSON_GetObjectItem(test, "comment"); + comment = cJSON_GetObjectItemCaseSensitive(test, "comment"); if (cJSON_IsString(comment)) { printf("Testing \"%s\"\n", comment->valuestring); @@ -69,34 +69,34 @@ static cJSON_bool test_apply_patch(const cJSON * const test) printf("Testing unkown\n"); } - disabled = cJSON_GetObjectItem(test, "disabled"); + disabled = cJSON_GetObjectItemCaseSensitive(test, "disabled"); if (cJSON_IsTrue(disabled)) { printf("SKIPPED\n"); return true; } - doc = cJSON_GetObjectItem(test, "doc"); + doc = cJSON_GetObjectItemCaseSensitive(test, "doc"); TEST_ASSERT_NOT_NULL_MESSAGE(doc, "No \"doc\" in the test."); - patch = cJSON_GetObjectItem(test, "patch"); + patch = cJSON_GetObjectItemCaseSensitive(test, "patch"); TEST_ASSERT_NOT_NULL_MESSAGE(patch, "No \"patch\"in the test."); /* Make a working copy of 'doc' */ object = cJSON_Duplicate(doc, true); TEST_ASSERT_NOT_NULL(object); - expected = cJSON_GetObjectItem(test, "expected"); - error_element = cJSON_GetObjectItem(test, "error"); + expected = cJSON_GetObjectItemCaseSensitive(test, "expected"); + error_element = cJSON_GetObjectItemCaseSensitive(test, "error"); if (error_element != NULL) { /* excepting an error */ - TEST_ASSERT_TRUE_MESSAGE(0 != cJSONUtils_ApplyPatches(object, patch), "Test didn't fail as it's supposed to."); + TEST_ASSERT_TRUE_MESSAGE(0 != cJSONUtils_ApplyPatchesCaseSensitive(object, patch), "Test didn't fail as it's supposed to."); successful = true; } else { /* apply the patch */ - TEST_ASSERT_EQUAL_INT_MESSAGE(0, cJSONUtils_ApplyPatches(object, patch), "Failed to apply patches."); + TEST_ASSERT_EQUAL_INT_MESSAGE(0, cJSONUtils_ApplyPatchesCaseSensitive(object, patch), "Failed to apply patches."); successful = true; if (expected != NULL) @@ -131,21 +131,21 @@ static cJSON_bool test_generate_test(cJSON *test __attribute__((unused))) char *printed_patch = NULL; - disabled = cJSON_GetObjectItem(test, "disabled"); + disabled = cJSON_GetObjectItemCaseSensitive(test, "disabled"); if (cJSON_IsTrue(disabled)) { printf("SKIPPED\n"); return true; } - doc = cJSON_GetObjectItem(test, "doc"); + doc = cJSON_GetObjectItemCaseSensitive(test, "doc"); TEST_ASSERT_NOT_NULL_MESSAGE(doc, "No \"doc\" in the test."); /* Make a working copy of 'doc' */ object = cJSON_Duplicate(doc, true); TEST_ASSERT_NOT_NULL(object); - expected = cJSON_GetObjectItem(test, "expected"); + expected = cJSON_GetObjectItemCaseSensitive(test, "expected"); if (expected == NULL) { cJSON_Delete(object); @@ -153,7 +153,7 @@ static cJSON_bool test_generate_test(cJSON *test __attribute__((unused))) return true; } - patch = cJSONUtils_GeneratePatches(doc, expected); + patch = cJSONUtils_GeneratePatchesCaseSensitive(doc, expected); TEST_ASSERT_NOT_NULL_MESSAGE(patch, "Failed to generate patches."); printed_patch = cJSON_Print(patch); @@ -161,7 +161,7 @@ static cJSON_bool test_generate_test(cJSON *test __attribute__((unused))) free(printed_patch); /* apply the generated patch */ - TEST_ASSERT_EQUAL_INT_MESSAGE(0, cJSONUtils_ApplyPatches(object, patch), "Failed to apply generated patch."); + TEST_ASSERT_EQUAL_INT_MESSAGE(0, cJSONUtils_ApplyPatchesCaseSensitive(object, patch), "Failed to apply generated patch."); successful = cJSON_Compare(object, expected, true); From ffb877c94ad176c88355345c434c57de1a604455 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 2 May 2017 01:56:12 +0200 Subject: [PATCH 125/126] Squashed 'tests/json-patch-tests/' changes from 5405313..0dd0fbc 0dd0fbc tests.json: Test case sensitivity 01348ad tests.json: Remove trailing whitespace git-subtree-dir: tests/json-patch-tests git-subtree-split: 0dd0fbc5ec7eb9dab362fab47e08419079d5675e --- tests.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests.json b/tests.json index 48bbd994..28fe4bc2 100644 --- a/tests.json +++ b/tests.json @@ -409,7 +409,7 @@ "doc": ["foo", "bar"], "patch": [{"op": "test", "path": "/01", "value": "bar"}], "error": "test op should reject the array value, it has leading zeros" }, - + { "comment": "Removing nonexistent field", "doc": {"foo" : "bar"}, "patch": [{"op": "remove", "path": "/baz"}], @@ -418,6 +418,12 @@ { "comment": "Removing nonexistent index", "doc": ["foo", "bar"], "patch": [{"op": "remove", "path": "/2"}], - "error": "removing a nonexistent index should fail" } + "error": "removing a nonexistent index should fail" }, + + { "comment": "Patch with different capitalisation than doc", + "doc": {"foo":"bar"}, + "patch": [{"op": "add", "path": "/FOO", "value": "BAR"}], + "expected": {"foo": "bar", "FOO": "BAR"} + } ] From d9b23039b8476d2c57bcdab4a54cd7ecacf17429 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 2 May 2017 02:22:19 +0200 Subject: [PATCH 126/126] CONTRIBUTORS.md: Add Mike Robinson --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index bb0788f8..82af73f5 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -23,6 +23,7 @@ Contributors * [Max Bruckner](https://github.com/FSMaxB) * Mike Pontillo * [Mike Jerris](https://github.com/mjerris) +* [Mike Robinson](https://github.com/mhrobinson) * Paulo Antonio Alvarez * [Pawel Winogrodzki](https://github.com/PawelWMS) * [Rafael Leal Dias](https://github.com/rafaeldias)