]> git.saurik.com Git - wxWidgets.git/commitdiff
Add wxString::WorstEncodingCase, other various cleanups
authorRyan Norton <wxprojects@comcast.net>
Fri, 29 Oct 2004 21:06:28 +0000 (21:06 +0000)
committerRyan Norton <wxprojects@comcast.net>
Fri, 29 Oct 2004 21:06:28 +0000 (21:06 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30173 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/string.h
src/common/strconv.cpp
src/common/string.cpp

index 309b27820ad368b219ae366e69d16aa2e20ba3b4..0562d9a91570d0f5b26f514b66c31b56f53c9472 100644 (file)
@@ -1077,6 +1077,9 @@ public:
     // the same as above, but takes a va_list
   static wxString FormatV(const wxChar *pszFormat, va_list argptr);
 
+    // returns the highest possible memory allocation for encoding
+  static size_t WorstEncodingCase(size_t len, wxMBConv& conv);
+
   // raw access to string memory
     // ensure that string has space for at least nLen characters
     // only works if the data of this string is not shared
index 415e05ab752810d3684f8539a1cec16f53aed324..327de35dd98091c6e2a807bf7a4c50e595f07e23 100644 (file)
@@ -1902,7 +1902,7 @@ public:
         if (szOut == NULL)
         {
             // worst case
-            nRealOutSize = ((nBufSize - 1) << 2)+1 ;
+            nRealOutSize = wxString::WorstEncodingCase(nBufSize - 1, *this)+1 ;
             szBuffer = new char[ nRealOutSize ] ;
         }
         else
@@ -2079,7 +2079,7 @@ public:
         if (buf == NULL)
         {
             // worst case
-            n = byteInLen << 1 ;
+            n = wxString::WorstEncodingCase(byteInLen / SIZEOF_WCHAR_T, *this) + SIZEOF_WCHAR_T;
             tbuf = (char*) malloc( n ) ;
         }
 
index 2b039bfc0460a335f27f33bb901ffc1470805755..51acab0189dd02f71fda5d38eae637df5f7deeb0 100644 (file)
@@ -988,6 +988,12 @@ int STRINGCLASS::compare(size_t nStart, size_t nLen,
 // common conversion routines
 // ---------------------------------------------------------------------------
 
+size_t wxString::WorstEncodingCase(size_t len, wxMBConv& WXUNUSED(conv))
+{
+    //Worst case for UTF7
+    return len * 5;
+}
+
 #if wxUSE_WCHAR_T
 
 //Convert a wide character string of a specified length
@@ -1018,11 +1024,11 @@ inline size_t wxMbstr(char* szBuffer, const wchar_t* szString,
             return 0;
         }
 
-//        wxASSERT(nLen != (size_t)-1); //should not be true!  If it is system wctomb could be bad
-
+        //Increase the actual length (+1 for current null character)
         nActualLength += nLen + 1;
 
-        wxASSERT( nActualLength <= (nStringLen<<2) + 1 ); //If this is true it means buffer overflow
+        //If this is true it means buffer overflow
+        wxASSERT( nActualLength <= wxString::WorstEncodingCase(nStringLen, conv) + 1 ); 
 
         //Convert the current (sub)string
         if(conv.WC2MB(&szBuffer[szPos - szStart], szPos, nLen + 1) == (size_t)-1 )
@@ -1071,11 +1077,11 @@ inline size_t wxWcstr( wchar_t* szBuffer, const char* szString,
             return 0;
         }
 
-//        wxASSERT(nLen != (size_t)-1); //If true, conversion was invalid, or system mbtowc could be bad
-
+        //Increase the actual length (+1 for current null character)
         nActualLength += nLen + 1;
 
-        wxASSERT(nActualLength <= nStringLen + 1); //If this is true it means buffer overflow
+        //If this is true it means buffer overflow
+        wxASSERT(nActualLength <= nStringLen + 1); 
 
         //Convert the current (sub)string
         if ( conv.MB2WC(&szBuffer[szPos - szStart], szPos, nLen + 1) == (size_t)-1 )
@@ -1147,31 +1153,14 @@ wxString::wxString(const char *psz, wxMBConv& conv, size_t nLength)
         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);   
-         } 
-*/                                
     }
 }
 
 //Convert wxString in Unicode mode to a multi-byte string
 const wxCharBuffer wxString::mb_str(wxMBConv& conv) const
 {
-    //FIXME:  This may be invalid for UTF7 and other charsets
-
-    //*4 is the worst case - for UTF8
-    wxCharBuffer buffer((length() << 2) + 1);
+    //Create the buffer
+    wxCharBuffer buffer( wxString::WorstEncodingCase(length(), conv) + 1);
 
     //Do the actual conversion (will return a blank string on error)
     wxMbstr(buffer.data(), (*this).c_str(), length(), conv);
@@ -1218,10 +1207,9 @@ wxString::wxString(const wchar_t *pwz, wxMBConv& conv, size_t nLength)
     // anything to do?
     if ( (nLen != 0) && (nLen != (size_t)-1) )
     {
-        //FIXME:  This may be invalid for UTF7 and other charsets
-
-        //*4 is the worst case - for UTF8
-        wxStringBufferLength internalBuffer(*this, (nLen << 2) + 1);
+        //Create a wxStringBufferLength which will access the internal
+        //C char pointer in non-stl mode
+        wxStringBufferLength internalBuffer(*this, wxString::WorstEncodingCase(nLen, conv) + 1);
 
         //Do the actual conversion & Set the length of the buffer
         internalBuffer.SetLength(