aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2003-12-08 15:37:03 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2003-12-08 15:37:03 +0000
commit0fa96a6006d2689aeb376139cdf78a2a51c907e9 (patch)
tree5491fe89fa4e59d83400bfad5c7f2c6be3f36f0d
parent7618d5106d3d6f47f917ffa08548d39a4b70fccf (diff)
downloadgcc-0fa96a6006d2689aeb376139cdf78a2a51c907e9.zip
gcc-0fa96a6006d2689aeb376139cdf78a2a51c907e9.tar.gz
gcc-0fa96a6006d2689aeb376139cdf78a2a51c907e9.tar.bz2
c_locale.cc (__convert_to_v(long&), [...]): Remove.
2003-12-08 Paolo Carlini <pcarlini@suse.de> * config/locale/generic/c_locale.cc (__convert_to_v(long&), __convert_to_v(unsigned long&), __convert_to_v(long long&), __convert_to_v(unsigned long long&): Remove. (__convert_to_v(float&), __convert_to_v(double&), __convert_to_v(long double&)): Remove last unused parameter. * config/locale/gnu/c_locale.cc: Likewise. * include/bits/locale_facets.h: Likewise. (num_get::_M_extract_int): Update declaration. (class __num_base): Tweak _S_ie and _S_iE according to the _S_atoms_in changes. * include/bits/locale_facets.tcc (num_get::_M_extract_int): Provide directly the final _ValueT, not a string: accumulate the result checking for overflow at each digit. (num_get::do_get(bool&), num_get::do_get(long&), num_get::do_get(unsigned short&), num_get::do_get(unsigned int&), num_get::do_get(unsigned long&), num_get::do_get(long long&), num_get::do_get(unsigned long long&), num_get::do_get(void*&)): Use the new _M_extract_int, simplify. * src/locale-inst.cc (num_get::_M_extract_int(long&), num_get::_M_extract_int(unsigned short&), num_get::_M_extract_int(unsigned int&), num_get::_M_extract_int(unsigned long&), num_get::_M_extract_int(long long&), num_get::_M_extract_int(unsigned long long&): Instantiate. * src/locale_facets.cc (__num_base::_S_atoms_in): Reorder the chars in the natural order: abcdefABCDEF. From-SVN: r74423
-rw-r--r--libstdc++-v3/ChangeLog29
-rw-r--r--libstdc++-v3/config/locale/generic/c_locale.cc76
-rw-r--r--libstdc++-v3/config/locale/gnu/c_locale.cc79
-rw-r--r--libstdc++-v3/include/bits/locale_facets.h47
-rw-r--r--libstdc++-v3/include/bits/locale_facets.tcc408
-rw-r--r--libstdc++-v3/src/locale-inst.cc44
-rw-r--r--libstdc++-v3/src/locale_facets.cc2
7 files changed, 290 insertions, 395 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 8d2c9ac..62124ec 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,32 @@
+2003-12-08 Paolo Carlini <pcarlini@suse.de>
+
+ * config/locale/generic/c_locale.cc (__convert_to_v(long&),
+ __convert_to_v(unsigned long&), __convert_to_v(long long&),
+ __convert_to_v(unsigned long long&): Remove.
+ (__convert_to_v(float&), __convert_to_v(double&),
+ __convert_to_v(long double&)): Remove last unused parameter.
+ * config/locale/gnu/c_locale.cc: Likewise.
+ * include/bits/locale_facets.h: Likewise.
+ (num_get::_M_extract_int): Update declaration.
+ (class __num_base): Tweak _S_ie and _S_iE according to the
+ _S_atoms_in changes.
+ * include/bits/locale_facets.tcc (num_get::_M_extract_int):
+ Provide directly the final _ValueT, not a string: accumulate
+ the result checking for overflow at each digit.
+ (num_get::do_get(bool&), num_get::do_get(long&),
+ num_get::do_get(unsigned short&), num_get::do_get(unsigned int&),
+ num_get::do_get(unsigned long&), num_get::do_get(long long&),
+ num_get::do_get(unsigned long long&), num_get::do_get(void*&)):
+ Use the new _M_extract_int, simplify.
+ * src/locale-inst.cc (num_get::_M_extract_int(long&),
+ num_get::_M_extract_int(unsigned short&),
+ num_get::_M_extract_int(unsigned int&),
+ num_get::_M_extract_int(unsigned long&),
+ num_get::_M_extract_int(long long&),
+ num_get::_M_extract_int(unsigned long long&): Instantiate.
+ * src/locale_facets.cc (__num_base::_S_atoms_in): Reorder
+ the chars in the natural order: abcdefABCDEF.
+
2003-12-08 David S. Miller <davem@redhat.com>
PR libstdc++/12496
diff --git a/libstdc++-v3/config/locale/generic/c_locale.cc b/libstdc++-v3/config/locale/generic/c_locale.cc
index d0f81b8..92b01c2 100644
--- a/libstdc++-v3/config/locale/generic/c_locale.cc
+++ b/libstdc++-v3/config/locale/generic/c_locale.cc
@@ -47,78 +47,8 @@ namespace std
// Specializations for all types used in num_get.
template<>
void
- __convert_to_v(const char* __s, long& __v, ios_base::iostate& __err,
- const __c_locale&, int __base)
- {
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- long __l = strtol(__s, &__sanity, __base);
- if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
- __v = __l;
- else
- __err |= ios_base::failbit;
- }
- }
-
- template<>
- void
- __convert_to_v(const char* __s, unsigned long& __v,
- ios_base::iostate& __err, const __c_locale&, int __base)
- {
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- unsigned long __ul = strtoul(__s, &__sanity, __base);
- if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
- __v = __ul;
- else
- __err |= ios_base::failbit;
- }
- }
-
-#ifdef _GLIBCXX_USE_LONG_LONG
- template<>
- void
- __convert_to_v(const char* __s, long long& __v, ios_base::iostate& __err,
- const __c_locale&, int __base)
- {
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- long long __ll = strtoll(__s, &__sanity, __base);
- if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
- __v = __ll;
- else
- __err |= ios_base::failbit;
- }
- }
-
- template<>
- void
- __convert_to_v(const char* __s, unsigned long long& __v,
- ios_base::iostate& __err, const __c_locale&, int __base)
- {
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- unsigned long long __ull = strtoull(__s, &__sanity, __base);
- if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
- __v = __ull;
- else
- __err |= ios_base::failbit;
- }
- }
-#endif
-
- template<>
- void
__convert_to_v(const char* __s, float& __v, ios_base::iostate& __err,
- const __c_locale&, int)
+ const __c_locale&)
{
if (!(__err & ios_base::failbit))
{
@@ -158,7 +88,7 @@ namespace std
template<>
void
__convert_to_v(const char* __s, double& __v, ios_base::iostate& __err,
- const __c_locale&, int)
+ const __c_locale&)
{
if (!(__err & ios_base::failbit))
{
@@ -180,7 +110,7 @@ namespace std
template<>
void
__convert_to_v(const char* __s, long double& __v,
- ios_base::iostate& __err, const __c_locale&, int)
+ ios_base::iostate& __err, const __c_locale&)
{
if (!(__err & ios_base::failbit))
{
diff --git a/libstdc++-v3/config/locale/gnu/c_locale.cc b/libstdc++-v3/config/locale/gnu/c_locale.cc
index 39daa89..2dc6d73 100644
--- a/libstdc++-v3/config/locale/gnu/c_locale.cc
+++ b/libstdc++-v3/config/locale/gnu/c_locale.cc
@@ -43,81 +43,8 @@ namespace std
{
template<>
void
- __convert_to_v(const char* __s, long& __v, ios_base::iostate& __err,
- const __c_locale& __cloc, int __base)
- {
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- long __l = __strtol_l(__s, &__sanity, __base, __cloc);
- if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
- __v = __l;
- else
- __err |= ios_base::failbit;
- }
- }
-
- template<>
- void
- __convert_to_v(const char* __s, unsigned long& __v,
- ios_base::iostate& __err, const __c_locale& __cloc,
- int __base)
- {
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- unsigned long __ul = __strtoul_l(__s, &__sanity, __base, __cloc);
- if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
- __v = __ul;
- else
- __err |= ios_base::failbit;
- }
- }
-
-#ifdef _GLIBCXX_USE_LONG_LONG
- template<>
- void
- __convert_to_v(const char* __s, long long& __v, ios_base::iostate& __err,
- const __c_locale& __cloc, int __base)
- {
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- long long __ll = __strtoll_l(__s, &__sanity, __base, __cloc);
- if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
- __v = __ll;
- else
- __err |= ios_base::failbit;
- }
- }
-
- template<>
- void
- __convert_to_v(const char* __s, unsigned long long& __v,
- ios_base::iostate& __err, const __c_locale& __cloc,
- int __base)
- {
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- unsigned long long __ull = __strtoull_l(__s, &__sanity, __base,
- __cloc);
- if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
- __v = __ull;
- else
- __err |= ios_base::failbit;
- }
- }
-#endif
-
- template<>
- void
__convert_to_v(const char* __s, float& __v, ios_base::iostate& __err,
- const __c_locale& __cloc, int)
+ const __c_locale& __cloc)
{
if (!(__err & ios_base::failbit))
{
@@ -134,7 +61,7 @@ namespace std
template<>
void
__convert_to_v(const char* __s, double& __v, ios_base::iostate& __err,
- const __c_locale& __cloc, int)
+ const __c_locale& __cloc)
{
if (!(__err & ios_base::failbit))
{
@@ -151,7 +78,7 @@ namespace std
template<>
void
__convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err,
- const __c_locale& __cloc, int)
+ const __c_locale& __cloc)
{
if (!(__err & ios_base::failbit))
{
diff --git a/libstdc++-v3/include/bits/locale_facets.h b/libstdc++-v3/include/bits/locale_facets.h
index a29538a..a61ac9f 100644
--- a/libstdc++-v3/include/bits/locale_facets.h
+++ b/libstdc++-v3/include/bits/locale_facets.h
@@ -63,45 +63,23 @@ namespace std
template<typename _Tv>
void
__convert_to_v(const char* __in, _Tv& __out, ios_base::iostate& __err,
- const __c_locale& __cloc, int __base = 10);
+ const __c_locale& __cloc);
// Explicit specializations for required types.
template<>
void
- __convert_to_v(const char*, long&, ios_base::iostate&,
- const __c_locale&, int);
-
- template<>
- void
- __convert_to_v(const char*, unsigned long&, ios_base::iostate&,
- const __c_locale&, int);
-
-#ifdef _GLIBCXX_USE_LONG_LONG
- template<>
- void
- __convert_to_v(const char*, long long&, ios_base::iostate&,
- const __c_locale&, int);
-
- template<>
- void
- __convert_to_v(const char*, unsigned long long&, ios_base::iostate&,
- const __c_locale&, int);
-#endif
-
- template<>
- void
__convert_to_v(const char*, float&, ios_base::iostate&,
- const __c_locale&, int);
+ const __c_locale&);
template<>
void
__convert_to_v(const char*, double&, ios_base::iostate&,
- const __c_locale&, int);
+ const __c_locale&);
- template<>
+ template<>
void
__convert_to_v(const char*, long double&, ios_base::iostate&,
- const __c_locale&, int);
+ const __c_locale&);
// NB: __pad is a struct, rather than a function, so it can be
// partially-specialized.
@@ -586,7 +564,7 @@ namespace std
static const char* _S_atoms_out;
// String literal of acceptable (narrow) input, for num_get.
- // "-+xX0123456789eEabcdfABCDF"
+ // "-+xX0123456789abcdefABCDEF"
static const char* _S_atoms_in;
enum
@@ -596,8 +574,8 @@ namespace std
_S_ix,
_S_iX,
_S_izero,
- _S_ie = _S_izero + 10,
- _S_iE = _S_izero + 11,
+ _S_ie = _S_izero + 14,
+ _S_iE = _S_izero + 20,
_S_iend = 26
};
@@ -624,7 +602,7 @@ namespace std
_CharT _M_atoms_out[__num_base::_S_oend + 1];
// A list of valid numeric literals for input: in the standard
- // "C" locale, this is "-+xX0123456789eEabcdfABCDF"
+ // "C" locale, this is "-+xX0123456789abcdefABCDEF"
// This array contains the chars after having been passed
// through the current locale's ctype<_CharT>.widen().
_CharT _M_atoms_in[__num_base::_S_iend + 1];
@@ -893,9 +871,10 @@ namespace std
_M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
string& __xtrc) const;
- iter_type
- _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
- string& __xtrc, int& __base) const;
+ template<typename _ValueT>
+ iter_type
+ _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
+ _ValueT& __v) const;
virtual iter_type
do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc
index e921585..efd7fd3 100644
--- a/libstdc++-v3/include/bits/locale_facets.tcc
+++ b/libstdc++-v3/include/bits/locale_facets.tcc
@@ -258,144 +258,194 @@ namespace std
}
template<typename _CharT, typename _InIter>
- _InIter
- num_get<_CharT, _InIter>::
- _M_extract_int(_InIter __beg, _InIter __end, ios_base& __io,
- ios_base::iostate& __err, string& __xtrc, int& __base) const
- {
- typedef char_traits<_CharT> __traits_type;
- typedef typename numpunct<_CharT>::__cache_type __cache_type;
- __use_cache<__cache_type> __uc;
- const locale& __loc = __io._M_getloc();
- const __cache_type* __lc = __uc(__loc);
- const _CharT* __lit = __lc->_M_atoms_in;
-
- // NB: Iff __basefield == 0, this can change based on contents.
- const ios_base::fmtflags __basefield = __io.flags() & ios_base::basefield;
- if (__basefield == ios_base::oct)
- __base = 8;
- else if (__basefield == ios_base::hex)
- __base = 16;
- else
- __base = 10;
+ template<typename _ValueT>
+ _InIter
+ num_get<_CharT, _InIter>::
+ _M_extract_int(_InIter __beg, _InIter __end, ios_base& __io,
+ ios_base::iostate& __err, _ValueT& __v) const
+ {
+ typedef char_traits<_CharT> __traits_type;
+ typedef typename numpunct<_CharT>::__cache_type __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ const _CharT* __lit = __lc->_M_atoms_in;
- // First check for sign.
- if (__beg != __end)
- {
- const char_type __c = *__beg;
- const bool __plus = __traits_type::eq(__c, __lit[_S_iplus]);
- if (__plus || __traits_type::eq(__c, __lit[_S_iminus]))
- {
- __xtrc += __plus ? _S_atoms_in[_S_iplus]
- : _S_atoms_in[_S_iminus];
- ++__beg;
- }
- }
+ // NB: Iff __basefield == 0, __base can change based on contents.
+ const ios_base::fmtflags __basefield = __io.flags() & ios_base::basefield;
+ const bool __oct = __basefield == ios_base::oct;
+ int __base = __oct ? 8 : (__basefield == ios_base::hex ? 16 : 10);
- // Next, look for leading zeros and check required digits for base formats.
- if (__builtin_expect(__base == 10, true))
- {
- // Look for a zero...
- if (__beg != __end && __traits_type::eq(*__beg, __lit[_S_izero]))
- {
- __xtrc += _S_atoms_in[_S_izero];
+ // True if numeric digits are found.
+ bool __found_num = false;
+
+ // First check for sign.
+ bool __negative = false;
+ if (__beg != __end)
+ {
+ __negative = __traits_type::eq(*__beg, __lit[_S_iminus]);
+ if (__negative && numeric_limits<_ValueT>::is_signed
+ || __traits_type::eq(*__beg, __lit[_S_iplus]))
++__beg;
- // ... and skip the additional ones.
- for (; __beg != __end
- && __traits_type::eq(*__beg, __lit[_S_izero]); ++__beg);
-
- // Check required digits.
- if (__beg != __end && __basefield == 0)
- {
- const bool __x = __traits_type::eq(*__beg, __lit[_S_ix]);
- if (__x || __traits_type::eq(*__beg, __lit[_S_iX]))
- {
- __xtrc += __x ? _S_atoms_in[_S_ix]
- : _S_atoms_in[_S_iX];
- __base = 16;
- ++__beg;
- }
- else
- __base = 8;
- }
- }
- }
- else if (__base == 16)
- {
- if (__beg != __end && __traits_type::eq(*__beg, __lit[_S_izero]))
- {
- __xtrc += _S_atoms_in[_S_izero];
-
- if (++__beg != __end)
- {
- const bool __x = __traits_type::eq(*__beg, __lit[_S_ix]);
- if (__x || __traits_type::eq(*__beg, __lit[_S_iX]))
- {
- __xtrc += __x ? _S_atoms_in[_S_ix]
- : _S_atoms_in[_S_iX];
- ++__beg;
- }
- }
- }
- }
+ }
- // At this point, base is determined. If not hex, only allow
- // base digits as valid input.
- const size_t __len = __base == 16 ? _S_iend : __base;
+ // Next, look for leading zeros and check required digits
+ // for base formats.
+ if (__beg != __end && __traits_type::eq(*__beg, __lit[_S_izero]))
+ {
+ __found_num = true;
+ ++__beg;
+ if (__builtin_expect(__base == 10, true))
+ {
+ // Skip the additional zeros.
+ for (; __beg != __end
+ && __traits_type::eq(*__beg, __lit[_S_izero]); ++__beg);
+
+ // Check required digits.
+ if (__beg != __end && __basefield == 0)
+ {
+ const bool __x = __traits_type::eq(*__beg, __lit[_S_ix]);
+ if (__x || __traits_type::eq(*__beg, __lit[_S_iX]))
+ {
+ __base = 16;
+ ++__beg;
+ __found_num = false;
+ }
+ else
+ __base = 8;
+ }
+ }
+ else if (__base == 16 && __beg != __end)
+ {
+ const bool __x = __traits_type::eq(*__beg, __lit[_S_ix]);
+ if (__x || __traits_type::eq(*__beg, __lit[_S_iX]))
+ {
+ ++__beg;
+ __found_num = false;
+ }
+ }
+ }
- // Extract.
- string __found_grouping;
- int __sep_pos = 0;
- for (; __beg != __end; ++__beg)
- {
- const char_type __c = *__beg;
- const char_type* __p = __traits_type::find(__lit + _S_izero,
- __len, __c);
- if (__p)
- {
- // Try first for acceptable digit; record it if found.
- __xtrc += _S_atoms_in[__p - __lit];
- ++__sep_pos;
- }
- else if (__traits_type::eq(__c, __lc->_M_thousands_sep)
- && __lc->_M_use_grouping)
- {
- // NB: Thousands separator at the beginning of a string
- // is a no-no, as is two consecutive thousands separators.
- if (__sep_pos)
- {
- __found_grouping += static_cast<char>(__sep_pos);
- __sep_pos = 0;
- }
- else
- {
- __err |= ios_base::failbit;
+ // At this point, base is determined. If not hex, only allow
+ // base digits as valid input.
+ const size_t __len = __base == 16 ? _S_iend : __base;
+
+ // Extract.
+ string __found_grouping;
+ int __sep_pos = 0;
+ bool __overflow = false;
+ _ValueT __result = 0;
+ const char_type* __lit_zero = __lit + _S_izero;
+ if (__negative)
+ {
+ const _ValueT __min = numeric_limits<_ValueT>::min() / __base;
+ for (; __beg != __end; ++__beg)
+ {
+ const char_type* __p = __traits_type::find(__lit_zero,
+ __len, *__beg);
+ if (__p)
+ {
+ int __digit = __p - __lit_zero;
+ if (__digit > 15)
+ __digit -= 6;
+ if (__result < __min)
+ __overflow = true;
+ else
+ {
+ const _ValueT __new_result = __result * __base - __digit;
+ if (__result)
+ __overflow |= __new_result >= __result;
+ __result = __new_result;
+ ++__sep_pos;
+ __found_num = true;
+ }
+ }
+ else if (__lc->_M_use_grouping
+ && __traits_type::eq(*__beg, __lc->_M_thousands_sep))
+ {
+ // NB: Thousands separator at the beginning of a string
+ // is a no-no, as is two consecutive thousands separators.
+ if (__sep_pos)
+ {
+ __found_grouping += static_cast<char>(__sep_pos);
+ __sep_pos = 0;
+ }
+ else
+ {
+ __err |= ios_base::failbit;
+ break;
+ }
+ }
+ else
+ // Not a valid input item.
break;
- }
- }
- else
- // Not a valid input item.
- break;
- }
+ }
+ }
+ else
+ {
+ const _ValueT __max = numeric_limits<_ValueT>::max() / __base;
+ for (; __beg != __end; ++__beg)
+ {
+ const char_type* __p = __traits_type::find(__lit_zero,
+ __len, *__beg);
+ if (__p)
+ {
+ int __digit = __p - __lit_zero;
+ if (__digit > 15)
+ __digit -= 6;
+ if (__result > __max)
+ __overflow = true;
+ else
+ {
+ const _ValueT __new_result = __result * __base + __digit;
+ if (__result)
+ __overflow |= __new_result <= __result;
+ __result = __new_result;
+ ++__sep_pos;
+ __found_num = true;
+ }
+ }
+ else if (__lc->_M_use_grouping
+ && __traits_type::eq(*__beg, __lc->_M_thousands_sep))
+ {
+ if (__sep_pos)
+ {
+ __found_grouping += static_cast<char>(__sep_pos);
+ __sep_pos = 0;
+ }
+ else
+ {
+ __err |= ios_base::failbit;
+ break;
+ }
+ }
+ else
+ break;
+ }
+ }
- // Digit grouping is checked. If grouping and found_grouping don't
- // match, then get very very upset, and set failbit.
- if (__lc->_M_use_grouping && __found_grouping.size())
- {
- // Add the ending grouping.
- __found_grouping += static_cast<char>(__sep_pos);
+ // Digit grouping is checked. If grouping and found_grouping don't
+ // match, then get very very upset, and set failbit.
+ if (__lc->_M_use_grouping && __found_grouping.size())
+ {
+ // Add the ending grouping.
+ __found_grouping += static_cast<char>(__sep_pos);
+
+ const string __grouping = __lc->_M_grouping;
+ if (!std::__verify_grouping(__grouping, __found_grouping))
+ __err |= ios_base::failbit;
+ }
- const string __grouping = __lc->_M_grouping;
- if (!std::__verify_grouping(__grouping, __found_grouping))
- __err |= ios_base::failbit;
- }
+ if (!(__err & ios_base::failbit)
+ && !__overflow && __found_num)
+ __v = __result;
+ else
+ __err |= ios_base::failbit;
- // Finish up.
- __xtrc += char();
- if (__beg == __end)
- __err |= ios_base::eofbit;
- return __beg;
- }
+ if (__beg == __end)
+ __err |= ios_base::eofbit;
+ return __beg;
+ }
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 17. Bad bool parsing
@@ -407,26 +457,21 @@ namespace std
{
if (!(__io.flags() & ios_base::boolalpha))
{
- // Parse bool values as unsigned long.
+ // Parse bool values as long.
// NB: We can't just call do_get(long) here, as it might
// refer to a derived class.
- string __xtrc;
- int __base;
- __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
-
- unsigned long __ul;
- std::__convert_to_v(__xtrc.c_str(), __ul, __err,
- _S_get_c_locale(), __base);
- if (!(__err & ios_base::failbit) && __ul <= 1)
- __v = __ul;
- else
+ long __l = -1;
+ __beg = _M_extract_int(__beg, __end, __io, __err, __l);
+ if (__l == 0 || __l == 1)
+ __v = __l;
+ else
__err |= ios_base::failbit;
}
else
{
// Parse bool values as alphanumeric.
- typedef char_traits<_CharT> __traits_type;
- typedef typename numpunct<_CharT>::__cache_type __cache_type;
+ typedef char_traits<_CharT> __traits_type;
+ typedef typename numpunct<_CharT>::__cache_type __cache_type;
__use_cache<__cache_type> __uc;
const locale& __loc = __io._M_getloc();
const __cache_type* __lc = __uc(__loc);
@@ -473,68 +518,28 @@ namespace std
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, long& __v) const
- {
- string __xtrc;
- int __base;
- __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
- std::__convert_to_v(__xtrc.c_str(), __v, __err,
- _S_get_c_locale(), __base);
- return __beg;
- }
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
template<typename _CharT, typename _InIter>
_InIter
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, unsigned short& __v) const
- {
- string __xtrc;
- int __base;
- __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
- unsigned long __ul;
- std::__convert_to_v(__xtrc.c_str(), __ul, __err,
- _S_get_c_locale(), __base);
- if (!(__err & ios_base::failbit)
- && __ul <= numeric_limits<unsigned short>::max())
- __v = static_cast<unsigned short>(__ul);
- else
- __err |= ios_base::failbit;
- return __beg;
- }
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
template<typename _CharT, typename _InIter>
_InIter
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, unsigned int& __v) const
- {
- string __xtrc;
- int __base;
- __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
- unsigned long __ul;
- std::__convert_to_v(__xtrc.c_str(), __ul, __err,
- _S_get_c_locale(), __base);
- if (!(__err & ios_base::failbit)
- && __ul <= numeric_limits<unsigned int>::max())
- __v = static_cast<unsigned int>(__ul);
- else
- __err |= ios_base::failbit;
- return __beg;
- }
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
template<typename _CharT, typename _InIter>
_InIter
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, unsigned long& __v) const
- {
- string __xtrc;
- int __base;
- __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
- std::__convert_to_v(__xtrc.c_str(), __v, __err,
- _S_get_c_locale(), __base);
- return __beg;
- }
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
#ifdef _GLIBCXX_USE_LONG_LONG
template<typename _CharT, typename _InIter>
@@ -542,28 +547,14 @@ namespace std
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, long long& __v) const
- {
- string __xtrc;
- int __base;
- __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
- std::__convert_to_v(__xtrc.c_str(), __v, __err,
- _S_get_c_locale(), __base);
- return __beg;
- }
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
template<typename _CharT, typename _InIter>
_InIter
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, unsigned long long& __v) const
- {
- string __xtrc;
- int __base;
- __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
- std::__convert_to_v(__xtrc.c_str(), __v, __err,
- _S_get_c_locale(), __base);
- return __beg;
- }
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
#endif
template<typename _CharT, typename _InIter>
@@ -575,8 +566,7 @@ namespace std
string __xtrc;
__xtrc.reserve(32);
__beg = _M_extract_float(__beg, __end, __io, __err, __xtrc);
- std::__convert_to_v(__xtrc.c_str(), __v, __err,
- _S_get_c_locale());
+ std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale());
return __beg;
}
@@ -619,16 +609,12 @@ namespace std
| ios_base::uppercase | ios_base::internal);
__io.flags(__fmt & __fmtmask | (ios_base::hex | ios_base::showbase));
- string __xtrc;
- int __base;
- __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
+ unsigned long __ul;
+ __beg = _M_extract_int(__beg, __end, __io, __err, __ul);
// Reset from hex formatted input.
__io.flags(__fmt);
- unsigned long __ul;
- std::__convert_to_v(__xtrc.c_str(), __ul, __err,
- _S_get_c_locale(), __base);
if (!(__err & ios_base::failbit))
__v = reinterpret_cast<void*>(__ul);
else
@@ -794,7 +780,7 @@ namespace std
_OutIter
num_put<_CharT, _OutIter>::
_M_insert_int(_OutIter __s, ios_base& __io, _CharT __fill,
- _ValueT __v) const
+ _ValueT __v) const
{
typedef typename numpunct<_CharT>::__cache_type __cache_type;
__use_cache<__cache_type> __uc;
diff --git a/libstdc++-v3/src/locale-inst.cc b/libstdc++-v3/src/locale-inst.cc
index cb3304d..7a41ef8 100644
--- a/libstdc++-v3/src/locale-inst.cc
+++ b/libstdc++-v3/src/locale-inst.cc
@@ -56,6 +56,50 @@ namespace std
template class num_get<C, istreambuf_iterator<C> >;
template class num_put<C, ostreambuf_iterator<C> >;
template
+ istreambuf_iterator<C>
+ num_get<C, istreambuf_iterator<C> >::
+ _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+ ios_base&, ios_base::iostate&,
+ long&) const;
+
+ template
+ istreambuf_iterator<C>
+ num_get<C, istreambuf_iterator<C> >::
+ _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+ ios_base&, ios_base::iostate&,
+ unsigned short&) const;
+
+ template
+ istreambuf_iterator<C>
+ num_get<C, istreambuf_iterator<C> >::
+ _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+ ios_base&, ios_base::iostate&,
+ unsigned int&) const;
+
+ template
+ istreambuf_iterator<C>
+ num_get<C, istreambuf_iterator<C> >::
+ _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+ ios_base&, ios_base::iostate&,
+ unsigned long&) const;
+
+#ifdef _GLIBCXX_USE_LONG_LONG
+ template
+ istreambuf_iterator<C>
+ num_get<C, istreambuf_iterator<C> >::
+ _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+ ios_base&, ios_base::iostate&,
+ long long&) const;
+
+ template
+ istreambuf_iterator<C>
+ num_get<C, istreambuf_iterator<C> >::
+ _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+ ios_base&, ios_base::iostate&,
+ unsigned long long&) const;
+#endif
+
+ template
ostreambuf_iterator<C>
num_put<C, ostreambuf_iterator<C> >::
_M_insert_int(ostreambuf_iterator<C>, ios_base&, C,
diff --git a/libstdc++-v3/src/locale_facets.cc b/libstdc++-v3/src/locale_facets.cc
index 6a0ccf2..da975f0 100644
--- a/libstdc++-v3/src/locale_facets.cc
+++ b/libstdc++-v3/src/locale_facets.cc
@@ -53,7 +53,7 @@ namespace std
const money_base::pattern
money_base::_S_default_pattern = { {symbol, sign, none, value} };
- const char* __num_base::_S_atoms_in = "-+xX0123456789eEabcdfABCDF";
+ const char* __num_base::_S_atoms_in = "-+xX0123456789abcdefABCDEF";
const char* __num_base::_S_atoms_out ="-+xX0123456789abcdef0123456789ABCDEF";
// _GLIBCXX_RESOLVE_LIB_DEFECTS