]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/string.cpp
somehow commit did not work
[wxWidgets.git] / src / common / string.cpp
index a98d966d91985c7c616b13d764860b45a7f6eea6..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
 /////////////////////////////////////////////////////////////////////////////
 
@@ -984,108 +985,6 @@ int STRINGCLASS::compare(size_t nStart, size_t nLen,
 // wxString class core
 // ===========================================================================
 
-// ---------------------------------------------------------------------------
-// common conversion routines
-// ---------------------------------------------------------------------------
-
-#if wxUSE_WCHAR_T
-
-//Convert a wide character string of a specified length
-//to a multi-byte character string, ignoring intermittent null characters
-//returns the actual length of the string
-inline size_t wxMbstr(char* szBuffer, const wchar_t* szString,
-                      size_t nStringLen, wxMBConv& conv)
-{
-    const wchar_t* szEnd = szString + nStringLen + 1;
-    const wchar_t* szPos = szString;
-    const wchar_t* szStart = szPos;
-
-    size_t nActualLength = 0;
-
-    //Convert the string until the length() is reached, continuing the
-    //loop every time a null character is reached
-    while(szPos != szEnd)
-    {
-        wxASSERT(szPos < szEnd); //something is _really_ screwed up if this rings true
-
-        //Get the length of the current (sub)string
-        size_t nLen = conv.WC2MB(NULL, szPos, 0);
-
-//        wxASSERT(nLen != (size_t)-1); //should not be true!  If it is system wctomb could be bad
-
-        nActualLength += nLen + 1;
-
-        wxASSERT(nActualLength <= (nStringLen<<1) + 1); //If this is true it means buffer overflow
-
-        //Convert the current (sub)string
-        if ( nLen == (size_t)-1 ||
-             conv.WC2MB(&szBuffer[szPos - szStart], szPos, nLen + 1) == (size_t)-1 )
-        {
-            //error - return empty buffer
-            wxFAIL_MSG(wxT("Error converting wide-character string to a multi-byte string"));
-            szBuffer[0] = '\0';
-            return 0;
-        }
-
-        //Increment to next (sub)string
-        //Note that we have to use wxWcslen here instead of nLen
-        //here because XX2XX gives us the size of the output buffer,
-        //not neccessarly the length of the string
-        szPos += wxWcslen(szPos) + 1;
-    }
-
-    return nActualLength - 1;  //success - return actual length
-}
-
-//Convert a multi-byte character string of a specified length
-//to a wide character string, ignoring intermittent null characters
-//returns the actual length
-inline size_t wxWcstr( wchar_t* szBuffer, const char* szString,
-                       size_t nStringLen, wxMBConv& conv)
-{
-    const char* szEnd = szString + nStringLen + 1;
-    const char* szPos = szString;
-    const char* szStart = szPos;
-
-    size_t nActualLength = 0;
-
-    //Convert the string until the length() is reached, continuing the
-    //loop every time a null character is reached
-    while(szPos != szEnd)
-    {
-        wxASSERT(szPos < szEnd); //something is _really_ screwed up if this rings true
-
-        //Get the length of the current (sub)string
-        size_t nLen = conv.MB2WC(NULL, szPos, 0);
-
-//        wxASSERT(nLen != (size_t)-1); //If true, conversion was invalid, or system mbtowc could be bad
-
-        nActualLength += nLen + 1;
-
-        wxASSERT(nActualLength <= nStringLen + 1); //If this is true it means buffer overflow
-
-        //Convert the current (sub)string
-        if ( nLen == (size_t)-1 ||
-             conv.MB2WC(&szBuffer[szPos - szStart], szPos, nLen + 1) == (size_t)-1 )
-        {
-            //error - return empty buffer
-            wxFAIL_MSG(wxT("Error converting multi-byte string to a wide-character string"));
-            szBuffer[0] = '\0';
-            return 0;
-        }
-
-        //Increment to next (sub)string
-        //Note that we have to use strlen here instead of nLen
-        //here because XX2XX gives us the size of the output buffer,
-        //not neccessarly the length of the string
-        szPos += strlen(szPos) + 1;
-    }
-
-    return nActualLength - 1; //success - return actual length
-}
-
-#endif  //wxUSE_WCHAR_T
-
 // ---------------------------------------------------------------------------
 // construction and conversion
 // ---------------------------------------------------------------------------
@@ -1125,44 +1024,25 @@ wxString::wxString(const char *psz, wxMBConv& conv, size_t nLength)
         nLen = 0;
     }
 
+
     // anything to do?
     if ( (nLen != 0) && (nLen != (size_t)-1) )
     {
-        //When converting mb->wc it never inflates to more characters than the length
-        wxStringBufferLength internalBuffer(*this, nLen + 1);
+        //Convert string
+        size_t nRealSize;
+        wxWCharBuffer theBuffer = conv.cMB2WC(psz, nLen, &nRealSize);
 
-        //Do the actual conversion & Set the length of the buffer
-        internalBuffer.SetLength(
-               wxWcstr(internalBuffer, psz, nLen, conv)
-                                );
-/*
-wxWCharBuffer buffer(nLen + 1);
-    
-         //Convert the string           
-         size_t nActualLength = wxWcstr(buffer.data(), psz, nLen, conv);          
-         if ( !Alloc(nActualLength + 1) )                                  
-         {   
-             wxFAIL_MSG(wxT("Out of memory in wxString"));   
-         }   
-         else   
-         {   
-             //Copy the data   
-             assign(buffer.data(), nActualLength);   
-         } 
-*/                                
+        //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
 {
-    //*4 is the worst case - for UTF8
-    wxCharBuffer buffer((length() << 2) + 1);
-
-    //Do the actual conversion (will return a blank string on error)
-    wxMbstr(buffer.data(), (*this).c_str(), length(), conv);
-
-    return buffer;
+    size_t dwOutSize;
+    return conv.cWC2MB(c_str(), length(), &dwOutSize);
 }
 
 #else // ANSI
@@ -1204,13 +1084,13 @@ wxString::wxString(const wchar_t *pwz, wxMBConv& conv, size_t nLength)
     // anything to do?
     if ( (nLen != 0) && (nLen != (size_t)-1) )
     {
-        //*4 is the worst case - for UTF8
-        wxStringBufferLength internalBuffer(*this, (nLen << 2) + 1);
+        //Convert string
+        size_t nRealSize;
+        wxCharBuffer theBuffer = conv.cWC2MB(pwz, nLen, &nRealSize);
 
-        //Do the actual conversion & Set the length of the buffer
-        internalBuffer.SetLength(
-               wxMbstr(internalBuffer, pwz, nLen, conv)
-                                );
+        //Copy 
+        if (nRealSize)
+            assign( theBuffer.data() , nRealSize - 1 );
     }
 }
 
@@ -1218,13 +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
 {
-    //mb->wc never inflates to more than the length
-    wxWCharBuffer buffer(length() + 1);
-
-    //Do the actual conversion (will return a blank string on error)
-    wxWcstr(buffer.data(), (*this).c_str(), length(), conv);
-
-    return buffer;
+    size_t dwOutSize;
+    return conv.cMB2WC(c_str(), length(), &dwOutSize);
 }
 
 #endif // wxUSE_WCHAR_T
@@ -1400,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 )
     {
@@ -1409,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 )
     {
@@ -1418,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
@@ -1485,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