CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON *object, const char *pointer) { /* follow path of the pointer */ while ((*pointer++ == '/') && object) { if (cJSON_IsArray(object)) { size_t which = 0; /* parse array index */ while ((*pointer >= '0') && (*pointer <= '9')) { which = (10 * which) + (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); } else if (cJSON_IsObject(object)) { object = object->child; /* GetObjectItem. */ while (object && cJSONUtils_Pstrcasecmp((unsigned char*)object->string, (const unsigned char*)pointer)) { object = object->next; } /* skip to the next path token or end of string */ while (*pointer && (*pointer != '/')) { pointer++; } } else { return NULL; } } return object; }
cJSON *cJSONUtils_GetPointer(cJSON *object, const char *pointer) { /* follow path of the pointer */ while ((*pointer++ == '/') && object) { if (object->type == cJSON_Array) { int which = 0; /* parse array index */ while ((*pointer >= '0') && (*pointer <= '9')) { which = (10 * which) + (*pointer++ - '0'); } if (*pointer && (*pointer != '/')) { /* not end of string or new path token */ return 0; } object = cJSON_GetArrayItem(object, which); } else if (object->type == cJSON_Object) { object = object->child; /* GetObjectItem. */ while (object && cJSONUtils_Pstrcasecmp(object->string, pointer)) { object = object->next; } /* skip to the next path token or end of string */ while (*pointer && (*pointer != '/')) { pointer++; } } else { return 0; } } return object; }