Simplified copy logic and fixed string parsing allocation issue

This commit is contained in:
Rexy712 2018-12-19 14:06:43 -08:00
parent adad380228
commit 6d89e4dc5a
2 changed files with 12 additions and 37 deletions

View File

@ -21,48 +21,23 @@ void _rjp__strcpy(RJP_string* dest, const RJP_string* src){
}
static void _rjp__copy_object(RJP_value* dest, const RJP_value* src){
RJP_value* curr_dest, *curr_src = rjp_get_member(src);
if(curr_src){
dest->object.members = rjp_alloc(sizeof(RJP_object_member));
rjp_copy_value((RJP_value*)dest->object.members, curr_src);
_rjp__strcpy(&dest->object.members->name, &((RJP_object_member*)curr_src)->name);
dest->object.last = dest->object.members;
curr_dest = (RJP_value*)dest->object.last;
}else{
return;
dest->object.members = dest->object.last = 0;
for(RJP_value* curr = rjp_get_member(src);curr;curr = rjp_next_member(curr)){
RJP_value copy_mem;
rjp_copy_value(&copy_mem, curr);
rjp_add_member(dest, rjp_member_name(curr), rjp_member_name_length(curr), copy_mem);
}
for(curr_src = rjp_next_member(curr_src);curr_src;curr_src = rjp_next_member(curr_src)){
((RJP_object_member*)curr_dest)->next = rjp_alloc(sizeof(RJP_object_member));
curr_dest = rjp_next_member(curr_dest);
rjp_copy_value(curr_dest, curr_src);
_rjp__strcpy(&((RJP_object_member*)curr_dest)->name, &((RJP_object_member*)curr_src)->name);
}
dest->object.last = (RJP_object_member*)curr_dest;
dest->object.last->next = NULL;
dest->object.num_members = src->object.num_members;
}
static void _rjp__copy_array(RJP_value* dest, const RJP_value* src){
RJP_value* curr_dest, *curr_src = rjp_get_element(src);
if(curr_src){
dest->array.elements = rjp_alloc(sizeof(RJP_array_element));
rjp_copy_value((RJP_value*)dest->array.elements, curr_src);
dest->array.last = dest->array.elements;
curr_dest = (RJP_value*)dest->array.last;
}else{
return;
dest->array.elements = dest->array.last = 0;
for(RJP_value* curr = rjp_get_element(src);curr;curr = rjp_next_element(curr)){
RJP_value copy_mem;
rjp_copy_value(&copy_mem, curr);
rjp_add_element(dest, copy_mem);
}
for(RJP_value* curr_src = rjp_get_element(src);curr_src;curr_src = rjp_next_element(curr_src)){
((RJP_array_element*)curr_dest)->next = rjp_alloc(sizeof(RJP_array_element));
curr_dest = rjp_next_element(curr_dest);
rjp_copy_value(curr_dest, curr_src);
}
dest->array.last = (RJP_array_element*)curr_dest;
dest->array.num_elements = src->array.num_elements;
}
void rjp_copy_value(RJP_value* dest, const RJP_value* src){
dest->parent = src->parent;
dest->type = src->type;
switch(src->type){

View File

@ -344,7 +344,7 @@ size_t _rjp__value_strlen(RJP_value* root){
case json_null:
return 4;
case json_string:
return root->string.length;
return rjp_escape_strlen(root->string.value) + 2; //"";
case json_array:
return _rjp__array_strlen(root);
case json_object: