locale_facets.h (money_get<>::_M_extract): New, helper for do_get.
2004-02-18 Paolo Carlini <pcarlini@suse.de> * include/bits/locale_facets.h (money_get<>::_M_extract): New, helper for do_get. (money_put<>::_M_insert): Likewise, for do_put. * include/bits/locale_facets.tcc (money_get<>::_M_extract, money_put<>::_M_insert): Define. (money_get<>::do_get(long double&), money_get<>::do_get( string_type&), money_put::do_put(long double), money_put::do_put(const string_type&)): Use the helpers. From-SVN: r78037
This commit is contained in:
parent
99cc786a17
commit
2ddf25f217
3 changed files with 90 additions and 59 deletions
|
@ -1,3 +1,14 @@
|
|||
2004-02-18 Paolo Carlini <pcarlini@suse.de>
|
||||
|
||||
* include/bits/locale_facets.h (money_get<>::_M_extract):
|
||||
New, helper for do_get.
|
||||
(money_put<>::_M_insert): Likewise, for do_put.
|
||||
* include/bits/locale_facets.tcc (money_get<>::_M_extract,
|
||||
money_put<>::_M_insert): Define.
|
||||
(money_get<>::do_get(long double&), money_get<>::do_get(
|
||||
string_type&), money_put::do_put(long double),
|
||||
money_put::do_put(const string_type&)): Use the helpers.
|
||||
|
||||
2004-02-18 Paolo Carlini <pcarlini@suse.de>
|
||||
|
||||
* config/io/basic_file_stdio.cc (__gnu_internal::xwritev):
|
||||
|
|
|
@ -4056,6 +4056,10 @@ namespace std
|
|||
virtual iter_type
|
||||
do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
|
||||
ios_base::iostate& __err, string_type& __digits) const;
|
||||
|
||||
iter_type
|
||||
_M_extract(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
|
||||
ios_base::iostate& __err, string_type& __digits) const;
|
||||
};
|
||||
|
||||
template<typename _CharT, typename _InIter>
|
||||
|
@ -4189,6 +4193,10 @@ namespace std
|
|||
virtual iter_type
|
||||
do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
|
||||
const string_type& __digits) const;
|
||||
|
||||
iter_type
|
||||
_M_insert(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
|
||||
const string_type& __digits) const;
|
||||
};
|
||||
|
||||
template<typename _CharT, typename _OutIter>
|
||||
|
|
|
@ -1130,31 +1130,11 @@ namespace std
|
|||
return __s;
|
||||
}
|
||||
|
||||
|
||||
template<typename _CharT, typename _InIter>
|
||||
_InIter
|
||||
money_get<_CharT, _InIter>::
|
||||
do_get(iter_type __beg, iter_type __end, bool __intl, ios_base& __io,
|
||||
ios_base::iostate& __err, long double& __units) const
|
||||
{
|
||||
string_type __str;
|
||||
__beg = this->do_get(__beg, __end, __intl, __io, __err, __str);
|
||||
|
||||
const int __cs_size = __str.size() + 1;
|
||||
char* __cs = static_cast<char*>(__builtin_alloca(__cs_size));
|
||||
const locale __loc = __io.getloc();
|
||||
const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
|
||||
const _CharT* __wcs = __str.c_str();
|
||||
__ctype.narrow(__wcs, __wcs + __cs_size, char(), __cs);
|
||||
std::__convert_to_v(__cs, __units, __err, _S_get_c_locale());
|
||||
return __beg;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _InIter>
|
||||
_InIter
|
||||
money_get<_CharT, _InIter>::
|
||||
do_get(iter_type __beg, iter_type __end, bool __intl, ios_base& __io,
|
||||
ios_base::iostate& __err, string_type& __units) const
|
||||
_M_extract(iter_type __beg, iter_type __end, bool __intl, ios_base& __io,
|
||||
ios_base::iostate& __err, string_type& __units) const
|
||||
{
|
||||
// These contortions are quite unfortunate.
|
||||
typedef moneypunct<_CharT, true> __money_true;
|
||||
|
@ -1358,53 +1338,41 @@ namespace std
|
|||
return __beg;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _OutIter>
|
||||
_OutIter
|
||||
money_put<_CharT, _OutIter>::
|
||||
do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
|
||||
long double __units) const
|
||||
template<typename _CharT, typename _InIter>
|
||||
_InIter
|
||||
money_get<_CharT, _InIter>::
|
||||
do_get(iter_type __beg, iter_type __end, bool __intl, ios_base& __io,
|
||||
ios_base::iostate& __err, long double& __units) const
|
||||
{
|
||||
string_type __str;
|
||||
__beg = _M_extract(__beg, __end, __intl, __io, __err, __str);
|
||||
|
||||
const int __cs_size = __str.size() + 1;
|
||||
char* __cs = static_cast<char*>(__builtin_alloca(__cs_size));
|
||||
const locale __loc = __io.getloc();
|
||||
const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
|
||||
#ifdef _GLIBCXX_USE_C99
|
||||
// First try a buffer perhaps big enough.
|
||||
int __cs_size = 64;
|
||||
char* __cs = static_cast<char*>(__builtin_alloca(__cs_size));
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 328. Bad sprintf format modifier in money_put<>::do_put()
|
||||
int __len = std::__convert_from_v(__cs, __cs_size, "%.0Lf", __units,
|
||||
_S_get_c_locale());
|
||||
// If the buffer was not large enough, try again with the correct size.
|
||||
if (__len >= __cs_size)
|
||||
{
|
||||
__cs_size = __len + 1;
|
||||
__cs = static_cast<char*>(__builtin_alloca(__cs_size));
|
||||
__len = std::__convert_from_v(__cs, __cs_size, "%.0Lf", __units,
|
||||
_S_get_c_locale());
|
||||
}
|
||||
#else
|
||||
// max_exponent10 + 1 for the integer part, + 2 for sign and '\0'.
|
||||
const int __cs_size = numeric_limits<long double>::max_exponent10 + 3;
|
||||
char* __cs = static_cast<char*>(__builtin_alloca(__cs_size));
|
||||
int __len = std::__convert_from_v(__cs, 0, "%.0Lf", __units,
|
||||
_S_get_c_locale());
|
||||
#endif
|
||||
_CharT* __ws = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
|
||||
* __cs_size));
|
||||
__ctype.widen(__cs, __cs + __len, __ws);
|
||||
const string_type __digits(__ws, __len);
|
||||
return this->do_put(__s, __intl, __io, __fill, __digits);
|
||||
const _CharT* __wcs = __str.c_str();
|
||||
__ctype.narrow(__wcs, __wcs + __cs_size, char(), __cs);
|
||||
std::__convert_to_v(__cs, __units, __err, _S_get_c_locale());
|
||||
return __beg;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _InIter>
|
||||
_InIter
|
||||
money_get<_CharT, _InIter>::
|
||||
do_get(iter_type __beg, iter_type __end, bool __intl, ios_base& __io,
|
||||
ios_base::iostate& __err, string_type& __units) const
|
||||
{ return _M_extract(__beg, __end, __intl, __io, __err, __units); }
|
||||
|
||||
template<typename _CharT, typename _OutIter>
|
||||
_OutIter
|
||||
money_put<_CharT, _OutIter>::
|
||||
do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
|
||||
const string_type& __digits) const
|
||||
_M_insert(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
|
||||
const string_type& __digits) const
|
||||
{
|
||||
typedef typename string_type::size_type size_type;
|
||||
typedef money_base::part part;
|
||||
|
||||
|
||||
const locale __loc = __io.getloc();
|
||||
const size_type __width = static_cast<size_type>(__io.width());
|
||||
|
||||
|
@ -1556,9 +1524,53 @@ namespace std
|
|||
__s = std::__write(__s, __res.data(), __len);
|
||||
}
|
||||
__io.width(0);
|
||||
return __s;
|
||||
return __s;
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _OutIter>
|
||||
_OutIter
|
||||
money_put<_CharT, _OutIter>::
|
||||
do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
|
||||
long double __units) const
|
||||
{
|
||||
const locale __loc = __io.getloc();
|
||||
const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
|
||||
#ifdef _GLIBCXX_USE_C99
|
||||
// First try a buffer perhaps big enough.
|
||||
int __cs_size = 64;
|
||||
char* __cs = static_cast<char*>(__builtin_alloca(__cs_size));
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 328. Bad sprintf format modifier in money_put<>::do_put()
|
||||
int __len = std::__convert_from_v(__cs, __cs_size, "%.0Lf", __units,
|
||||
_S_get_c_locale());
|
||||
// If the buffer was not large enough, try again with the correct size.
|
||||
if (__len >= __cs_size)
|
||||
{
|
||||
__cs_size = __len + 1;
|
||||
__cs = static_cast<char*>(__builtin_alloca(__cs_size));
|
||||
__len = std::__convert_from_v(__cs, __cs_size, "%.0Lf", __units,
|
||||
_S_get_c_locale());
|
||||
}
|
||||
#else
|
||||
// max_exponent10 + 1 for the integer part, + 2 for sign and '\0'.
|
||||
const int __cs_size = numeric_limits<long double>::max_exponent10 + 3;
|
||||
char* __cs = static_cast<char*>(__builtin_alloca(__cs_size));
|
||||
int __len = std::__convert_from_v(__cs, 0, "%.0Lf", __units,
|
||||
_S_get_c_locale());
|
||||
#endif
|
||||
_CharT* __ws = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
|
||||
* __cs_size));
|
||||
__ctype.widen(__cs, __cs + __len, __ws);
|
||||
const string_type __digits(__ws, __len);
|
||||
return _M_insert(__s, __intl, __io, __fill, __digits);
|
||||
}
|
||||
|
||||
template<typename _CharT, typename _OutIter>
|
||||
_OutIter
|
||||
money_put<_CharT, _OutIter>::
|
||||
do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
|
||||
const string_type& __digits) const
|
||||
{ return _M_insert(__s, __intl, __io, __fill, __digits); }
|
||||
|
||||
// NB: Not especially useful. Without an ios_base object or some
|
||||
// kind of locale reference, we are left clawing at the air where
|
||||
|
|
Loading…
Add table
Reference in a new issue