in lib/parson.c [2132:2181]
JSON_Status json_object_dotset_value(JSON_Object *object, const char *name, JSON_Value *value) {
const char *dot_pos = NULL;
JSON_Value *temp_value = NULL, *new_value = NULL;
JSON_Object *temp_object = NULL, *new_object = NULL;
JSON_Status status = JSONFailure;
size_t name_len = 0;
char *name_copy = NULL;
if (object == NULL || name == NULL || value == NULL) {
return JSONFailure;
}
dot_pos = strchr(name, '.');
if (dot_pos == NULL) {
return json_object_set_value(object, name, value);
}
name_len = dot_pos - name;
temp_value = json_object_getn_value(object, name, name_len);
if (temp_value) {
/* Don't overwrite existing non-object (unlike json_object_set_value, but it shouldn't be changed at this point) */
if (json_value_get_type(temp_value) != JSONObject) {
return JSONFailure;
}
temp_object = json_value_get_object(temp_value);
return json_object_dotset_value(temp_object, dot_pos + 1, value);
}
new_value = json_value_init_object();
if (new_value == NULL) {
return JSONFailure;
}
new_object = json_value_get_object(new_value);
status = json_object_dotset_value(new_object, dot_pos + 1, value);
if (status != JSONSuccess) {
json_value_free(new_value);
return JSONFailure;
}
name_copy = parson_strndup(name, name_len);
if (!name_copy) {
json_object_dotremove_internal(new_object, dot_pos + 1, 0);
json_value_free(new_value);
return JSONFailure;
}
status = json_object_add(object, name_copy, new_value);
if (status != JSONSuccess) {
parson_free(name_copy);
json_object_dotremove_internal(new_object, dot_pos + 1, 0);
json_value_free(new_value);
return JSONFailure;
}
return JSONSuccess;
}