Simplified copy logic and fixed string parsing allocation issue
This commit is contained in:
parent
adad380228
commit
6d89e4dc5a
45
src/memory.c
45
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){
|
||||
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(©_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(©_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){
|
||||
|
||||
@ -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:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user