in parson.c [1953:2003]
JSON_Status json_object_dotset_value(JSON_Object *object : itype(_Ptr<JSON_Object>), const char *name : itype(_Nt_array_ptr<const char>), JSON_Value *value : itype(_Ptr<JSON_Value>)) {
_Nt_array_ptr<const char> dot_pos = NULL;
_Ptr<JSON_Value> temp_value = NULL;
_Ptr<JSON_Value> new_value = NULL;
_Ptr<JSON_Object> temp_object = NULL;
_Ptr<JSON_Object> new_object = NULL;
JSON_Status status = JSONFailure;
size_t name_len = 0;
if (object == NULL || name == NULL || value == NULL) {
return JSONFailure;
}
dot_pos = (_Nt_array_ptr<const char>)strchr(name, '.');
if (dot_pos == NULL) {
return json_object_set_value(object, name, value);
}
_Nt_array_ptr<const char> after_dot = NULL;
_Unchecked {
after_dot = _Assume_bounds_cast<_Nt_array_ptr<const char>>(dot_pos + 1, count(0));
}
name_len = dot_pos - name;
_Nt_array_ptr<const char> name_with_len : count(name_len) = NULL;
_Unchecked {
name_with_len = _Assume_bounds_cast<_Nt_array_ptr<const char>>(name, count(name_len));
}
temp_value = json_object_getn_value(object, name_with_len, 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, after_dot, 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, after_dot, value);
if (status != JSONSuccess) {
json_value_free(new_value);
return JSONFailure;
}
status = json_object_addn(object, name_with_len, name_len, new_value);
if (status != JSONSuccess) {
json_object_dotremove_internal(new_object, after_dot, 0);
json_value_free(new_value);
return JSONFailure;
}
return JSONSuccess;
}