mirror of
https://github.com/DaveGamble/cJSON.git
synced 2023-08-10 21:13:26 +03:00
Add get_item_from_pointer: Configurable case sensitivity
This commit is contained in:
parent
2f33e8ec9b
commit
af9c76e37e
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user