in include/yyjson/yyjson.h [7601:7653]
yyjson_api_inline bool yyjson_ptr_ctx_append(yyjson_ptr_ctx *ctx,
yyjson_mut_val *key,
yyjson_mut_val *val) {
yyjson_mut_val *ctn, *pre_key, *pre_val, *cur_key, *cur_val;
if (!ctx || !ctx->ctn || !val) return false;
ctn = ctx->ctn;
if (yyjson_mut_is_obj(ctn)) {
if (!key) return false;
key->next = val;
pre_key = ctx->pre;
if (unsafe_yyjson_get_len(ctn) == 0) {
val->next = key;
ctn->uni.ptr = key;
ctx->pre = key;
} else if (!pre_key) {
pre_key = (yyjson_mut_val *)ctn->uni.ptr;
pre_val = pre_key->next;
val->next = pre_val->next;
pre_val->next = key;
ctn->uni.ptr = key;
ctx->pre = pre_key;
} else {
cur_key = pre_key->next->next;
cur_val = cur_key->next;
val->next = cur_val->next;
cur_val->next = key;
if (ctn->uni.ptr == cur_key) ctn->uni.ptr = key;
ctx->pre = cur_key;
}
} else {
pre_val = ctx->pre;
if (unsafe_yyjson_get_len(ctn) == 0) {
val->next = val;
ctn->uni.ptr = val;
ctx->pre = val;
} else if (!pre_val) {
pre_val = (yyjson_mut_val *)ctn->uni.ptr;
val->next = pre_val->next;
pre_val->next = val;
ctn->uni.ptr = val;
ctx->pre = pre_val;
} else {
cur_val = pre_val->next;
val->next = cur_val->next;
cur_val->next = val;
if (ctn->uni.ptr == cur_val) ctn->uni.ptr = val;
ctx->pre = cur_val;
}
}
unsafe_yyjson_inc_len(ctn);
return true;
}