]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/string.cpp
more wxPostEvent MT fixes
[wxWidgets.git] / src / common / string.cpp
index c638d436ec01b694091847680a5dd35decc55f7d..1c8fadcb69b5bd84bbd555260491b5a1781db20e 100644 (file)
@@ -1,11 +1,12 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        string.cpp
 // Purpose:     wxString class
-// Author:      Vadim Zeitlin
+// Author:      Vadim Zeitlin, Ryan Norton
 // Modified by:
 // Created:     29/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
+//              (c) 2004 Ryan Norton <wxprojects@comcast.net>
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
@@ -1027,45 +1028,21 @@ wxString::wxString(const char *psz, wxMBConv& conv, size_t nLength)
     // anything to do?
     if ( (nLen != 0) && (nLen != (size_t)-1) )
     {
-        //Get length of converted string
-        size_t dwConvLen = conv.MB2WC(NULL, psz, 0, nLen);
+        //Convert string
+        size_t nRealSize;
+        wxWCharBuffer theBuffer = conv.cMB2WC(psz, nLen, &nRealSize);
 
-        //if valid, do the conversion
-        if (dwConvLen != (size_t) -1)
-        {
-            //Get internal buffer
-            wxStringBufferLength internalBuffer(*this, dwConvLen + 1);
-
-            //Do the actual conversion & Set the length of the buffer
-            internalBuffer.SetLength(
-                   conv.MB2WC(internalBuffer, psz, dwConvLen + 1, nLen)
-                                    );
-        }
+        //Copy 
+        if (nRealSize)
+            assign( theBuffer.data() , nRealSize - 1 );
     }
 }
 
 //Convert wxString in Unicode mode to a multi-byte string
 const wxCharBuffer wxString::mb_str(wxMBConv& conv) const
 {
-    //Get length of converted string
-    size_t dwConvLen = conv.WC2MB(NULL, (*this).c_str(), 0, length());
-
-    //if valid, do the conversion
-    if (dwConvLen != (size_t) -1)
-    {
-        //Create good buffer
-        wxCharBuffer buffer(dwConvLen + 1);
-
-        //Do the actual conversion
-        conv.WC2MB(buffer.data(), (*this).c_str(), dwConvLen + 1, length());
-
-        return buffer;
-    }
-
-    //create bogus buffer
-    wxCharBuffer buffer(1);
-    buffer.data()[0u] = 0;
-    return buffer;
+    size_t dwOutSize;
+    return conv.cWC2MB(c_str(), length(), &dwOutSize);
 }
 
 #else // ANSI
@@ -1107,20 +1084,13 @@ wxString::wxString(const wchar_t *pwz, wxMBConv& conv, size_t nLength)
     // anything to do?
     if ( (nLen != 0) && (nLen != (size_t)-1) )
     {
-        //Get length of converted string
-        size_t dwConvLen = conv.WC2MB(NULL, pwz, 0, nLen);
+        //Convert string
+        size_t nRealSize;
+        wxCharBuffer theBuffer = conv.cWC2MB(pwz, nLen, &nRealSize);
 
-        //if valid, do the conversion
-        if (dwConvLen != (size_t) -1)
-        {
-            //Get internal buffer
-            wxStringBufferLength internalBuffer(*this, dwConvLen + 1);
-
-            //Do the actual conversion & Set the length of the buffer
-            internalBuffer.SetLength(
-                   conv.WC2MB(internalBuffer, pwz, dwConvLen + 1, nLen)
-                                    );
-        }
+        //Copy 
+        if (nRealSize)
+            assign( theBuffer.data() , nRealSize - 1 );
     }
 }
 
@@ -1128,25 +1098,8 @@ wxString::wxString(const wchar_t *pwz, wxMBConv& conv, size_t nLength)
 //mode is not enabled and wxUSE_WCHAR_T is enabled
 const wxWCharBuffer wxString::wc_str(wxMBConv& conv) const
 {
-    //Get length of converted string
-    size_t dwConvLen = conv.MB2WC(NULL, (*this).c_str(), 0, length());
-
-    //if valid, do the conversion
-    if (dwConvLen != (size_t) -1)
-    {
-        //Create good buffer
-        wxWCharBuffer buffer(dwConvLen + 1);
-
-        //Do the actual conversion
-        conv.MB2WC(buffer.data(), (*this).c_str(), dwConvLen + 1, length());
-
-        return buffer;
-    }
-
-    //create bogus buffer
-    wxWCharBuffer buffer(1);
-    buffer.data()[0u] = 0;
-    return buffer;
+    size_t dwOutSize;
+    return conv.cMB2WC(c_str(), length(), &dwOutSize);
 }
 
 #endif // wxUSE_WCHAR_T
@@ -1322,7 +1275,7 @@ static inline int wxDoCmpNoCase(const wxChar* s1, size_t l1,
             if(wxTolower(s1[i]) != wxTolower(s2[i]))
                 break;
         }
-        return i == l1 ? 0 : s1[i] < s2[i] ? -1 : 1;
+        return i == l1 ? 0 : wxTolower(s1[i]) < wxTolower(s2[i]) ? -1 : 1;
     }
     else if( l1 < l2 )
     {
@@ -1331,7 +1284,7 @@ static inline int wxDoCmpNoCase(const wxChar* s1, size_t l1,
             if(wxTolower(s1[i]) != wxTolower(s2[i]))
                 break;
         }
-        return i == l1 ? -1 : s1[i] < s2[i] ? -1 : 1;
+        return i == l1 ? -1 : wxTolower(s1[i]) < wxTolower(s2[i]) ? -1 : 1;
     }
     else if( l1 > l2 )
     {
@@ -1340,7 +1293,7 @@ static inline int wxDoCmpNoCase(const wxChar* s1, size_t l1,
             if(wxTolower(s1[i]) != wxTolower(s2[i]))
                 break;
         }
-        return i == l2 ? 1 : s1[i] < s2[i] ? -1 : 1;
+        return i == l2 ? 1 : wxTolower(s1[i]) < wxTolower(s2[i]) ? -1 : 1;
     }
 
     wxFAIL;   // must never get there
@@ -1407,12 +1360,13 @@ const wxCharBuffer wxString::ToAscii() const
     // this will allocate enough space for the terminating NUL too
     wxCharBuffer buffer(length());
 
-    signed char *dest = (signed char *)buffer.data();
+
+    char *dest = buffer.data();
 
     const wchar_t *pwc = c_str();
     for ( ;; )
     {
-        *dest++ = *pwc > SCHAR_MAX ? wxT('_') : *pwc;
+        *dest++ = (char)(*pwc > SCHAR_MAX ? wxT('_') : *pwc);
 
         // the output string can't have embedded NULs anyhow, so we can safely
         // stop at first of them even if we do have any