optimized wxMBConvStringUTF8::ToWchar() for ASCII characters
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48427 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -778,7 +778,24 @@ wxMBConvStrictUTF8::ToWChar(wchar_t *dst, size_t dstLen,
|
||||
return written;
|
||||
}
|
||||
|
||||
if ( out && !dstLen-- )
|
||||
break;
|
||||
|
||||
wxUint32 code;
|
||||
unsigned char c = *p;
|
||||
|
||||
if ( c < 0x80 )
|
||||
{
|
||||
if ( srcLen == 0 ) // the test works for wxNO_LEN too
|
||||
break;
|
||||
|
||||
if ( srcLen != wxNO_LEN )
|
||||
srcLen--;
|
||||
|
||||
code = c;
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned len = tableUtf8Lengths[c];
|
||||
if ( !len )
|
||||
break;
|
||||
@@ -789,23 +806,20 @@ wxMBConvStrictUTF8::ToWChar(wchar_t *dst, size_t dstLen,
|
||||
if ( srcLen != wxNO_LEN )
|
||||
srcLen -= len;
|
||||
|
||||
if ( out && !dstLen-- )
|
||||
break;
|
||||
|
||||
|
||||
// Char. number range | UTF-8 octet sequence
|
||||
// (hexadecimal) | (binary)
|
||||
// ----------------------+---------------------------------------------
|
||||
// ----------------------+----------------------------------------
|
||||
// 0000 0000 - 0000 007F | 0xxxxxxx
|
||||
// 0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx
|
||||
// 0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
|
||||
// 0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
|
||||
//
|
||||
// Code point value is stored in bits marked with 'x', lowest-order bit
|
||||
// of the value on the right side in the diagram above.
|
||||
// (from RFC 3629)
|
||||
// Code point value is stored in bits marked with 'x',
|
||||
// lowest-order bit of the value on the right side in the diagram
|
||||
// above. (from RFC 3629)
|
||||
|
||||
// mask to extract lead byte's value ('x' bits above), by sequence length:
|
||||
// mask to extract lead byte's value ('x' bits above), by sequence
|
||||
// length:
|
||||
static const unsigned char leadValueMask[] = { 0x7F, 0x1F, 0x0F, 0x07 };
|
||||
|
||||
// mask and value of lead byte's most significant bits, by length:
|
||||
@@ -818,10 +832,10 @@ wxMBConvStrictUTF8::ToWChar(wchar_t *dst, size_t dstLen,
|
||||
if ( (c & leadMarkerMask[len]) != leadMarkerVal[len] )
|
||||
break;
|
||||
|
||||
wxUint32 code = c & leadValueMask[len];
|
||||
code = c & leadValueMask[len];
|
||||
|
||||
// all remaining bytes, if any, are handled in the same way regardless of
|
||||
// sequence's length:
|
||||
// all remaining bytes, if any, are handled in the same way
|
||||
// regardless of sequence's length:
|
||||
for ( ; len; --len )
|
||||
{
|
||||
c = *++p;
|
||||
@@ -831,6 +845,7 @@ wxMBConvStrictUTF8::ToWChar(wchar_t *dst, size_t dstLen,
|
||||
code <<= 6;
|
||||
code |= c & 0x3F;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef WC_UTF16
|
||||
// cast is ok because wchar_t == wxUint16 if WC_UTF16
|
||||
|
Reference in New Issue
Block a user