mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-12-19 09:05:17 +08:00
libstdc++: Don't use std::tolower in <charconv> [PR103911]
As with std::isdigit in r12-6281-gc83ecfbe74a5cf, we shouldn't be using
std::tolower in <charconv> either.
PR libstdc++/103911
libstdc++-v3/ChangeLog:
* src/c++17/floating_from_chars.cc (find_end_of_float): Accept
two delimeters for the exponent part in the form of a possibly
NULL string of length two. Don't use std::tolower.
(pattern): Adjust calls to find_end_of_float accordingly.
(cherry picked from commit 86d821ddf5
)
This commit is contained in:
parent
39c56695c7
commit
eed2cd48cd
@ -40,7 +40,6 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <cctype>
|
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#include <bits/functexcept.h>
|
#include <bits/functexcept.h>
|
||||||
#if _GLIBCXX_HAVE_XLOCALE_H
|
#if _GLIBCXX_HAVE_XLOCALE_H
|
||||||
@ -142,10 +141,10 @@ namespace
|
|||||||
|
|
||||||
// Find initial portion of [first, last) containing a floating-point number.
|
// Find initial portion of [first, last) containing a floating-point number.
|
||||||
// The string `digits` is either `dec_digits` or `hex_digits`
|
// The string `digits` is either `dec_digits` or `hex_digits`
|
||||||
// and `exp` is 'e' or 'p' or '\0'.
|
// and `exp` is "eE", "pP" or NULL.
|
||||||
const char*
|
const char*
|
||||||
find_end_of_float(const char* first, const char* last, const char* digits,
|
find_end_of_float(const char* first, const char* last, const char* digits,
|
||||||
char exp)
|
const char *exp)
|
||||||
{
|
{
|
||||||
while (first < last && strchr(digits, *first) != nullptr)
|
while (first < last && strchr(digits, *first) != nullptr)
|
||||||
++first;
|
++first;
|
||||||
@ -155,7 +154,7 @@ namespace
|
|||||||
while (first < last && strchr(digits, *first))
|
while (first < last && strchr(digits, *first))
|
||||||
++first;
|
++first;
|
||||||
}
|
}
|
||||||
if (first < last && exp != 0 && std::tolower((unsigned char)*first) == exp)
|
if (first < last && exp != nullptr && (*first == exp[0] || *first == exp[1]))
|
||||||
{
|
{
|
||||||
++first;
|
++first;
|
||||||
if (first < last && (*first == '-' || *first == '+'))
|
if (first < last && (*first == '-' || *first == '+'))
|
||||||
@ -237,7 +236,7 @@ namespace
|
|||||||
|
|
||||||
if ((last - first + 2) > buffer_resource::guaranteed_capacity())
|
if ((last - first + 2) > buffer_resource::guaranteed_capacity())
|
||||||
{
|
{
|
||||||
last = find_end_of_float(first + neg, last, digits, 'p');
|
last = find_end_of_float(first + neg, last, digits, "pP");
|
||||||
#ifndef __cpp_exceptions
|
#ifndef __cpp_exceptions
|
||||||
if ((last - first + 2) > buffer_resource::guaranteed_capacity())
|
if ((last - first + 2) > buffer_resource::guaranteed_capacity())
|
||||||
{
|
{
|
||||||
@ -261,7 +260,7 @@ namespace
|
|||||||
if ((last - first) > buffer_resource::guaranteed_capacity())
|
if ((last - first) > buffer_resource::guaranteed_capacity())
|
||||||
{
|
{
|
||||||
last = find_end_of_float(first + neg, last, digits,
|
last = find_end_of_float(first + neg, last, digits,
|
||||||
"e"[fmt == chars_format::fixed]);
|
fmt == chars_format::fixed ? nullptr : "eE");
|
||||||
#ifndef __cpp_exceptions
|
#ifndef __cpp_exceptions
|
||||||
if ((last - first) > buffer_resource::guaranteed_capacity())
|
if ((last - first) > buffer_resource::guaranteed_capacity())
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user