This commit is contained in:
Daniel Lemire 2025-03-09 14:52:37 -04:00
parent 13ba430893
commit 13991611ed
3 changed files with 12 additions and 9 deletions

View File

@ -293,8 +293,7 @@ parse_number_string(UC const *p, UC const *pend,
answer.negative = (*p == UC('-')); answer.negative = (*p == UC('-'));
// C++17 20.19.3.(7.1) explicitly forbids '+' sign here // C++17 20.19.3.(7.1) explicitly forbids '+' sign here
if ((*p == UC('-')) || if ((*p == UC('-')) ||
(allow_leading_plus && (allow_leading_plus && !basic_json_fmt && *p == UC('+'))) {
!basic_json_fmt && *p == UC('+'))) {
++p; ++p;
if (p == pend) { if (p == pend) {
return report_parse_error<UC>( return report_parse_error<UC>(
@ -494,8 +493,7 @@ parse_int_string(UC const *p, UC const *pend, T &value,
answer.ptr = first; answer.ptr = first;
return answer; return answer;
} }
if ((*p == UC('-')) || if ((*p == UC('-')) || (allow_leading_plus && (*p == UC('+')))) {
(allow_leading_plus && (*p == UC('+')))) {
++p; ++p;
} }

View File

@ -306,9 +306,14 @@ from_chars_float_advanced(UC const *first, UC const *last, T &value,
} }
bool allow_leading_plus = uint64_t(fmt & chars_format::allow_leading_plus); bool allow_leading_plus = uint64_t(fmt & chars_format::allow_leading_plus);
bool basic_json_fmt = uint64_t(fmt & detail::basic_json_fmt); bool basic_json_fmt = uint64_t(fmt & detail::basic_json_fmt);
parsed_number_string_t<UC> pns = allow_leading_plus ? parsed_number_string_t<UC> pns =
(basic_json_fmt ? parse_number_string<true, true, UC>(first, last, options): parse_number_string<true, false, UC>(first, last, options)) : allow_leading_plus
(basic_json_fmt ? parse_number_string<false, true, UC>(first, last, options): parse_number_string<false, false, UC>(first, last, options)); ? (basic_json_fmt
? parse_number_string<true, true, UC>(first, last, options)
: parse_number_string<true, false, UC>(first, last, options))
: (basic_json_fmt
? parse_number_string<false, true, UC>(first, last, options)
: parse_number_string<false, false, UC>(first, last, options));
if (!pns.valid) { if (!pns.valid) {
if (uint64_t(fmt & chars_format::no_infnan)) { if (uint64_t(fmt & chars_format::no_infnan)) {
answer.ec = std::errc::invalid_argument; answer.ec = std::errc::invalid_argument;