]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/unichar.cpp
WX_PRECOMP, not WXPRECOMP
[wxWidgets.git] / src / common / unichar.cpp
index 5dbe8b0825988fc5951dd06bd8b79eb3bfbc2c8b..f533a9ce417ae16e38df1309b46749e0f124540d 100644 (file)
     #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