}
#endif
-#if wxUSE_UNICODE
+#if wxUSE_UNICODE && !wxUSE_UTF8_LOCALE_ONLY
const char* wxCStrData::AsChar() const
{
+#if wxUSE_UNICODE_UTF8
+ if ( wxLocaleIsUtf8 )
+ return AsInternal();
+#endif
+ // under non-UTF8 locales, we have to convert the internal UTF-8
+ // representation using wxConvLibc and cache the result
+
wxString *str = wxConstCast(m_str, wxString);
// convert the string:
// and keep it:
return str->m_convertedToChar + m_offset;
}
-#endif // wxUSE_UNICODE
+#endif // wxUSE_UNICODE && !wxUSE_UTF8_LOCALE_ONLY
#if !wxUSE_UNICODE_WCHAR
const wchar_t* wxCStrData::AsWChar() const
wxString::SubstrBufFromMB wxString::ConvertStr(const char *psz, size_t nLength,
const wxMBConv& conv)
{
- // FIXME-UTF8: return as-is without copying under UTF8 locale, return
- // converted string under other locales - needs wxCharBuffer
- // changes
-
// anything to do?
if ( !psz || nLength == 0 )
return SubstrBufFromMB("", 0);
+ // if psz is already in UTF-8, we don't have to do the roundtrip to
+ // wchar_t* and back:
+ if ( conv.IsUTF8() )
+ {
+ // we need to validate the input because UTF8 iterators assume valid
+ // UTF-8 sequence and psz may be invalid:
+ if ( wxStringOperations::IsValidUtf8String(psz, nLength) )
+ {
+ return SubstrBufFromMB(wxCharBuffer::CreateNonOwned(psz), nLength);
+ }
+ // else: do the roundtrip through wchar_t*
+ }
+
if ( nLength == npos )
nLength = wxNO_LEN;
return SubstrBufFromMB("", 0);
// and then to UTF-8:
- SubstrBufFromMB buf(ConvertStr(wcBuf, wcLen, wxConvUTF8));
+ SubstrBufFromMB buf(ConvertStr(wcBuf, wcLen, wxMBConvUTF8()));
// widechar -> UTF-8 conversion isn't supposed to ever fail:
wxASSERT_MSG( buf.data, _T("conversion to UTF-8 failed") );
const wxWCharBuffer wxString::wc_str() const
{
- return wxConvUTF8.cMB2WC(m_impl.c_str(),
- m_impl.length() + 1 /* size, not length */,
- NULL);
+ return wxMBConvUTF8().cMB2WC(m_impl.c_str(),
+ m_impl.length() + 1 /* size, not length */,
+ NULL);
}
const wxCharBuffer wxString::mb_str(const wxMBConv& conv) const
{
- // FIXME-UTF8: optimize the case when conv==wxConvUTF8 or wxConvLibc
- // under UTF8 locale
+ if ( conv.IsUTF8() )
+ return wxCharBuffer::CreateNonOwned(m_impl.c_str());
+
// FIXME-UTF8: use wc_str() here once we have buffers with length
size_t wcLen;
wxWCharBuffer wcBuf(
- wxConvUTF8.cMB2WC(m_impl.c_str(),
- m_impl.length() + 1 /* size, not length */,
- &wcLen));
+ wxMBConvUTF8().cMB2WC(m_impl.c_str(),
+ m_impl.length() + 1 /* size, not length */,
+ &wcLen));
if ( !wcLen )
return wxCharBuffer("");
// check that the string starts with prefix and return the rest of the string
// in the provided pointer if it is not NULL, otherwise return false
-bool wxString::StartsWith(const wxChar *prefix, wxString *rest) const
+bool wxString::StartsWith(const wxString& prefix, wxString *rest) const
{
- wxASSERT_MSG( prefix, _T("invalid parameter in wxString::StartsWith") );
-
- // first check if the beginning of the string matches the prefix: note
- // that we don't have to check that we don't run out of this string as
- // when we reach the terminating NUL, either prefix string ends too (and
- // then it's ok) or we break out of the loop because there is no match
- const wxChar *p = c_str();
- while ( *prefix )
- {
- if ( *prefix++ != *p++ )
- {
- // no match
- return false;
- }
- }
+ if ( compare(0, prefix.length(), prefix) != 0 )
+ return false;
if ( rest )
{
// put the rest of the string into provided pointer
- *rest = p;
+ rest->assign(*this, prefix.length(), npos);
}
return true;
// check that the string ends with suffix and return the rest of it in the
// provided pointer if it is not NULL, otherwise return false
-bool wxString::EndsWith(const wxChar *suffix, wxString *rest) const
+bool wxString::EndsWith(const wxString& suffix, wxString *rest) const
{
- wxASSERT_MSG( suffix, _T("invalid parameter in wxString::EndssWith") );
-
- int start = length() - wxStrlen(suffix);
+ int start = length() - suffix.length();
if ( start < 0 || compare(start, npos, suffix) != 0 )
return false;
// formatted output
// ---------------------------------------------------------------------------
+#if !wxUSE_UTF8_LOCALE_ONLY
/* static */
#ifdef wxNEEDS_WXSTRING_PRINTF_MIXIN
-wxString wxStringPrintfMixinBase::DoFormat(const wxString& format, ...)
+wxString wxStringPrintfMixinBase::DoFormatWchar(const wxChar *format, ...)
#else
-wxString wxString::DoFormat(const wxString& format, ...)
+wxString wxString::DoFormatWchar(const wxChar *format, ...)
#endif
{
va_list argptr;
return s;
}
+#endif // !wxUSE_UTF8_LOCALE_ONLY
+
+#if wxUSE_UNICODE_UTF8
+/* static */
+wxString wxString::DoFormatUtf8(const char *format, ...)
+{
+ va_list argptr;
+ va_start(argptr, format);
+
+ wxString s;
+ s.PrintfV(format, argptr);
+
+ va_end(argptr);
+
+ return s;
+}
+#endif // wxUSE_UNICODE_UTF8
/* static */
wxString wxString::FormatV(const wxString& format, va_list argptr)
return s;
}
+#if !wxUSE_UTF8_LOCALE_ONLY
#ifdef wxNEEDS_WXSTRING_PRINTF_MIXIN
-int wxStringPrintfMixinBase::DoPrintf(const wxString& format, ...)
+int wxStringPrintfMixinBase::DoPrintfWchar(const wxChar *format, ...)
#else
-int wxString::DoPrintf(const wxString& format, ...)
+int wxString::DoPrintfWchar(const wxChar *format, ...)
#endif
{
va_list argptr;
return iLen;
}
+#endif // !wxUSE_UTF8_LOCALE_ONLY
+
+#if wxUSE_UNICODE_UTF8
+int wxString::DoPrintfUtf8(const char *format, ...)
+{
+ va_list argptr;
+ va_start(argptr, format);
+
+ int iLen = PrintfV(format, argptr);
+
+ va_end(argptr);
+
+ return iLen;
+}
+#endif // wxUSE_UNICODE_UTF8
#if wxUSE_UNICODE_UTF8
template<typename BufferType>
int wxString::PrintfV(const wxString& format, va_list argptr)
{
- va_list argcopy;
- wxVaCopy(argcopy, argptr);
-
#if wxUSE_UNICODE_UTF8
#if wxUSE_STL_BASED_WXSTRING
typedef wxStringTypeBuffer<char> Utf8Buffer;
#endif
#if wxUSE_UTF8_LOCALE_ONLY
- return DoStringPrintfV<Utf8Buffer>(*this, format, argcopy);
+ return DoStringPrintfV<Utf8Buffer>(*this, format, argptr);
#else
#if wxUSE_UNICODE_UTF8
if ( wxLocaleIsUtf8 )
- return DoStringPrintfV<Utf8Buffer>(*this, format, argcopy);
+ return DoStringPrintfV<Utf8Buffer>(*this, format, argptr);
else
// wxChar* version
- return DoStringPrintfV<wxStringBuffer>(*this, format, argcopy);
+ return DoStringPrintfV<wxStringBuffer>(*this, format, argptr);
#else
- return DoStringPrintfV(*this, format, argcopy);
+ return DoStringPrintfV(*this, format, argptr);
#endif // UTF8/WCHAR
#endif
}