diff options
author | Paolo Carlini <pcarlini@suse.de> | 2003-12-08 15:37:03 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2003-12-08 15:37:03 +0000 |
commit | 0fa96a6006d2689aeb376139cdf78a2a51c907e9 (patch) | |
tree | 5491fe89fa4e59d83400bfad5c7f2c6be3f36f0d | |
parent | 7618d5106d3d6f47f917ffa08548d39a4b70fccf (diff) | |
download | gcc-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/ChangeLog | 29 | ||||
-rw-r--r-- | libstdc++-v3/config/locale/generic/c_locale.cc | 76 | ||||
-rw-r--r-- | libstdc++-v3/config/locale/gnu/c_locale.cc | 79 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/locale_facets.h | 47 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/locale_facets.tcc | 408 | ||||
-rw-r--r-- | libstdc++-v3/src/locale-inst.cc | 44 | ||||
-rw-r--r-- | libstdc++-v3/src/locale_facets.cc | 2 |
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 |