williamr@2: /* williamr@4: * Portions Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@4: * Copyright (c) 1999 williamr@2: * Boris Fomitchev williamr@2: * williamr@2: * This material is provided "as is", with absolutely no warranty expressed williamr@2: * or implied. Any use is at your own risk. williamr@2: * williamr@4: * Permission to use or copy this software for any purpose is hereby granted williamr@2: * without fee, provided the above notices are retained on all copies. williamr@2: * Permission to modify the code and to distribute modified code is granted, williamr@2: * provided the above notices are retained, and a notice that the code was williamr@2: * modified is included with the above copyright notice. williamr@2: * williamr@4: */ williamr@2: // WARNING: This is an internal header file, included by other C++ williamr@2: // standard library headers. You should not attempt to use this header williamr@2: // file directly. williamr@2: williamr@2: williamr@2: #ifndef _STLP_INTERNAL_CODECVT_H williamr@2: #define _STLP_INTERNAL_CODECVT_H williamr@2: williamr@4: #ifndef _STLP_C_LOCALE_H williamr@2: # include williamr@4: #endif williamr@4: williamr@4: #ifndef _STLP_INTERNAL_LOCALE_H williamr@2: # include williamr@4: #endif williamr@4: williamr@4: #ifndef _STLP_INTERNAL_ALGOBASE_H williamr@4: # include williamr@4: #endif williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: class _STLP_CLASS_DECLSPEC codecvt_base { williamr@2: public: williamr@2: enum result {ok, partial, error, noconv}; williamr@2: }; williamr@2: williamr@2: template williamr@2: class codecvt : public locale::facet, public codecvt_base { williamr@4: public: williamr@2: typedef _InternT intern_type; williamr@2: typedef _ExternT extern_type; williamr@2: typedef _StateT state_type; williamr@4: williamr@4: #if defined (_STLP_MSVC) && (_STLP_MSVC < 1300) williamr@4: /* For the moment VC6 do not support this facet default implementation williamr@4: * because of the static locale::id instance. When VC6 see this definition williamr@4: * it goes crasy with locale::id static instances and all the has_facet tests williamr@4: * unit tests are failing. williamr@4: */ williamr@2: }; williamr@4: #else williamr@4: explicit codecvt(size_t __refs = 0) : locale::facet(__refs) {} williamr@4: williamr@4: result out(state_type& __state, williamr@4: const intern_type* __from, williamr@4: const intern_type* __from_end, williamr@4: const intern_type*& __from_next, williamr@4: extern_type* __to, williamr@4: extern_type* __to_limit, williamr@4: extern_type*& __to_next) const { williamr@4: return do_out(__state, williamr@4: __from, __from_end, __from_next, williamr@4: __to, __to_limit, __to_next); williamr@4: } williamr@4: williamr@4: result unshift(state_type& __state, williamr@4: extern_type* __to, williamr@4: extern_type* __to_limit, williamr@4: extern_type*& __to_next) const { williamr@4: return do_unshift(__state, __to, __to_limit, __to_next); williamr@4: } williamr@4: williamr@4: result in(state_type& __state, williamr@4: const extern_type* __from, williamr@4: const extern_type* __from_end, williamr@4: const extern_type*& __from_next, williamr@4: intern_type* __to, williamr@4: intern_type* __to_limit, williamr@4: intern_type*& __to_next) const { williamr@4: return do_in(__state, williamr@4: __from, __from_end, __from_next, williamr@4: __to, __to_limit, __to_next); williamr@4: } williamr@4: williamr@4: int encoding() const _STLP_NOTHROW { return do_encoding(); } williamr@4: williamr@4: bool always_noconv() const _STLP_NOTHROW { return do_always_noconv(); } williamr@4: williamr@4: int length(const state_type& __state, williamr@4: const extern_type* __from, williamr@4: const extern_type* __end, williamr@4: size_t __max) const { williamr@4: return do_length(__state, __from, __end, __max); williamr@4: } williamr@4: williamr@4: int max_length() const _STLP_NOTHROW { return do_max_length(); } williamr@4: williamr@4: #if defined(__SYMBIAN32__WSD__) williamr@4: static _STLP_STATIC_MEMBER_DECLSPEC locale::id& GetFacetLocaleId(); williamr@4: #elif defined (__SYMBIAN32__NO_STATIC_IMPORTS__) williamr@4: static _STLP_STATIC_MEMBER_DECLSPEC locale::id& GetFacetLocaleId(); williamr@4: static locale::id id; williamr@4: #else williamr@4: // NOTE: Symbian doesn't support exporting static data. williamr@4: // Users of this class should use GetFacetLocaleId() to access the data member id williamr@4: static _STLP_STATIC_MEMBER_DECLSPEC locale::id id; williamr@4: #endif williamr@4: williamr@4: williamr@4: protected: williamr@4: ~codecvt() {} williamr@4: williamr@4: virtual result do_out(state_type&, williamr@4: const intern_type* __from, williamr@4: const intern_type*, williamr@4: const intern_type*& __from_next, williamr@4: extern_type* __to, williamr@4: extern_type*, williamr@4: extern_type*& __to_next) const williamr@4: { __from_next = __from; __to_next = __to; return noconv; } williamr@4: williamr@4: virtual result do_in (state_type&, williamr@4: const extern_type* __from, williamr@4: const extern_type*, williamr@4: const extern_type*& __from_next, williamr@4: intern_type* __to, williamr@4: intern_type*, williamr@4: intern_type*& __to_next) const williamr@4: { __from_next = __from; __to_next = __to; return noconv; } williamr@4: williamr@4: virtual result do_unshift(state_type&, williamr@4: extern_type* __to, williamr@4: extern_type*, williamr@4: extern_type*& __to_next) const williamr@4: { __to_next = __to; return noconv; } williamr@4: williamr@4: virtual int do_encoding() const _STLP_NOTHROW williamr@4: { return 1; } williamr@4: williamr@4: virtual bool do_always_noconv() const _STLP_NOTHROW williamr@4: { return true; } williamr@4: williamr@4: virtual int do_length(const state_type&, williamr@4: const extern_type* __from, williamr@4: const extern_type* __end, williamr@4: size_t __max) const williamr@4: { return (int)(min) ( __STATIC_CAST(size_t, (__end - __from)), __max); } williamr@4: williamr@4: virtual int do_max_length() const _STLP_NOTHROW williamr@4: { return 1; } williamr@4: williamr@4: private: williamr@4: codecvt(const codecvt&); williamr@4: codecvt& operator = (const codecvt&); williamr@4: }; williamr@4: williamr@4: # if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION) williamr@4: # if (_STLP_STATIC_TEMPLATE_DATA > 0) williamr@4: # if !defined (__BORLANDC__) && !defined(__SYMBIAN32__WSD__) williamr@4: template williamr@4: locale::id codecvt<_InternT, _ExternT, _StateT>::id; williamr@4: # endif williamr@4: # endif williamr@4: # endif williamr@4: #endif williamr@4: williamr@2: template williamr@2: class codecvt_byname : public codecvt<_InternT, _ExternT, _StateT> {}; williamr@2: williamr@2: _STLP_TEMPLATE_NULL williamr@4: class _STLP_CLASS_DECLSPEC codecvt williamr@4: : public locale::facet, public codecvt_base williamr@2: { williamr@4: friend class _Locale_impl; williamr@4: williamr@2: public: williamr@2: typedef char intern_type; williamr@2: typedef char extern_type; williamr@2: typedef mbstate_t state_type; williamr@2: williamr@4: explicit codecvt(size_t __refs = 0) : locale::facet(__refs) {} williamr@2: williamr@4: result out(mbstate_t& __state, williamr@2: const char* __from, williamr@2: const char* __from_end, williamr@2: const char*& __from_next, williamr@2: char* __to, williamr@4: char* __to_limit, williamr@2: char*& __to_next) const { williamr@4: return do_out(__state, williamr@2: __from, __from_end, __from_next, williamr@2: __to, __to_limit, __to_next); williamr@2: } williamr@2: williamr@2: result unshift(mbstate_t& __state, williamr@2: char* __to, char* __to_limit, char*& __to_next) const williamr@2: { return do_unshift(__state, __to, __to_limit, __to_next); } williamr@4: williamr@2: result in(state_type& __state, williamr@2: const char* __from, williamr@4: const char* __from_end, williamr@2: const char*& __from_next, williamr@4: char* __to, williamr@4: char* __to_limit, williamr@2: char*& __to_next) const { williamr@2: return do_in(__state, williamr@2: __from, __from_end, __from_next, williamr@2: __to, __to_limit, __to_next); williamr@2: } williamr@2: williamr@2: int encoding() const _STLP_NOTHROW { return do_encoding(); } williamr@2: williamr@2: bool always_noconv() const _STLP_NOTHROW { return do_always_noconv(); } williamr@2: williamr@2: int length(const state_type& __state, williamr@2: const char* __from, const char* __end, williamr@2: size_t __max) const williamr@2: { return do_length(__state, __from, __end, __max); } williamr@4: williamr@2: int max_length() const _STLP_NOTHROW { return do_max_length(); } williamr@4: #if defined(__SYMBIAN32__WSD__) williamr@4: static _STLP_STATIC_MEMBER_DECLSPEC locale::id& GetFacetLocaleId(); williamr@4: #elif defined (__SYMBIAN32__NO_STATIC_IMPORTS__) williamr@4: static _STLP_STATIC_MEMBER_DECLSPEC locale::id& GetFacetLocaleId(); williamr@4: static locale::id id; williamr@2: #else williamr@4: // NOTE: Symbian doesn't support exporting static data. williamr@4: // Users of this class should use GetFacetLocaleId() to access the data member id williamr@4: static _STLP_STATIC_MEMBER_DECLSPEC locale::id id; williamr@2: #endif williamr@2: protected: williamr@4: _STLP_DECLSPEC ~codecvt(); williamr@2: williamr@2: _STLP_DECLSPEC virtual result do_out(mbstate_t& /* __state */, williamr@2: const char* __from, williamr@2: const char* /* __from_end */, williamr@2: const char*& __from_next, williamr@2: char* __to, williamr@2: char* /* __to_limit */, williamr@2: char*& __to_next) const; williamr@2: williamr@4: _STLP_DECLSPEC virtual result do_in (mbstate_t& /* __state */ , williamr@2: const char* __from, williamr@2: const char* /* __from_end */, williamr@2: const char*& __from_next, williamr@2: char* __to, williamr@2: char* /* __to_end */, williamr@2: char*& __to_next) const; williamr@2: williamr@4: _STLP_DECLSPEC virtual result do_unshift(mbstate_t& /* __state */, williamr@2: char* __to, williamr@2: char* /* __to_limit */, williamr@2: char*& __to_next) const; williamr@2: williamr@4: _STLP_DECLSPEC virtual int do_encoding() const _STLP_NOTHROW; williamr@4: _STLP_DECLSPEC virtual bool do_always_noconv() const _STLP_NOTHROW; williamr@4: _STLP_DECLSPEC virtual int do_length(const mbstate_t& __state, williamr@4: const char* __from, williamr@2: const char* __end, williamr@2: size_t __max) const; williamr@4: _STLP_DECLSPEC virtual int do_max_length() const _STLP_NOTHROW; williamr@2: private: williamr@2: codecvt(const codecvt&); williamr@4: codecvt& operator =(const codecvt&); williamr@2: }; williamr@2: williamr@2: # ifndef _STLP_NO_WCHAR_T williamr@4: williamr@2: _STLP_TEMPLATE_NULL williamr@4: class _STLP_CLASS_DECLSPEC codecvt williamr@4: : public locale::facet, public codecvt_base williamr@2: { williamr@4: friend class _Locale_impl; williamr@2: public: williamr@2: typedef wchar_t intern_type; williamr@2: typedef char extern_type; williamr@2: typedef mbstate_t state_type; williamr@2: williamr@4: explicit codecvt(size_t __refs = 0) : locale::facet(__refs) {} williamr@2: williamr@4: result out(mbstate_t& __state, williamr@2: const wchar_t* __from, williamr@2: const wchar_t* __from_end, williamr@2: const wchar_t*& __from_next, williamr@2: char* __to, williamr@2: char* __to_limit, williamr@2: char*& __to_next) const { williamr@2: return do_out(__state, williamr@4: __from, __from_end, __from_next, williamr@2: __to, __to_limit, __to_next); williamr@2: } williamr@2: williamr@2: result unshift(mbstate_t& __state, williamr@2: char* __to, char* __to_limit, char*& __to_next) const { williamr@2: return do_unshift(__state, __to, __to_limit, __to_next); williamr@2: } williamr@4: williamr@4: result in(mbstate_t& __state, williamr@2: const char* __from, williamr@4: const char* __from_end, williamr@2: const char*& __from_next, williamr@4: wchar_t* __to, williamr@4: wchar_t* __to_limit, williamr@2: wchar_t*& __to_next) const { williamr@4: return do_in(__state, williamr@2: __from, __from_end, __from_next, williamr@4: __to, __to_limit, __to_next); williamr@2: } williamr@2: williamr@2: int encoding() const _STLP_NOTHROW { return do_encoding(); } williamr@2: williamr@2: bool always_noconv() const _STLP_NOTHROW { return do_always_noconv(); } williamr@2: williamr@4: int length(const mbstate_t& __state, williamr@4: const char* __from, const char* __end, williamr@4: size_t __max) const williamr@2: { return do_length(__state, __from, __end, __max); } williamr@4: williamr@2: int max_length() const _STLP_NOTHROW { return do_max_length(); } williamr@4: #if defined(__SYMBIAN32__WSD__) williamr@4: static _STLP_STATIC_MEMBER_DECLSPEC locale::id& GetFacetLocaleId(); williamr@4: #elif defined (__SYMBIAN32__NO_STATIC_IMPORTS__) williamr@4: static _STLP_STATIC_MEMBER_DECLSPEC locale::id& GetFacetLocaleId(); williamr@4: static locale::id id; williamr@4: #else williamr@4: // NOTE: Symbian doesn't support exporting static data. williamr@4: // Users of this class should use GetFacetLocaleId() to access the data member id williamr@4: static _STLP_STATIC_MEMBER_DECLSPEC locale::id id; williamr@4: #endif williamr@4: protected: williamr@4: _STLP_DECLSPEC ~codecvt(); williamr@2: williamr@4: _STLP_DECLSPEC virtual result do_out(mbstate_t& __state, williamr@2: const wchar_t* __from, williamr@2: const wchar_t* __from_end, williamr@2: const wchar_t*& __from_next, williamr@2: char* __to, williamr@2: char* __to_limit, williamr@2: char*& __to_next) const; williamr@2: williamr@4: _STLP_DECLSPEC virtual result do_in (mbstate_t& __state, williamr@2: const char* __from, williamr@2: const char* __from_end, williamr@2: const char*& __from_next, williamr@2: wchar_t* __to, williamr@2: wchar_t* __to_limit, williamr@2: wchar_t*& __to_next) const; williamr@2: williamr@4: _STLP_DECLSPEC virtual result do_unshift(mbstate_t& __state, williamr@4: char* __to, williamr@2: char* __to_limit, williamr@2: char*& __to_next) const; williamr@2: williamr@4: _STLP_DECLSPEC virtual int do_encoding() const _STLP_NOTHROW; williamr@2: williamr@4: _STLP_DECLSPEC virtual bool do_always_noconv() const _STLP_NOTHROW; williamr@4: williamr@4: _STLP_DECLSPEC virtual int do_length(const mbstate_t& __state, williamr@4: const char* __from, williamr@2: const char* __end, williamr@2: size_t __max) const; williamr@2: williamr@4: _STLP_DECLSPEC virtual int do_max_length() const _STLP_NOTHROW; williamr@2: williamr@2: private: williamr@2: codecvt(const codecvt&); williamr@4: codecvt& operator = (const codecvt&); williamr@2: }; williamr@2: williamr@2: # endif williamr@2: williamr@2: _STLP_TEMPLATE_NULL williamr@2: class _STLP_CLASS_DECLSPEC codecvt_byname williamr@2: : public codecvt { williamr@2: public: williamr@4: _STLP_DECLSPEC explicit codecvt_byname(const char* __name, size_t __refs = 0); williamr@4: _STLP_DECLSPEC ~codecvt_byname(); williamr@2: private: williamr@2: codecvt_byname(const codecvt_byname&); williamr@4: codecvt_byname& operator =(const codecvt_byname&); williamr@2: }; williamr@2: williamr@2: # ifndef _STLP_NO_WCHAR_T williamr@2: _STLP_TEMPLATE_NULL williamr@4: class _STLP_CLASS_DECLSPEC codecvt_byname williamr@4: : public codecvt williamr@2: { williamr@2: public: williamr@4: _STLP_DECLSPEC explicit codecvt_byname(const char * __name, size_t __refs = 0, _Locale_name_hint* __hint = 0); williamr@2: williamr@2: protected: williamr@4: _STLP_DECLSPEC ~codecvt_byname(); williamr@2: williamr@4: _STLP_DECLSPEC virtual result do_out(mbstate_t& __state, williamr@2: const wchar_t* __from, williamr@2: const wchar_t* __from_end, williamr@2: const wchar_t*& __from_next, williamr@2: char* __to, williamr@2: char* __to_limit, williamr@2: char*& __to_next) const; williamr@2: williamr@4: _STLP_DECLSPEC virtual result do_in (mbstate_t& __state, williamr@2: const char* __from, williamr@2: const char* __from_end, williamr@2: const char*& __from_next, williamr@2: wchar_t* __to, williamr@2: wchar_t* __to_limit, williamr@2: wchar_t*& __to_next) const; williamr@2: williamr@4: _STLP_DECLSPEC virtual result do_unshift(mbstate_t& __state, williamr@4: char* __to, williamr@2: char* __to_limit, williamr@2: char*& __to_next) const; williamr@2: williamr@4: _STLP_DECLSPEC virtual int do_encoding() const _STLP_NOTHROW; williamr@2: williamr@4: _STLP_DECLSPEC virtual bool do_always_noconv() const _STLP_NOTHROW; williamr@4: williamr@4: _STLP_DECLSPEC virtual int do_length(const mbstate_t& __state, williamr@4: const char* __from, williamr@2: const char* __end, williamr@2: size_t __max) const; williamr@2: williamr@4: _STLP_DECLSPEC virtual int do_max_length() const _STLP_NOTHROW; williamr@2: williamr@2: private: williamr@2: _Locale_ctype* _M_ctype; williamr@2: codecvt_byname(const codecvt_byname&); williamr@4: codecvt_byname& operator =(const codecvt_byname&); williamr@2: }; williamr@2: williamr@2: # endif williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: #endif /* _STLP_INTERNAL_CODECVT_H */ williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: williamr@2: