Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party CJSON
提交
033a5425
T
Third Party CJSON
项目概览
OpenHarmony
/
Third Party CJSON
大约 1 年 前同步成功
通知
6
Star
22
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party CJSON
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
033a5425
编写于
3月 14, 2017
作者:
M
Max Bruckner
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
parse_array: Use parsebuffer
上级
fd0320cf
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
79 addition
and
30 deletion
+79
-30
cJSON.c
cJSON.c
+61
-27
tests/parse_array.c
tests/parse_array.c
+12
-2
tests/print_array.c
tests/print_array.c
+6
-1
未找到文件。
cJSON.c
浏览文件 @
033a5425
...
...
@@ -898,7 +898,7 @@ static cJSON_bool print_string(const cJSON * const item, printbuffer * const p,
/* Predeclare these prototypes. */
static
const
unsigned
char
*
parse_value
(
cJSON
*
const
item
,
parse_buffer
*
const
input_buffer
,
const
unsigned
char
**
const
ep
,
const
internal_hooks
*
const
hooks
);
static
cJSON_bool
print_value
(
const
cJSON
*
const
item
,
const
size_t
depth
,
const
cJSON_bool
format
,
printbuffer
*
const
output_buffer
,
const
internal_hooks
*
const
hooks
);
static
const
unsigned
char
*
parse_array
(
cJSON
*
const
item
,
const
unsigned
char
*
input
,
const
unsigned
char
**
const
ep
,
const
internal_hooks
*
const
hooks
);
static
const
unsigned
char
*
parse_array
(
cJSON
*
const
item
,
parse_buffer
*
const
input_buffer
,
const
unsigned
char
**
const
ep
,
const
internal_hooks
*
const
hooks
);
static
cJSON_bool
print_array
(
const
cJSON
*
const
item
,
const
size_t
depth
,
const
cJSON_bool
format
,
printbuffer
*
const
output_buffer
,
const
internal_hooks
*
const
hooks
);
static
const
unsigned
char
*
parse_object
(
cJSON
*
const
item
,
const
unsigned
char
*
input
,
const
unsigned
char
**
const
ep
,
const
internal_hooks
*
const
hooks
);
static
cJSON_bool
print_object
(
const
cJSON
*
const
item
,
const
size_t
depth
,
const
cJSON_bool
format
,
printbuffer
*
const
output_buffer
,
const
internal_hooks
*
const
hooks
);
...
...
@@ -916,15 +916,20 @@ static const unsigned char *skip_whitespace(const unsigned char *in)
static
parse_buffer
*
buffer_skip_whitespace
(
parse_buffer
*
const
buffer
)
{
const
unsigned
char
*
skipped_pointer
=
NULL
;
if
((
buffer
==
NULL
)
||
(
buffer
->
content
==
NULL
))
{
return
NULL
;
}
skipped_pointer
=
skip_whitespace
(
buffer_at_offset
(
buffer
));
buffer
->
offset
=
(
size_t
)(
skipped_pointer
-
buffer
->
content
);
while
(
can_access_at_index
(
buffer
,
0
)
&&
(
buffer_at_offset
(
buffer
)[
0
]
<=
32
))
{
buffer
->
offset
++
;
}
if
(
buffer
->
offset
==
buffer
->
length
)
{
buffer
->
offset
--
;
}
return
buffer
;
}
...
...
@@ -1102,6 +1107,7 @@ CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const i
/* Parser core - when encountering text, process appropriately. */
static
const
unsigned
char
*
parse_value
(
cJSON
*
const
item
,
parse_buffer
*
const
input_buffer
,
const
unsigned
char
**
const
error_pointer
,
const
internal_hooks
*
const
hooks
)
{
const
unsigned
char
*
content_pointer
=
NULL
;
if
((
input_buffer
==
NULL
)
||
(
input_buffer
->
content
==
NULL
))
{
return
NULL
;
/* no input */
...
...
@@ -1133,22 +1139,43 @@ static const unsigned char *parse_value(cJSON * const item, parse_buffer * cons
/* string */
if
(
can_access_at_index
(
input_buffer
,
0
)
&&
(
buffer_at_offset
(
input_buffer
)[
0
]
==
'\"'
))
{
return
parse_string
(
item
,
buffer_at_offset
(
input_buffer
),
error_pointer
,
hooks
);
content_pointer
=
parse_string
(
item
,
buffer_at_offset
(
input_buffer
),
error_pointer
,
hooks
);
if
(
content_pointer
==
NULL
)
{
return
NULL
;
}
input_buffer
->
offset
=
(
size_t
)(
content_pointer
-
input_buffer
->
content
);
return
buffer_at_offset
(
input_buffer
);
}
/* number */
if
(
can_access_at_index
(
input_buffer
,
0
)
&&
((
buffer_at_offset
(
input_buffer
)[
0
]
==
'-'
)
||
((
buffer_at_offset
(
input_buffer
)[
0
]
>=
'0'
)
&&
(
buffer_at_offset
(
input_buffer
)[
0
]
<=
'9'
))))
{
return
parse_number
(
item
,
buffer_at_offset
(
input_buffer
));
content_pointer
=
parse_number
(
item
,
buffer_at_offset
(
input_buffer
));
if
(
content_pointer
==
NULL
)
{
return
NULL
;
}
input_buffer
->
offset
=
(
size_t
)(
content_pointer
-
input_buffer
->
content
);
return
buffer_at_offset
(
input_buffer
);
}
/* array */
if
(
can_access_at_index
(
input_buffer
,
0
)
&&
(
buffer_at_offset
(
input_buffer
)[
0
]
==
'['
))
{
return
parse_array
(
item
,
buffer_at_offset
(
input_buffer
)
,
error_pointer
,
hooks
);
return
parse_array
(
item
,
input_buffer
,
error_pointer
,
hooks
);
}
/* object */
if
(
can_access_at_index
(
input_buffer
,
0
)
&&
(
buffer_at_offset
(
input_buffer
)[
0
]
==
'{'
))
{
return
parse_object
(
item
,
buffer_at_offset
(
input_buffer
),
error_pointer
,
hooks
);
content_pointer
=
parse_object
(
item
,
buffer_at_offset
(
input_buffer
),
error_pointer
,
hooks
);
if
(
content_pointer
==
NULL
)
{
return
NULL
;
}
input_buffer
->
offset
=
(
size_t
)(
content_pointer
-
input_buffer
->
content
);
return
buffer_at_offset
(
input_buffer
);
}
/* failure. */
...
...
@@ -1247,28 +1274,36 @@ static cJSON_bool print_value(const cJSON * const item, const size_t depth, cons
}
/* Build an array from input text. */
static
const
unsigned
char
*
parse_array
(
cJSON
*
const
item
,
const
unsigned
char
*
input
,
const
unsigned
char
**
const
error_pointer
,
const
internal_hooks
*
const
hooks
)
static
const
unsigned
char
*
parse_array
(
cJSON
*
const
item
,
parse_buffer
*
const
input_buffer
,
const
unsigned
char
**
const
error_pointer
,
const
internal_hooks
*
const
hooks
)
{
cJSON
*
head
=
NULL
;
/* head of the linked list */
cJSON
*
current_item
=
NULL
;
parse_buffer
input_buffer
;
if
(
*
input
!=
'['
)
if
(
buffer_at_offset
(
input_buffer
)[
0
]
!=
'['
)
{
/* not an array */
*
error_pointer
=
input
;
*
error_pointer
=
buffer_at_offset
(
input_buffer
)
;
goto
fail
;
}
input
=
skip_whitespace
(
input
+
1
);
if
(
*
input
==
']'
)
input_buffer
->
offset
++
;
buffer_skip_whitespace
(
input_buffer
);
if
(
can_access_at_index
(
input_buffer
,
0
)
&&
(
buffer_at_offset
(
input_buffer
)[
0
]
==
']'
))
{
/* empty array */
goto
success
;
}
/* check if we skipped to the end of the buffer */
if
(
cannot_access_at_index
(
input_buffer
,
0
))
{
input_buffer
->
offset
--
;
*
error_pointer
=
buffer_at_offset
(
input_buffer
);
goto
fail
;
}
/* step back to character in front of the first element */
input
--
;
input
_buffer
->
offset
--
;
/* loop through the comma separated array elements */
do
{
...
...
@@ -1294,22 +1329,19 @@ static const unsigned char *parse_array(cJSON * const item, const unsigned char
}
/* parse next value */
input
=
skip_whitespace
(
input
+
1
);
input_buffer
.
content
=
(
const
unsigned
char
*
)
input
;
input_buffer
.
offset
=
0
;
input_buffer
.
length
=
strlen
((
const
char
*
)
input
)
+
sizeof
(
""
);
input
=
parse_value
(
current_item
,
&
input_buffer
,
error_pointer
,
hooks
);
input
=
skip_whitespace
(
input
);
if
(
input
==
NULL
)
input_buffer
->
offset
++
;
buffer_skip_whitespace
(
input_buffer
);
if
(
parse_value
(
current_item
,
input_buffer
,
error_pointer
,
hooks
)
==
NULL
)
{
goto
fail
;
/* failed to parse value */
}
buffer_skip_whitespace
(
input_buffer
);
}
while
(
*
input
==
','
);
while
(
can_access_at_index
(
input_buffer
,
0
)
&&
(
buffer_at_offset
(
input_buffer
)[
0
]
==
','
)
);
if
(
*
input
!=
']'
)
if
(
cannot_access_at_index
(
input_buffer
,
0
)
||
buffer_at_offset
(
input_buffer
)[
0
]
!=
']'
)
{
*
error_pointer
=
input
;
*
error_pointer
=
buffer_at_offset
(
input_buffer
)
;
goto
fail
;
/* expected end of array */
}
...
...
@@ -1317,7 +1349,9 @@ success:
item
->
type
=
cJSON_Array
;
item
->
child
=
head
;
return
input
+
1
;
input_buffer
->
offset
++
;
return
buffer_at_offset
(
input_buffer
);
fail:
if
(
head
!=
NULL
)
...
...
tests/parse_array.c
浏览文件 @
033a5425
...
...
@@ -46,13 +46,23 @@ static void assert_is_array(cJSON *array_item)
static
void
assert_not_array
(
const
char
*
json
)
{
TEST_ASSERT_NULL
(
parse_array
(
item
,
(
const
unsigned
char
*
)
json
,
&
error_pointer
,
&
global_hooks
));
parse_buffer
buffer
;
buffer
.
content
=
(
const
unsigned
char
*
)
json
;
buffer
.
length
=
strlen
(
json
)
+
sizeof
(
""
);
buffer
.
offset
=
0
;
TEST_ASSERT_NULL
(
parse_array
(
item
,
&
buffer
,
&
error_pointer
,
&
global_hooks
));
assert_is_invalid
(
item
);
}
static
void
assert_parse_array
(
const
char
*
json
)
{
TEST_ASSERT_NOT_NULL
(
parse_array
(
item
,
(
const
unsigned
char
*
)
json
,
&
error_pointer
,
&
global_hooks
));
parse_buffer
buffer
;
buffer
.
content
=
(
const
unsigned
char
*
)
json
;
buffer
.
length
=
strlen
(
json
)
+
sizeof
(
""
);
buffer
.
offset
=
0
;
TEST_ASSERT_NOT_NULL
(
parse_array
(
item
,
&
buffer
,
&
error_pointer
,
&
global_hooks
));
assert_is_array
(
item
);
}
...
...
tests/print_array.c
浏览文件 @
033a5425
...
...
@@ -35,6 +35,11 @@ static void assert_print_array(const char * const expected, const char * const i
printbuffer
formatted_buffer
;
printbuffer
unformatted_buffer
;
parse_buffer
parsebuffer
;
parsebuffer
.
content
=
(
const
unsigned
char
*
)
input
;
parsebuffer
.
length
=
strlen
(
input
)
+
sizeof
(
""
);
parsebuffer
.
offset
=
0
;
/* buffer for formatted printing */
formatted_buffer
.
buffer
=
printed_formatted
;
formatted_buffer
.
length
=
sizeof
(
printed_formatted
);
...
...
@@ -48,7 +53,7 @@ static void assert_print_array(const char * const expected, const char * const i
unformatted_buffer
.
noalloc
=
true
;
memset
(
item
,
0
,
sizeof
(
item
));
TEST_ASSERT_NOT_NULL_MESSAGE
(
parse_array
(
item
,
(
const
unsigned
char
*
)
input
,
&
error_pointer
,
&
global_hooks
),
"Failed to parse array."
);
TEST_ASSERT_NOT_NULL_MESSAGE
(
parse_array
(
item
,
&
parsebuffer
,
&
error_pointer
,
&
global_hooks
),
"Failed to parse array."
);
TEST_ASSERT_TRUE_MESSAGE
(
print_array
(
item
,
0
,
false
,
&
unformatted_buffer
,
&
global_hooks
),
"Failed to print unformatted string."
);
TEST_ASSERT_EQUAL_STRING_MESSAGE
(
input
,
printed_unformatted
,
"Unformatted array is not correct."
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录