X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/35b4f9cae145d429ad28f399e8ea9b7c82ec8ed1..65546961ea3aa545db6f77fc73b3aa6623ab8b0d:/src/common/string.cpp diff --git a/src/common/string.cpp b/src/common/string.cpp index 43ee90df20..1c8fadcb69 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -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 +// (c) 2004 Ryan Norton // 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 ) { @@ -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