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