mirror of
https://github.com/reactos/reactos.git
synced 2024-08-26 05:08:39 +00:00
443 lines
15 KiB
C++
443 lines
15 KiB
C++
/*
|
|
* 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:
|
|
|