📄 xlocale
字号:
typedef unsigned short _Elem;
typedef char _Byte;
typedef _Mbstatet _Statype;
typedef _Elem intern_type;
typedef _Byte extern_type;
typedef _Statype state_type;
result __CLR_OR_THIS_CALL in(_Statype& _State,
const _Byte *_First1, const _Byte *_Last1, const _Byte *& _Mid1,
_Elem *_First2, _Elem *_Last2, _Elem *& _Mid2) const
{ // convert bytes [_First1, _Last1) to [_First2, _Last)
return (do_in(_State,
_First1, _Last1, _Mid1, _First2, _Last2, _Mid2));
}
result __CLR_OR_THIS_CALL out(_Statype& _State,
const _Elem *_First1, const _Elem *_Last1, const _Elem *& _Mid1,
_Byte *_First2, _Byte *_Last2, _Byte *& _Mid2) const
{ // convert [_First1, _Last1) to bytes [_First2, _Last)
return (do_out(_State,
_First1, _Last1, _Mid1, _First2, _Last2, _Mid2));
}
result __CLR_OR_THIS_CALL unshift(_Statype& _State,
_Byte *_First2, _Byte *_Last2, _Byte *& _Mid2) const
{ // generate bytes to return to default shift state
return (do_unshift(_State,
_First2, _Last2, _Mid2));
}
int __CLR_OR_THIS_CALL length(const _Statype& _State, const _Byte *_First1,
const _Byte *_Last1, size_t _Count) const
{ // return min(_Count, converted length of bytes [_First1, _Last1))
return (do_length(_State, _First1, _Last1, _Count));
}
__PURE_APPDOMAIN_GLOBAL static locale::id id;
explicit __CLR_OR_THIS_CALL codecvt(size_t _Refs = 0)
: codecvt_base(_Refs)
{ // construct from current locale
_BEGIN_LOCINFO(_Lobj)
_Init(_Lobj);
_END_LOCINFO()
}
__CLR_OR_THIS_CALL codecvt(const _Locinfo& _Lobj, size_t _Refs = 0)
: codecvt_base(_Refs)
{ // construct from specified locale
_Init(_Lobj);
}
static size_t __CLRCALL_OR_CDECL _Getcat(const locale::facet **_Ppf = 0,
const locale *_Ploc = 0)
{ // return locale category mask and construct standard facet
if (_Ppf != 0 && *_Ppf == 0)
*_Ppf = _NEW_CRT codecvt<_Elem, _Byte, _Statype>(
_Locinfo(_Ploc->c_str()));
return (_X_CTYPE);
}
protected:
virtual __CLR_OR_THIS_CALL ~codecvt()
{ // destroy the object
}
void __CLR_OR_THIS_CALL _Init(const _Locinfo& _Lobj)
{ // initialize from _Lobj
_Cvt = _Lobj._Getcvt();
}
virtual result __CLR_OR_THIS_CALL do_in(_Statype& _State,
const _Byte *_First1, const _Byte *_Last1, const _Byte *& _Mid1,
_Elem *_First2, _Elem *_Last2, _Elem *& _Mid2) const
{ // convert bytes [_First1, _Last1) to [_First2, _Last)
_DEBUG_RANGE(_First1, _Last1);
_DEBUG_RANGE(_First2, _Last2);
_Mid1 = _First1, _Mid2 = _First2;
result _Ans = _Mid1 == _Last1 ? ok : partial;
int _Bytes;
while (_Mid1 != _Last1 && _Mid2 != _Last2)
switch (_Bytes = _Mbrtowc((wchar_t *)_Mid2, _Mid1, _Last1 - _Mid1,
&_State, &_Cvt))
{ // test result of locale-specific mbrtowc call
case -2: // partial conversion
_Mid1 = _Last1;
return (_Ans);
case -1: // failed conversion
return (error);
case 0: // may have converted null character
if (*_Mid2 == (_Elem)0)
_Bytes = (int)_CSTD strlen(_Mid1) + 1;
// fall through
default: // converted _Bytes bytes to an unsigned short
if (_Bytes == -3)
_Bytes = 0; // wchar_t generated from state info
_Mid1 += _Bytes;
++_Mid2;
_Ans = ok;
}
return (_Ans);
}
virtual result __CLR_OR_THIS_CALL do_out(_Statype& _State,
const _Elem *_First1, const _Elem *_Last1, const _Elem *& _Mid1,
_Byte *_First2, _Byte *_Last2, _Byte *& _Mid2) const
{ // convert [_First1, _Last1) to bytes [_First2, _Last)
_DEBUG_RANGE(_First1, _Last1);
_DEBUG_RANGE(_First2, _Last2);
_Mid1 = _First1, _Mid2 = _First2;
result _Ans = _Mid1 == _Last1 ? ok : partial;
int _Bytes;
while (_Mid1 != _Last1 && _Mid2 != _Last2)
if ((int)MB_CUR_MAX <= _Last2 - _Mid2)
if ((_Bytes = _Wcrtomb(_Mid2, *_Mid1,
&_State, &_Cvt)) < 0)
return (error); // locale-specific wcrtomb failed
else
++_Mid1, _Mid2 += _Bytes, _Ans = ok;
else
{ // destination too small, convert into buffer
_Byte _Buf[MB_LEN_MAX];
_Statype _Stsave = _State;
if ((_Bytes = _Wcrtomb(_Buf, *_Mid1,
&_State, &_Cvt)) < 0)
return (error); // locale-specific wcrtomb failed
else if (_Last2 - _Mid2 < _Bytes)
{ // converted too many, roll back and return previous
_State = _Stsave;
return (_Ans);
}
else
{ // copy converted bytes from buffer
_CSTD memcpy(_Mid2, _Buf, _Bytes);
++_Mid1, _Mid2 += _Bytes, _Ans = ok;
}
}
return (_Ans);
}
virtual result __CLR_OR_THIS_CALL do_unshift(_Statype& _State,
_Byte *_First2, _Byte *_Last2, _Byte *& _Mid2) const
{ // generate bytes to return to default shift state
_DEBUG_RANGE(_First2, _Last2);
_Mid2 = _First2;
result _Ans = ok;
int _Bytes;
_Byte _Buf[MB_LEN_MAX];
_Statype _Stsave = _State;
if ((_Bytes = _Wcrtomb(_Buf, L'\0', &_State, &_Cvt)) <= 0)
_Ans = error; // locale-specific wcrtomb failed
else if (_Last2 - _Mid2 < --_Bytes)
{ // converted too many, roll back and return
_State = _Stsave;
_Ans = partial;
}
else if (0 < _Bytes)
{ // copy converted bytes from buffer
_CSTD memcpy(_Mid2, _Buf, _Bytes);
_Mid2 += _Bytes;
}
return (_Ans);
}
virtual int __CLR_OR_THIS_CALL do_length(const _Statype& _State, const _Byte *_First1,
const _Byte *_Last1, size_t _Count) const
{ // return min(_Count, converted length of bytes [_First1, _Last1))
_DEBUG_RANGE(_First1, _Last1);
int _Wchars;
const _Byte *_Mid1;
_Statype _Mystate = _State;
for (_Wchars = 0, _Mid1 = _First1;
(size_t)_Wchars < _Count && _Mid1 != _Last1; )
{ // convert another unsigned char
int _Bytes;
_Elem _Ch;
switch (_Bytes = _Mbrtowc((wchar_t *)&_Ch, _Mid1, _Last1 - _Mid1,
&_Mystate, &_Cvt))
{ // test result of locale-specific mbrtowc call
case -2: // partial conversion
return (_Wchars);
case -1: // failed conversion
return (_Wchars);
case 0: // may have converted null character
if (_Ch == (_Elem)0)
_Bytes = (int)_CSTD strlen(_Mid1) + 1;
// fall through
default: // converted _Bytes bytes to an unsigned char
if (_Bytes == -3)
_Bytes = 0; // wchar_t generated from state info
_Mid1 += _Bytes;
++_Wchars;
}
}
return (_Wchars);
}
virtual bool __CLR_OR_THIS_CALL do_always_noconv() const _THROW0()
{ // return true if conversions never change input
return (false);
}
virtual int __CLR_OR_THIS_CALL do_max_length() const _THROW0()
{ // return maximum length required for a conversion (from codecvt)
return (MB_LEN_MAX);
}
private:
_Locinfo::_Cvtvec _Cvt; // locale info passed to _Mbrtowc, _Wcrtomb
};
#endif /* _NATIVE_WCHAR_T_DEFINED */
// TEMPLATE CLASS codecvt_byname
template<class _Elem,
class _Byte,
class _Statype>
class codecvt_byname
: public codecvt<_Elem, _Byte, _Statype>
{ // codecvt for named locale
public:
explicit __CLR_OR_THIS_CALL codecvt_byname(const char *_Locname, size_t _Refs = 0)
: codecvt<_Elem, _Byte, _Statype>(_Locinfo(_Locname), _Refs)
{ // construct for named locale
}
#if _HAS_CPP0X
explicit __CLR_OR_THIS_CALL codecvt_byname(const string& _Str, size_t _Refs = 0)
: codecvt<_Elem, _Byte, _Statype>(_Locinfo(_Str.c_str()), _Refs)
{ // construct for named locale
}
#endif /* _HAS_CPP0X */
protected:
virtual __CLR_OR_THIS_CALL ~codecvt_byname()
{ // destroy the object
}
};
// STRUCT ctype_base
#pragma warning(push)
#pragma warning(disable: 4275)
struct _CRTIMP2_PURE ctype_base
: public locale::facet
{ // base for ctype
enum
{ // constants for character classifications
alnum = _DI|_LO|_UP|_XA, alpha = _LO|_UP|_XA,
cntrl = _BB, digit = _DI, graph = _DI|_LO|_PU|_UP|_XA,
lower = _LO, print = _DI|_LO|_PU|_SP|_UP|_XA|_XD,
punct = _PU, space = _CN|_SP|_XS, upper = _UP,
xdigit = _XD};
typedef short mask; // to match <ctype.h>
__CLR_OR_THIS_CALL ctype_base(size_t _Refs = 0)
: locale::facet(_Refs)
{ // default constructor
}
__CLR_OR_THIS_CALL ~ctype_base()
{ // destroy the object
}
};
#pragma warning(pop)
// TEMPLATE CLASS ctype
template<class _Elem>
class ctype
: public ctype_base
{ // facet for classifying elements, converting cases
public:
typedef _Elem char_type;
bool __CLR_OR_THIS_CALL is(mask _Maskval, _Elem _Ch) const
{ // test if element fits any mask classifications
return (do_is(_Maskval, _Ch));
}
const _Elem *__CLR_OR_THIS_CALL is(const _Elem *_First, const _Elem *_Last,
mask *_Dest) const
{ // get mask sequence for elements in [_First, _Last)
return (do_is(_First, _Last, _Dest));
}
const _Elem *__CLR_OR_THIS_CALL scan_is(mask _Maskval, const _Elem *_First,
const _Elem *_Last) const
{ // find first in [_First, _Last) that fits mask classification
return (do_scan_is(_Maskval, _First, _Last));
}
const _Elem *__CLR_OR_THIS_CALL scan_not(mask _Maskval, const _Elem *_First,
const _Elem *_Last) const
{ // find first in [_First, _Last) not fitting mask classification
return (do_scan_not(_Maskval, _First, _Last));
}
_Elem __CLR_OR_THIS_CALL tolower(_Elem _Ch) const
{ // convert element to lower case
return (do_tolower(_Ch));
}
const _Elem *__CLR_OR_THIS_CALL tolower(_Elem *_First, const _Elem *_Last) const
{ // convert [_First, _Last) in place to lower case
return (do_tolower(_First, _Last));
}
_Elem __CLR_OR_THIS_CALL toupper(_Elem _Ch) const
{ // convert element to upper case
return (do_toupper(_Ch));
}
const _Elem *__CLR_OR_THIS_CALL toupper(_Elem *_First, const _Elem *_Last) const
{ // convert [_First, _Last) in place to upper case
return (do_toupper(_First, _Last));
}
_Elem __CLR_OR_THIS_CALL widen(char _Byte) const
{ // widen char
return (do_widen(_Byte));
}
const char *__CLR_OR_THIS_CALL widen(const char *_First, const char *_Last,
_Elem *_Dest) const
{ // widen chars in [_First, _Last)
return (do_widen(_First, _Last, _Dest));
}
char __CLR_OR_THIS_CALL narrow(_Elem _Ch, char _Dflt = '\0') const
{ // narrow element to char
return (do_narrow(_Ch, _Dflt));
}
const _Elem *__CLR_OR_THIS_CALL narrow(const _Elem *_First, const _Elem *_Last,
char _Dflt, char *_Dest) const
{ // narrow elements in [_First, _Last) to chars
return (do_narrow(_First, _Last, _Dflt, _Dest));
}
__PURE_APPDOMAIN_GLOBAL static locale::id id;
explicit __CLR_OR_THIS_CALL ctype(size_t _Refs = 0)
: ctype_base(_Refs)
{ // construct from current locale
_BEGIN_LOCINFO(_Lobj)
_Init(_Lobj);
_END_LOCINFO()
}
__CLR_OR_THIS_CALL ctype(const _Locinfo& _Lobj, size_t _Refs = 0)
: ctype_base(_Refs)
{ // construct from specified locale
_Init(_Lobj);
}
static size_t __CLRCALL_OR_CDECL _Getcat(const locale::facet **_Ppf = 0,
const locale *_Ploc = 0)
{ // return locale category mask and construct standard facet
if (_Ppf != 0 && *_Ppf == 0)
*_Ppf = _NEW_CRT ctype<_Elem>(
_Locinfo(_Ploc->c_str()));
return (_X_CTYPE);
}
protected:
virtual __CLR_OR_THIS_CALL ~ctype()
{ // destroy the object
if (_Ctype._Delfl)
free((void *)_Ctype._Table);
}
void __CLR_OR_THIS_CALL _Init(const _Locinfo& _Lobj)
{ // initialize from _Lobj
_Ctype = _Lobj._Getctype();
}
virtual bool __CLR_OR_THIS_CALL do_is(mask _Maskval, _Elem _Ch) const
{ // test if element fits any mask classifications
return ((_Ctype._Table[(unsigned char)narrow(_Ch)]
& _Maskval) != 0);
}
virtual const _Elem *__CLR_OR_THIS_CALL do_is(const _Elem *_First, const _Elem *_Last,
mask *_Dest) const
{ // get mask sequence for elements in [_First, _Last)
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Dest);
for (; _First != _Last; ++_First, ++_Dest)
*_Dest = _Ctype._Table[(unsigned char)narrow(*_First)];
return (_First);
}
virtual const _Elem *__CLR_OR_THIS_CALL do_scan_is(mask _Maskval,
const _Elem *_First, const _Elem *_Last) const
{ // find first in [_First, _Last) that fits mask classification
_DEBUG_RANGE(_First, _Last);
for (; _First != _Last && !is(_Maskval, *_First); ++_First)
;
return (_First);
}
virtual const _Elem *__CLR_OR_THIS_CALL do_scan_not(mask _Maskval,
const _Elem *_First, const _Elem *_Last) const
{ // find first in [_First, _Last) not fitting mask classification
_DEBUG_RANGE(_First, _Last);
for (; _First != _Last && is(_Maskval, *_First); ++_First)
;
return (_First);
}
virtual _Elem __CLR_OR_THIS_CALL do_tolower(_Elem _Ch) const
{ // convert element to lower case
unsigned char _Byte = (unsigned char)narrow(_Ch, '\0');
if (_Byte == '\0')
return (_Ch);
else
return (widen((char)_Tolower(_Byte, &_Ctype)));
}
virtual const _Elem *__CLR_OR_THIS_CALL do_tolower(_Elem *_First,
const _Elem *_Last) const
{ // convert [_First,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -