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
This commit is contained in:
Paolo Carlini 2003-12-08 15:37:03 +00:00 committed by Paolo Carlini
parent 7618d5106d
commit 0fa96a6006
7 changed files with 290 additions and 395 deletions

View File

@ -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

View File

@ -45,80 +45,10 @@
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))
{

View File

@ -41,83 +41,10 @@
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))
{

View File

@ -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;

View File

@ -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];
// 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);
// 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;
}
}
}
// 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];
++__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;
}
}
}
}
// 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;
}
}
}
// 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;
// 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;
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;
// 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;

View File

@ -55,6 +55,50 @@ namespace std
template class numpunct_byname<C>;
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> >::

View File

@ -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