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

@ -236,7 +236,7 @@ int main(int argc, char **argv) {
<< std::endl; << std::endl;
#endif #endif
} }
if(argc > 1) { if (argc > 1) {
fileload(argv[1]); fileload(argv[1]);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

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>(
@ -474,7 +473,7 @@ template <bool allow_leading_plus = false, typename T, typename UC>
fastfloat_really_inline FASTFLOAT_CONSTEXPR20 from_chars_result_t<UC> fastfloat_really_inline FASTFLOAT_CONSTEXPR20 from_chars_result_t<UC>
parse_int_string(UC const *p, UC const *pend, T &value, parse_int_string(UC const *p, UC const *pend, T &value,
parse_options_t<UC> options) { parse_options_t<UC> options) {
//chars_format const fmt = detail::adjust_for_feature_macros(options.format); // chars_format const fmt = detail::adjust_for_feature_macros(options.format);
int const base = options.base; int const base = options.base;
from_chars_result_t<UC> answer; from_chars_result_t<UC> answer;
@ -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;