From 2ddf25f217e0f3724cd8d7a9f68913780ff6d2ad Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Wed, 18 Feb 2004 16:39:13 +0000 Subject: [PATCH] locale_facets.h (money_get<>::_M_extract): New, helper for do_get. 2004-02-18 Paolo Carlini * 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 --- libstdc++-v3/ChangeLog | 11 ++ libstdc++-v3/include/bits/locale_facets.h | 8 ++ libstdc++-v3/include/bits/locale_facets.tcc | 130 +++++++++++--------- 3 files changed, 90 insertions(+), 59 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 822c78172ee..f6428ad86bb 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2004-02-18 Paolo Carlini + + * 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 * config/io/basic_file_stdio.cc (__gnu_internal::xwritev): diff --git a/libstdc++-v3/include/bits/locale_facets.h b/libstdc++-v3/include/bits/locale_facets.h index 14fb84c1555..889c778c92e 100644 --- a/libstdc++-v3/include/bits/locale_facets.h +++ b/libstdc++-v3/include/bits/locale_facets.h @@ -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 @@ -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 diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index 19d4d4a364f..7ccb946f36c 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -1130,31 +1130,11 @@ namespace std return __s; } - template _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(__builtin_alloca(__cs_size)); - const locale __loc = __io.getloc(); - const ctype<_CharT>& __ctype = use_facet >(__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 - _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 - _OutIter - money_put<_CharT, _OutIter>:: - do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, - long double __units) const + template + _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(__builtin_alloca(__cs_size)); const locale __loc = __io.getloc(); const ctype<_CharT>& __ctype = use_facet >(__loc); -#ifdef _GLIBCXX_USE_C99 - // First try a buffer perhaps big enough. - int __cs_size = 64; - char* __cs = static_cast(__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(__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::max_exponent10 + 3; - char* __cs = static_cast(__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 + _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 _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(__io.width()); @@ -1556,9 +1524,53 @@ namespace std __s = std::__write(__s, __res.data(), __len); } __io.width(0); - return __s; + return __s; } + template + _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 >(__loc); +#ifdef _GLIBCXX_USE_C99 + // First try a buffer perhaps big enough. + int __cs_size = 64; + char* __cs = static_cast(__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(__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::max_exponent10 + 3; + char* __cs = static_cast(__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 + _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