Allow calling wxStrchr() with a narrow string and wide character.

Calls to wxStrchr(char-string, wide-char) would previously fail if wide
character couldn't be converted to a single character in the current locale
encoding. Change it to simply return NULL in this case as it's a safe and
useful generalization: a narrow string will never contain a wide character not
representable in the current locale.

Add wxUniChar::GetAsChar() to help with implementing this.

Closes #11487.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62738 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-11-28 14:37:03 +00:00
parent 85b1997c09
commit 874dbd3a4a
5 changed files with 105 additions and 39 deletions

View File

@@ -58,27 +58,31 @@ wxUniChar::value_type wxUniChar::FromHi8bit(char c)
}
/* static */
char wxUniChar::ToHi8bit(wxUniChar::value_type c)
char wxUniChar::ToHi8bit(wxUniChar::value_type v)
{
#if wxUSE_UTF8_LOCALE_ONLY
wxFAIL_MSG( "character cannot be converted to single UTF-8 byte" );
wxUnusedVar(c);
char c;
if ( !GetAsHi8bit(v, &c) )
{
wxFAIL_MSG( "character cannot be converted to single byte" );
c = '?'; // FIXME-UTF8: what to use as failure character?
}
return '?'; // FIXME-UTF8: what to use as failure character?
#else
return c;
}
/* static */
bool wxUniChar::GetAsHi8bit(value_type v, char *c)
{
wchar_t wbuf[2];
wbuf[0] = c;
wbuf[0] = v;
wbuf[1] = L'\0';
char cbuf[2];
if ( wxConvLibc.FromWChar(cbuf, 2, wbuf, 2) != 2 )
{
wxFAIL_MSG( "character cannot be converted to single byte" );
return '?'; // FIXME-UTF8: what to use as failure character?
}
return cbuf[0];
#endif
}
return false;
*c = cbuf[0];
return true;
}
// ---------------------------------------------------------------------------
// wxUniCharRef