diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index dd8ed7eabd5..620a3c59b89 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2000-08-10 Benjamin Kosnik + + * bits/locale_facets.tcc: Formatting tweaks. + * bits/locale_facets.h (__enc_traits): Start integrating this + into codecvt, ctype. Formatting tweaks. + 2000-08-09 Benjamin Kosnik Preliminary wchar_t implementation, with trivial encodings. diff --git a/libstdc++-v3/bits/locale_facets.h b/libstdc++-v3/bits/locale_facets.h index 65e8558213d..2bec59509bd 100644 --- a/libstdc++-v3/bits/locale_facets.h +++ b/libstdc++-v3/bits/locale_facets.h @@ -84,24 +84,67 @@ namespace std #ifdef _GLIBCPP_USE_WCHAR_T // Extensions to use icov for dealing with character encodings, // including conversions and comparisons between various character - // sets. This object encapsulates data that codecvt and possibly - // ctype will use. + // sets. This object encapsulates data that may need to be shared between + // char_traits, codecvt and ctype. template class __enc_traits { public: // Types: - typedef iconv_t __conv_type; typedef _IntT __intc_type; typedef _ExtT __extc_type; - - // max size of charset encoding name + typedef iconv_t __conv_type; + typedef mbstate_t __state_type; + + // Data Members: + // Max size of charset encoding name static const int __max_size = 32; - // name of internal character set encoding. + // Name of internal character set encoding. char __intc_enc[__max_size]; - // name of external character set encoding. + // Name of external character set encoding. char __extc_enc[__max_size]; + // Conversion descriptor between external encoding to internal encoding. + __conv_type __in_conv; + // Conversion descriptor between internal encoding to external encoding. + __conv_type __out_conv; + + __enc_traits() + { + // __intc_end = whatever we are using internally, which is + // UCS4 (linux) + // UCS2 (microsoft, java, aix, whatever...) + // XXX Currently don't know how to get this data from target system... + strcpy(__intc_enc, "UCS4"); + + // __extc_end = external codeset in current locale + strcpy(__extc_enc, nl_langinfo(CODESET)); + __in_conv = iconv_open(__intc_enc, __extc_enc); + __out_conv = iconv_open(__extc_enc, __intc_enc); + if (__out_conv == (iconv_t) -1 || __in_conv == (iconv_t) -1) + { + // XXX Extended error checking. + } + } + + __enc_traits(const char* __int, const char* __ext) + { + strcpy(__intc_enc, __int); + strcpy(__extc_enc, __ext); + __in_conv = iconv_open(__intc_enc, __extc_enc); + __out_conv = iconv_open(__extc_enc, __intc_enc); + if (__out_conv == (iconv_t) -1 || __in_conv == (iconv_t) -1) + { + // XXX Extended error checking. + } + } + + ~__enc_traits() + { + iconv_close(__in_conv); + iconv_close(__out_conv); + } + const char* _M_get_intc_enc(void) { return __intc_enc; } @@ -117,19 +160,14 @@ namespace std void _M_set_extc_enc(const char* __c) { strcpy(__extc_enc, __c); } - - __enc_traits(const char* __int, const char* __ext) - { - // __intc_end = whatever we are using internally, which is - // almost alwyas UCS4 (linux) or UCS2 (microsoft, aix, - // whatever...) - // __extc_end = nl_langinfo(CODESET) - strcpy(__intc_enc, __int); - strcpy(__extc_enc, __ext); - } - + protected: - __enc_traits(); + // 21.1.2 traits typedefs + // p4 + // typedef STATE_T state_type + // requires: state_type shall meet the requirements of + // CopyConstructible types (20.1.3) + // XXX because of this, these might actually need to be filled out. __enc_traits(const __enc_traits&); }; #endif //_GLIBCPP_USE_WCHAR_T @@ -652,7 +690,7 @@ namespace std template - class codecvt : public _Codecvt<_InternT,_ExternT,_StateT> + class codecvt : public _Codecvt<_InternT, _ExternT, _StateT> { public: // Types: @@ -665,14 +703,14 @@ namespace std explicit codecvt(size_t __refs = 0) - : _Codecvt<_InternT,_ExternT,_StateT> (__refs) { } + : _Codecvt<_InternT, _ExternT, _StateT> (__refs) { } protected: virtual ~codecvt() { } }; - // codecvt specialization + // codecvt specialization template<> class codecvt : public _Codecvt diff --git a/libstdc++-v3/bits/locale_facets.tcc b/libstdc++-v3/bits/locale_facets.tcc index 539b051ee75..ce6bb887d7e 100644 --- a/libstdc++-v3/bits/locale_facets.tcc +++ b/libstdc++-v3/bits/locale_facets.tcc @@ -161,7 +161,7 @@ namespace std locale::id ctype<_CharT>::id; template - locale::id codecvt<_InternT,_ExternT,_StateT>::id; + locale::id codecvt<_InternT, _ExternT, _StateT>::id; template int _Format_cache<_CharT>::_S_pword_ix;