Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party CJSON
提交
7f22948e
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,发现更多精彩内容 >>
提交
7f22948e
编写于
4月 30, 2017
作者:
M
Max Bruckner
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add cJSONUtils_SortObjectCaseSensitive
上级
b6745196
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
127 addition
and
116 deletion
+127
-116
cJSON_Utils.c
cJSON_Utils.c
+126
-116
cJSON_Utils.h
cJSON_Utils.h
+1
-0
未找到文件。
cJSON_Utils.c
浏览文件 @
7f22948e
...
...
@@ -425,6 +425,122 @@ cleanup:
return
detached_item
;
}
/* sort lists using mergesort */
static
cJSON
*
sort_list
(
cJSON
*
list
,
const
cJSON_bool
case_sensitive
)
{
cJSON
*
first
=
list
;
cJSON
*
second
=
list
;
cJSON
*
current_item
=
list
;
cJSON
*
result
=
list
;
cJSON
*
result_tail
=
NULL
;
if
((
list
==
NULL
)
||
(
list
->
next
==
NULL
))
{
/* One entry is sorted already. */
return
result
;
}
while
((
current_item
!=
NULL
)
&&
(
current_item
->
next
!=
NULL
)
&&
(
compare_strings
((
unsigned
char
*
)
current_item
->
string
,
(
unsigned
char
*
)
current_item
->
next
->
string
,
case_sensitive
)
<
0
))
{
/* Test for list sorted. */
current_item
=
current_item
->
next
;
}
if
((
current_item
==
NULL
)
||
(
current_item
->
next
==
NULL
))
{
/* Leave sorted lists unmodified. */
return
result
;
}
/* reset pointer to the beginning */
current_item
=
list
;
while
(
current_item
!=
NULL
)
{
/* Walk two pointers to find the middle. */
second
=
second
->
next
;
current_item
=
current_item
->
next
;
/* advances current_item two steps at a time */
if
(
current_item
!=
NULL
)
{
current_item
=
current_item
->
next
;
}
}
if
((
second
!=
NULL
)
&&
(
second
->
prev
!=
NULL
))
{
/* Split the lists */
second
->
prev
->
next
=
NULL
;
}
/* Recursively sort the sub-lists. */
first
=
sort_list
(
first
,
case_sensitive
);
second
=
sort_list
(
second
,
case_sensitive
);
result
=
NULL
;
/* Merge the sub-lists */
while
((
first
!=
NULL
)
&&
(
second
!=
NULL
))
{
cJSON
*
smaller
=
NULL
;
if
(
compare_strings
((
unsigned
char
*
)
first
->
string
,
(
unsigned
char
*
)
second
->
string
,
false
)
<
0
)
{
smaller
=
first
;
}
else
{
smaller
=
second
;
}
if
(
result
==
NULL
)
{
/* start merged list with the smaller element */
result_tail
=
smaller
;
result
=
smaller
;
}
else
{
/* add smaller element to the list */
result_tail
->
next
=
smaller
;
smaller
->
prev
=
result_tail
;
result_tail
=
smaller
;
}
if
(
first
==
smaller
)
{
first
=
first
->
next
;
}
else
{
second
=
second
->
next
;
}
}
if
(
first
!=
NULL
)
{
/* Append rest of first list. */
if
(
result
==
NULL
)
{
return
first
;
}
result_tail
->
next
=
first
;
first
->
prev
=
result_tail
;
}
if
(
second
!=
NULL
)
{
/* Append rest of second list */
if
(
result
==
NULL
)
{
return
second
;
}
result_tail
->
next
=
second
;
second
->
prev
=
result_tail
;
}
return
result
;
}
static
void
sort_object
(
cJSON
*
const
object
,
const
cJSON_bool
case_sensitive
)
{
object
->
child
=
sort_list
(
object
->
child
,
case_sensitive
);
}
static
cJSON_bool
compare_json
(
cJSON
*
a
,
cJSON
*
b
,
const
cJSON_bool
case_sensitive
)
{
if
((
a
==
NULL
)
||
(
b
==
NULL
)
||
((
a
->
type
&
0xFF
)
!=
(
b
->
type
&
0xFF
)))
...
...
@@ -477,8 +593,8 @@ static cJSON_bool compare_json(cJSON *a, cJSON *b, const cJSON_bool case_sensiti
}
case
cJSON_Object
:
cJSONUtils_SortObject
(
a
);
cJSONUtils_SortObject
(
b
);
sort_object
(
a
,
case_sensitive
);
sort_object
(
b
,
case_sensitive
);
for
((
void
)(
a
=
a
->
child
),
b
=
b
->
child
;
(
a
!=
NULL
)
&&
(
b
!=
NULL
);
(
void
)(
a
=
a
->
next
),
b
=
b
->
next
)
{
cJSON_bool
identical
=
false
;
...
...
@@ -1018,8 +1134,8 @@ static void create_patches(cJSON * const patches, const unsigned char * const pa
{
cJSON
*
from_child
=
NULL
;
cJSON
*
to_child
=
NULL
;
cJSONUtils_SortObject
(
from
);
cJSONUtils_SortObject
(
to
);
sort_object
(
from
,
case_sensitive
);
sort_object
(
to
,
case_sensitive
);
from_child
=
from
->
child
;
to_child
=
to
->
child
;
...
...
@@ -1096,120 +1212,14 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatchesCaseSensitive(cJSON * const from
return
patches
;
}
/* sort lists using mergesort */
static
cJSON
*
sort_list
(
cJSON
*
list
,
const
cJSON_bool
case_sensitive
)
CJSON_PUBLIC
(
void
)
cJSONUtils_SortObject
(
cJSON
*
const
object
)
{
cJSON
*
first
=
list
;
cJSON
*
second
=
list
;
cJSON
*
current_item
=
list
;
cJSON
*
result
=
list
;
cJSON
*
result_tail
=
NULL
;
if
((
list
==
NULL
)
||
(
list
->
next
==
NULL
))
{
/* One entry is sorted already. */
return
result
;
}
while
((
current_item
!=
NULL
)
&&
(
current_item
->
next
!=
NULL
)
&&
(
compare_strings
((
unsigned
char
*
)
current_item
->
string
,
(
unsigned
char
*
)
current_item
->
next
->
string
,
case_sensitive
)
<
0
))
{
/* Test for list sorted. */
current_item
=
current_item
->
next
;
}
if
((
current_item
==
NULL
)
||
(
current_item
->
next
==
NULL
))
{
/* Leave sorted lists unmodified. */
return
result
;
}
/* reset pointer to the beginning */
current_item
=
list
;
while
(
current_item
!=
NULL
)
{
/* Walk two pointers to find the middle. */
second
=
second
->
next
;
current_item
=
current_item
->
next
;
/* advances current_item two steps at a time */
if
(
current_item
!=
NULL
)
{
current_item
=
current_item
->
next
;
}
}
if
((
second
!=
NULL
)
&&
(
second
->
prev
!=
NULL
))
{
/* Split the lists */
second
->
prev
->
next
=
NULL
;
}
/* Recursively sort the sub-lists. */
first
=
sort_list
(
first
,
case_sensitive
);
second
=
sort_list
(
second
,
case_sensitive
);
result
=
NULL
;
/* Merge the sub-lists */
while
((
first
!=
NULL
)
&&
(
second
!=
NULL
))
{
cJSON
*
smaller
=
NULL
;
if
(
compare_strings
((
unsigned
char
*
)
first
->
string
,
(
unsigned
char
*
)
second
->
string
,
false
)
<
0
)
{
smaller
=
first
;
}
else
{
smaller
=
second
;
}
if
(
result
==
NULL
)
{
/* start merged list with the smaller element */
result_tail
=
smaller
;
result
=
smaller
;
}
else
{
/* add smaller element to the list */
result_tail
->
next
=
smaller
;
smaller
->
prev
=
result_tail
;
result_tail
=
smaller
;
}
if
(
first
==
smaller
)
{
first
=
first
->
next
;
}
else
{
second
=
second
->
next
;
}
}
if
(
first
!=
NULL
)
{
/* Append rest of first list. */
if
(
result
==
NULL
)
{
return
first
;
}
result_tail
->
next
=
first
;
first
->
prev
=
result_tail
;
}
if
(
second
!=
NULL
)
{
/* Append rest of second list */
if
(
result
==
NULL
)
{
return
second
;
}
result_tail
->
next
=
second
;
second
->
prev
=
result_tail
;
}
return
result
;
sort_object
(
object
,
false
);
}
CJSON_PUBLIC
(
void
)
cJSONUtils_SortObject
(
cJSON
*
const
object
)
CJSON_PUBLIC
(
void
)
cJSONUtils_SortObject
CaseSensitive
(
cJSON
*
const
object
)
{
object
->
child
=
sort_list
(
object
->
child
,
fals
e
);
sort_object
(
object
,
tru
e
);
}
CJSON_PUBLIC
(
cJSON
*
)
cJSONUtils_MergePatch
(
cJSON
*
target
,
const
cJSON
*
const
patch
)
...
...
@@ -1262,8 +1272,8 @@ static cJSON *generate_merge_patch(cJSON * const from, cJSON * const to, const c
return
cJSON_Duplicate
(
to
,
1
);
}
cJSONUtils_SortObject
(
from
);
cJSONUtils_SortObject
(
to
);
sort_object
(
from
,
case_sensitive
);
sort_object
(
to
,
case_sensitive
);
from_child
=
from
->
child
;
to_child
=
to
->
child
;
...
...
cJSON_Utils.h
浏览文件 @
7f22948e
...
...
@@ -70,3 +70,4 @@ CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const obje
/* Sorts the members of the object into alphabetical order. */
CJSON_PUBLIC
(
void
)
cJSONUtils_SortObject
(
cJSON
*
const
object
);
CJSON_PUBLIC
(
void
)
cJSONUtils_SortObjectCaseSensitive
(
cJSON
*
const
object
);
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录