codecvt.h (class __codecvt_abstract_base): Add __c_locale type _M_c_locale_codecvt member.
2002-09-10 Paolo Carlini <pcarlini@unitus.it> * include/bits/codecvt.h (class __codecvt_abstract_base): Add __c_locale type _M_c_locale_codecvt member. (class codecvt<char, char, mbstate_t>, class codecvt<wchar_t, char, mbstate_t>): Add new codecvt(__c_locale, size_t) constructor. (codecvt_byname::codecvt_byname): Update. * src/codecvt.cc (class codecvt<char, char, mbstate_t>, class codecvt<wchar_t, char, mbstate_t>): Update codecvt(size_t) constructor and ~codecvt() destructor; define codecvt(__c_locale, size_t) constructor. (codecvt::do_out): Switch to _M_c_locale_codecvt around wcsrtombs call. (codecvt::do_in): Ditto for mbsrtowcs call. * src/localename.cc (locale::_Impl::_Impl(const char*, size_t)): Tweak construction of codecvt facets. From-SVN: r57011
This commit is contained in:
parent
33b679d10a
commit
c6b5df5351
4 changed files with 75 additions and 9 deletions
|
@ -1,3 +1,20 @@
|
|||
2002-09-10 Paolo Carlini <pcarlini@unitus.it>
|
||||
|
||||
* include/bits/codecvt.h (class __codecvt_abstract_base):
|
||||
Add __c_locale type _M_c_locale_codecvt member.
|
||||
(class codecvt<char, char, mbstate_t>,
|
||||
class codecvt<wchar_t, char, mbstate_t>): Add new
|
||||
codecvt(__c_locale, size_t) constructor.
|
||||
(codecvt_byname::codecvt_byname): Update.
|
||||
* src/codecvt.cc (class codecvt<char, char, mbstate_t>,
|
||||
class codecvt<wchar_t, char, mbstate_t>): Update codecvt(size_t)
|
||||
constructor and ~codecvt() destructor; define
|
||||
codecvt(__c_locale, size_t) constructor.
|
||||
(codecvt::do_out): Switch to _M_c_locale_codecvt around wcsrtombs call.
|
||||
(codecvt::do_in): Ditto for mbsrtowcs call.
|
||||
* src/localename.cc (locale::_Impl::_Impl(const char*, size_t)):
|
||||
Tweak construction of codecvt facets.
|
||||
|
||||
2002-09-10 Danny Smith <dannysmith@users.sourceforge.net>
|
||||
|
||||
* include/bits/locale_facets.tcc (__convert_from_v):
|
||||
|
|
|
@ -70,7 +70,11 @@
|
|||
typedef _InternT intern_type;
|
||||
typedef _ExternT extern_type;
|
||||
typedef _StateT state_type;
|
||||
|
||||
|
||||
protected:
|
||||
__c_locale _M_c_locale_codecvt;
|
||||
|
||||
public:
|
||||
// 22.2.1.5.1 codecvt members
|
||||
result
|
||||
out(state_type& __state, const intern_type* __from,
|
||||
|
@ -225,6 +229,10 @@
|
|||
explicit
|
||||
codecvt(size_t __refs = 0);
|
||||
|
||||
// Non-standard.
|
||||
explicit
|
||||
codecvt(__c_locale __cloc, size_t __refs = 0);
|
||||
|
||||
protected:
|
||||
virtual
|
||||
~codecvt();
|
||||
|
@ -277,6 +285,10 @@
|
|||
explicit
|
||||
codecvt(size_t __refs = 0);
|
||||
|
||||
// Non-standard.
|
||||
explicit
|
||||
codecvt(__c_locale __cloc, size_t __refs = 0);
|
||||
|
||||
protected:
|
||||
virtual
|
||||
~codecvt();
|
||||
|
@ -320,8 +332,14 @@
|
|||
{
|
||||
public:
|
||||
explicit
|
||||
codecvt_byname(const char*, size_t __refs = 0)
|
||||
: codecvt<_InternT, _ExternT, _StateT>(__refs) { }
|
||||
codecvt_byname(const char* __s, size_t __refs = 0)
|
||||
: codecvt<_InternT, _ExternT, _StateT>(__refs)
|
||||
{
|
||||
if (_M_c_locale_codecvt != _S_c_locale)
|
||||
_S_destroy_c_locale(_M_c_locale_codecvt);
|
||||
_S_create_c_locale(_M_c_locale_codecvt, __s);
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual
|
||||
~codecvt_byname() { }
|
||||
|
|
|
@ -39,10 +39,19 @@ namespace std
|
|||
codecvt<char, char, mbstate_t>::
|
||||
codecvt(size_t __refs)
|
||||
: __codecvt_abstract_base<char, char, mbstate_t>(__refs)
|
||||
{ }
|
||||
{ _M_c_locale_codecvt = _S_c_locale; }
|
||||
|
||||
codecvt<char, char, mbstate_t>::
|
||||
~codecvt() { }
|
||||
codecvt(__c_locale __cloc, size_t __refs)
|
||||
: __codecvt_abstract_base<char, char, mbstate_t>(__refs)
|
||||
{ _M_c_locale_codecvt = _S_clone_c_locale(__cloc); }
|
||||
|
||||
codecvt<char, char, mbstate_t>::
|
||||
~codecvt()
|
||||
{
|
||||
if (_M_c_locale_codecvt != _S_c_locale)
|
||||
_S_destroy_c_locale(_M_c_locale_codecvt);
|
||||
}
|
||||
|
||||
codecvt_base::result
|
||||
codecvt<char, char, mbstate_t>::
|
||||
|
@ -106,10 +115,20 @@ namespace std
|
|||
// codecvt<wchar_t, char, mbstate_t> required specialization
|
||||
codecvt<wchar_t, char, mbstate_t>::
|
||||
codecvt(size_t __refs)
|
||||
: __codecvt_abstract_base<wchar_t, char, mbstate_t>(__refs) { }
|
||||
: __codecvt_abstract_base<wchar_t, char, mbstate_t>(__refs)
|
||||
{ _M_c_locale_codecvt = _S_c_locale; }
|
||||
|
||||
codecvt<wchar_t, char, mbstate_t>::
|
||||
~codecvt() { }
|
||||
codecvt(__c_locale __cloc, size_t __refs)
|
||||
: __codecvt_abstract_base<wchar_t, char, mbstate_t>(__refs)
|
||||
{ _M_c_locale_codecvt = _S_clone_c_locale(__cloc); }
|
||||
|
||||
codecvt<wchar_t, char, mbstate_t>::
|
||||
~codecvt()
|
||||
{
|
||||
if (_M_c_locale_codecvt != _S_c_locale)
|
||||
_S_destroy_c_locale(_M_c_locale_codecvt);
|
||||
}
|
||||
|
||||
codecvt_base::result
|
||||
codecvt<wchar_t, char, mbstate_t>::
|
||||
|
@ -120,7 +139,13 @@ namespace std
|
|||
{
|
||||
result __ret = error;
|
||||
size_t __len = min(__from_end - __from, __to_end - __to);
|
||||
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
|
||||
__c_locale __old = __uselocale(_M_c_locale_codecvt);
|
||||
#endif
|
||||
size_t __conv = wcsrtombs(__to, &__from, __len, &__state);
|
||||
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
|
||||
__uselocale(__old);
|
||||
#endif
|
||||
|
||||
if (__conv == __len)
|
||||
{
|
||||
|
@ -158,7 +183,13 @@ namespace std
|
|||
{
|
||||
result __ret = error;
|
||||
size_t __len = min(__from_end - __from, __to_end - __to);
|
||||
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
|
||||
__c_locale __old = __uselocale(_M_c_locale_codecvt);
|
||||
#endif
|
||||
size_t __conv = mbsrtowcs(__to, &__from, __len, &__state);
|
||||
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
|
||||
__uselocale(__old);
|
||||
#endif
|
||||
|
||||
if (__conv == __len)
|
||||
{
|
||||
|
|
|
@ -127,7 +127,7 @@ namespace std
|
|||
|
||||
// Construct all standard facets and add them to _M_facets.
|
||||
_M_init_facet(new std::ctype<char>(__cloc));
|
||||
_M_init_facet(new codecvt<char, char, mbstate_t>);
|
||||
_M_init_facet(new codecvt<char, char, mbstate_t>(__cloc));
|
||||
_M_init_facet(new numpunct<char>(__cloc));
|
||||
_M_init_facet(new num_get<char>);
|
||||
_M_init_facet(new num_put<char>);
|
||||
|
@ -143,7 +143,7 @@ namespace std
|
|||
|
||||
#ifdef _GLIBCPP_USE_WCHAR_T
|
||||
_M_init_facet(new std::ctype<wchar_t>(__cloc));
|
||||
_M_init_facet(new codecvt<wchar_t, char, mbstate_t>);
|
||||
_M_init_facet(new codecvt<wchar_t, char, mbstate_t>(__cloc));
|
||||
_M_init_facet(new numpunct<wchar_t>(__cloc));
|
||||
_M_init_facet(new num_get<wchar_t>);
|
||||
_M_init_facet(new num_put<wchar_t>);
|
||||
|
|
Loading…
Add table
Reference in a new issue