diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 29c3d35..78c9b1d 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 {