/////////////////////////////////////////////////////////////////////////////
// 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
/////////////////////////////////////////////////////////////////////////////
// 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
// 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 );
}
}
//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
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 )
{
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 )
{
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
// 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