in include/yyjson/yyjson.c [1615:1653]
static usize yyjson_imut_copy(yyjson_val **val_ptr, char **buf_ptr,
yyjson_mut_val *mval) {
yyjson_val *val = *val_ptr;
yyjson_type type = unsafe_yyjson_get_type(mval);
if (type == YYJSON_TYPE_ARR || type == YYJSON_TYPE_OBJ) {
yyjson_mut_val *child = (yyjson_mut_val *)mval->uni.ptr;
usize len = unsafe_yyjson_get_len(mval), i;
usize val_sum = 1;
if (type == YYJSON_TYPE_OBJ) {
if (len) child = child->next->next;
len <<= 1;
} else {
if (len) child = child->next;
}
*val_ptr = val + 1;
for (i = 0; i < len; i++) {
val_sum += yyjson_imut_copy(val_ptr, buf_ptr, child);
child = child->next;
}
val->tag = mval->tag;
val->uni.ofs = val_sum * sizeof(yyjson_val);
return val_sum;
} else if (type == YYJSON_TYPE_STR || type == YYJSON_TYPE_RAW) {
char *buf = *buf_ptr;
usize len = unsafe_yyjson_get_len(mval);
memcpy((void *)buf, (const void *)mval->uni.str, len);
buf[len] = '\0';
val->tag = mval->tag;
val->uni.str = buf;
*val_ptr = val + 1;
*buf_ptr = buf + len + 1;
return 1;
} else {
val->tag = mval->tag;
val->uni = mval->uni;
*val_ptr = val + 1;
return 1;
}
}