X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dd0ef3324b56a108aa3850e4240d3f7160965c01..b4f4d3dd610a29a7be3c7a5f165520438d0328bb:/src/common/unichar.cpp diff --git a/src/common/unichar.cpp b/src/common/unichar.cpp index 5dbe8b0825..f533a9ce41 100644 --- a/src/common/unichar.cpp +++ b/src/common/unichar.cpp @@ -19,14 +19,23 @@ #pragma hdrstop #endif +#ifndef WX_PRECOMP + #include "wx/strconv.h" // wxConvLibc +#endif + #include "wx/unichar.h" +#include "wx/stringops.h" // =========================================================================== // implementation // =========================================================================== +// --------------------------------------------------------------------------- +// wxUniChar +// --------------------------------------------------------------------------- + /* static */ -wxUniChar::unicode_type wxUniChar::From8bit(char c) +wxUniChar::value_type wxUniChar::From8bit(char c) { // all supported charsets have the first 128 characters same as ASCII: if ( (unsigned char)c < 0x80 ) @@ -39,7 +48,7 @@ wxUniChar::unicode_type wxUniChar::From8bit(char c) } /* static */ -char wxUniChar::To8bit(wxUniChar::unicode_type c) +char wxUniChar::To8bit(wxUniChar::value_type c) { // all supported charsets have the first 128 characters same as ASCII: if ( c < 0x80 ) @@ -51,3 +60,40 @@ char wxUniChar::To8bit(wxUniChar::unicode_type c) return '?'; // FIXME-UTF8: what to use as failure character? return buf[0]; } + + +// --------------------------------------------------------------------------- +// wxUniCharRef +// --------------------------------------------------------------------------- + +#if wxUSE_UNICODE_UTF8 +wxUniChar wxUniCharRef::UniChar() const +{ + return wxStringOperations::DecodeChar(m_pos); +} + +wxUniCharRef& wxUniCharRef::operator=(const wxUniChar& c) +{ + wxStringOperations::Utf8CharBuffer utf(wxStringOperations::EncodeChar(c)); + size_t lenOld = wxStringOperations::GetUtf8CharLength(*m_pos); + size_t lenNew = wxStringOperations::GetUtf8CharLength(utf[0]); + + if ( lenNew == lenOld ) + { + iterator pos(m_pos); + for ( size_t i = 0; i < lenNew; ++i, ++pos ) + *pos = utf[i]; + } + else + { + size_t idx = m_pos - m_str.begin(); + + m_str.replace(m_pos, m_pos + lenOld, utf, lenNew); + + // this is needed to keep m_pos valid: + m_pos = m_str.begin() + idx; + } + + return *this; +} +#endif // wxUSE_UNICODE_UTF8