JSON_Status json_object_dotset_value()

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;
}