mirror of
https://github.com/sogou/workflow.git
synced 2026-10-29 03:27:04 +08:00
update JSON parser copying json value.
This commit is contained in:
+17
-10
@@ -938,6 +938,7 @@ static int __copy_json_members(const json_object_t *src, json_object_t *dest)
|
||||
json_member_t *entry;
|
||||
json_member_t *memb;
|
||||
size_t len;
|
||||
int ret;
|
||||
|
||||
list_for_each(pos, &src->head)
|
||||
{
|
||||
@@ -947,10 +948,11 @@ static int __copy_json_members(const json_object_t *src, json_object_t *dest)
|
||||
if (!memb)
|
||||
return -1;
|
||||
|
||||
if (__copy_json_value(&entry->value, &memb->value) < 0)
|
||||
ret = __copy_json_value(&entry->value, &memb->value);
|
||||
if (ret < 0)
|
||||
{
|
||||
free(memb);
|
||||
return -1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
memcpy(memb->name, entry->name, len + 1);
|
||||
@@ -965,6 +967,7 @@ static int __copy_json_elements(const json_array_t *src, json_array_t *dest)
|
||||
struct list_head *pos;
|
||||
json_element_t *entry;
|
||||
json_element_t *elem;
|
||||
int ret;
|
||||
|
||||
list_for_each(pos, &src->head)
|
||||
{
|
||||
@@ -973,10 +976,11 @@ static int __copy_json_elements(const json_array_t *src, json_array_t *dest)
|
||||
return -1;
|
||||
|
||||
entry = list_entry(pos, json_element_t, list);
|
||||
if (__copy_json_value(&entry->value, &elem->value) < 0)
|
||||
ret = __copy_json_value(&entry->value, &elem->value);
|
||||
if (ret < 0)
|
||||
{
|
||||
free(elem);
|
||||
return -1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
list_add_tail(&elem->list, &dest->head);
|
||||
@@ -988,6 +992,7 @@ static int __copy_json_elements(const json_array_t *src, json_array_t *dest)
|
||||
static int __copy_json_value(const json_value_t *src, json_value_t *dest)
|
||||
{
|
||||
size_t len;
|
||||
int ret;
|
||||
|
||||
switch (src->type)
|
||||
{
|
||||
@@ -1007,24 +1012,26 @@ static int __copy_json_value(const json_value_t *src, json_value_t *dest)
|
||||
case JSON_VALUE_OBJECT:
|
||||
INIT_LIST_HEAD(&dest->value.object.head);
|
||||
dest->value.object.root.rb_node = NULL;
|
||||
if (__copy_json_members(&src->value.object, &dest->value.object) < 0)
|
||||
ret = __copy_json_members(&src->value.object, &dest->value.object);
|
||||
if (ret < 0)
|
||||
{
|
||||
__destroy_json_members(&dest->value.object);
|
||||
return -1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
dest->value.object.size = src->value.object.size;
|
||||
dest->value.object.size = ret;
|
||||
break;
|
||||
|
||||
case JSON_VALUE_ARRAY:
|
||||
INIT_LIST_HEAD(&dest->value.array.head);
|
||||
if (__copy_json_elements(&src->value.array, &dest->value.array) < 0)
|
||||
ret = __copy_json_elements(&src->value.array, &dest->value.array);
|
||||
if (ret < 0)
|
||||
{
|
||||
__destroy_json_elements(&dest->value.array);
|
||||
return -1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
dest->value.array.size = src->value.array.size;
|
||||
dest->value.array.size = ret;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user