Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party CJSON
提交
749fefc0
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,发现更多精彩内容 >>
提交
749fefc0
编写于
4月 08, 2017
作者:
M
Max Bruckner
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Make parse_number locale independent
上级
50b3c30d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
48 addition
and
3 deletion
+48
-3
cJSON.c
cJSON.c
+48
-3
未找到文件。
cJSON.c
浏览文件 @
749fefc0
...
...
@@ -31,6 +31,7 @@
#include <float.h>
#include <limits.h>
#include <ctype.h>
#include <locale.h>
#pragma GCC visibility pop
#include "cJSON.h"
...
...
@@ -177,19 +178,63 @@ CJSON_PUBLIC(void) cJSON_Delete(cJSON *c)
}
}
/* get the decimal point character of the current locale */
static
unsigned
char
get_decimal_point
(
void
)
{
struct
lconv
*
lconv
=
localeconv
();
return
(
unsigned
char
)
lconv
->
decimal_point
[
0
];
}
/* Parse the input text to generate a number, and populate the result into item. */
static
const
unsigned
char
*
parse_number
(
cJSON
*
const
item
,
const
unsigned
char
*
const
input
)
{
double
number
=
0
;
unsigned
char
*
after_end
=
NULL
;
unsigned
char
number_c_string
[
64
];
unsigned
char
decimal_point
=
get_decimal_point
();
size_t
i
=
0
;
if
(
input
==
NULL
)
{
return
NULL
;
}
number
=
strtod
((
const
char
*
)
input
,
(
char
**
)
&
after_end
);
if
(
input
==
after_end
)
/* copy the number into a temporary buffer and replace '.' with the decimal point
* of the current locale (for strtod) */
for
(
i
=
0
;
(
i
<
(
sizeof
(
number_c_string
)
-
1
))
&&
(
input
[
i
]
!=
'\0'
);
i
++
)
{
switch
(
input
[
i
])
{
case
'0'
:
case
'1'
:
case
'2'
:
case
'3'
:
case
'4'
:
case
'5'
:
case
'6'
:
case
'7'
:
case
'8'
:
case
'9'
:
case
'+'
:
case
'-'
:
case
'e'
:
case
'E'
:
number_c_string
[
i
]
=
input
[
i
];
break
;
case
'.'
:
number_c_string
[
i
]
=
decimal_point
;
break
;
default:
goto
loop_end
;
}
}
loop_end:
number_c_string
[
i
]
=
'\0'
;
number
=
strtod
((
const
char
*
)
number_c_string
,
(
char
**
)
&
after_end
);
if
(
number_c_string
==
after_end
)
{
return
NULL
;
/* parse_error */
}
...
...
@@ -212,7 +257,7 @@ static const unsigned char *parse_number(cJSON * const item, const unsigned char
item
->
type
=
cJSON_Number
;
return
after_end
;
return
input
+
(
after_end
-
number_c_string
)
;
}
/* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录