Add get_item_from_pointer: Configurable case sensitivity

This commit is contained in:
Max Bruckner 2017-04-30 19:25:37 +02:00
parent 2f33e8ec9b
commit af9c76e37e
1 changed files with 13 additions and 6 deletions

View File

@ -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. */