diff --git a/src/memory.c b/src/memory.c index e7e6ea1..145ba9a 100644 --- a/src/memory.c +++ b/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){ @@ -87,4 +62,4 @@ void rjp_copy_value(RJP_value* dest, const RJP_value* src){ default: break; }; -} \ No newline at end of file +} diff --git a/src/strings.c b/src/strings.c index eb48d19..630dfa9 100644 --- a/src/strings.c +++ b/src/strings.c @@ -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: