in parson.c [802:863]
static _Ptr<JSON_Value> parse_object_value(_Ptr<_Nt_array_ptr<const char>> string, size_t nesting) {
_Ptr<JSON_Value> output_value = NULL;
_Ptr<JSON_Value> new_value = NULL;
_Ptr<JSON_Object> output_object = NULL;
_Nt_array_ptr<char> new_key = NULL;
output_value = json_value_init_object();
if (output_value == NULL) {
return NULL;
}
if (**string != '{') {
json_value_free(output_value);
return NULL;
}
output_object = json_value_get_object(output_value);
SKIP_CHAR(string);
SKIP_WHITESPACES(string);
if (**string == '}') { /* empty object */
SKIP_CHAR(string);
return output_value;
}
while (**string != '\0') {
new_key = get_quoted_string(string);
if (new_key == NULL) {
json_value_free(output_value);
return NULL;
}
SKIP_WHITESPACES(string);
if (**string != ':') {
parson_free(char, new_key);
json_value_free(output_value);
return NULL;
}
SKIP_CHAR(string);
new_value = parse_value(string, nesting);
if (new_value == NULL) {
parson_free(char, new_key);
json_value_free(output_value);
return NULL;
}
if (json_object_add(output_object, new_key, new_value) == JSONFailure) {
parson_free(char, new_key);
json_value_free(new_value);
json_value_free(output_value);
return NULL;
}
parson_free(char, new_key);
SKIP_WHITESPACES(string);
if (**string != ',') {
break;
}
SKIP_CHAR(string);
SKIP_WHITESPACES(string);
}
SKIP_WHITESPACES(string);
if (**string != '}' || /* Trim object after parsing is over */
json_object_resize(output_object, json_object_get_count(output_object)) == JSONFailure) {
json_value_free(output_value);
return NULL;
}
SKIP_CHAR(string);
return output_value;
}