Simplified copy logic and fixed string parsing allocation issue
This commit is contained in:
parent
adad380228
commit
6d89e4dc5a
47
src/memory.c
47
src/memory.c
@ -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){
|
static void _rjp__copy_object(RJP_value* dest, const RJP_value* src){
|
||||||
RJP_value* curr_dest, *curr_src = rjp_get_member(src);
|
dest->object.members = dest->object.last = 0;
|
||||||
if(curr_src){
|
for(RJP_value* curr = rjp_get_member(src);curr;curr = rjp_next_member(curr)){
|
||||||
dest->object.members = rjp_alloc(sizeof(RJP_object_member));
|
RJP_value copy_mem;
|
||||||
rjp_copy_value((RJP_value*)dest->object.members, curr_src);
|
rjp_copy_value(©_mem, curr);
|
||||||
_rjp__strcpy(&dest->object.members->name, &((RJP_object_member*)curr_src)->name);
|
rjp_add_member(dest, rjp_member_name(curr), rjp_member_name_length(curr), copy_mem);
|
||||||
dest->object.last = dest->object.members;
|
|
||||||
curr_dest = (RJP_value*)dest->object.last;
|
|
||||||
}else{
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
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){
|
static void _rjp__copy_array(RJP_value* dest, const RJP_value* src){
|
||||||
RJP_value* curr_dest, *curr_src = rjp_get_element(src);
|
dest->array.elements = dest->array.last = 0;
|
||||||
if(curr_src){
|
for(RJP_value* curr = rjp_get_element(src);curr;curr = rjp_next_element(curr)){
|
||||||
dest->array.elements = rjp_alloc(sizeof(RJP_array_element));
|
RJP_value copy_mem;
|
||||||
rjp_copy_value((RJP_value*)dest->array.elements, curr_src);
|
rjp_copy_value(©_mem, curr);
|
||||||
dest->array.last = dest->array.elements;
|
rjp_add_element(dest, copy_mem);
|
||||||
curr_dest = (RJP_value*)dest->array.last;
|
|
||||||
}else{
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
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){
|
void rjp_copy_value(RJP_value* dest, const RJP_value* src){
|
||||||
dest->parent = src->parent;
|
|
||||||
dest->type = src->type;
|
dest->type = src->type;
|
||||||
|
|
||||||
switch(src->type){
|
switch(src->type){
|
||||||
@ -87,4 +62,4 @@ void rjp_copy_value(RJP_value* dest, const RJP_value* src){
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -344,7 +344,7 @@ size_t _rjp__value_strlen(RJP_value* root){
|
|||||||
case json_null:
|
case json_null:
|
||||||
return 4;
|
return 4;
|
||||||
case json_string:
|
case json_string:
|
||||||
return root->string.length;
|
return rjp_escape_strlen(root->string.value) + 2; //"";
|
||||||
case json_array:
|
case json_array:
|
||||||
return _rjp__array_strlen(root);
|
return _rjp__array_strlen(root);
|
||||||
case json_object:
|
case json_object:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user