in include/yyjson/yyjson.h [7255:7300]
yyjson_api_inline bool yyjson_mut_doc_ptr_addx(yyjson_mut_doc *doc,
const char *ptr, size_t len,
yyjson_mut_val *new_val,
bool create_parent,
yyjson_ptr_ctx *ctx,
yyjson_ptr_err *err) {
yyjson_ptr_set_err(NONE, NULL);
if (ctx) memset(ctx, 0, sizeof(*ctx));
if (yyjson_unlikely(!doc || !ptr || !new_val)) {
yyjson_ptr_set_err(PARAMETER, "input parameter is NULL");
return false;
}
if (yyjson_unlikely(len == 0)) {
if (doc->root) {
yyjson_ptr_set_err(SET_ROOT, "cannot set document's root");
return false;
} else {
doc->root = new_val;
return true;
}
}
if (yyjson_unlikely(*ptr != '/')) {
yyjson_ptr_set_err(SYNTAX, "no prefix '/'");
return false;
}
if (yyjson_unlikely(!doc->root && !create_parent)) {
yyjson_ptr_set_err(NULL_ROOT, "document's root is NULL");
return false;
}
if (yyjson_unlikely(!doc->root)) {
yyjson_mut_val *root = yyjson_mut_obj(doc);
if (yyjson_unlikely(!root)) {
yyjson_ptr_set_err(MEMORY_ALLOCATION, "failed to create value");
return false;
}
if (unsafe_yyjson_mut_ptr_putx(root, ptr, len, new_val, doc,
create_parent, true, ctx, err)) {
doc->root = root;
return true;
}
return false;
}
return unsafe_yyjson_mut_ptr_putx(doc->root, ptr, len, new_val, doc,
create_parent, true, ctx, err);
}