#include <string.h>
#include <stdlib.h>
+#ifdef wxUSE_WCSRTOMBS
+ #include <wchar.h> // for wcsrtombs(), see comments where it's used
+#endif // GNU
+
#ifdef WXSTRING_IS_WXOBJECT
IMPLEMENT_DYNAMIC_CLASS(wxString, wxObject)
#endif //WXSTRING_IS_WXOBJECT
// iostream ones.
//
// ATTN: you can _not_ use both of these in the same program!
-#if 0 // def _MSC_VER
- #include <iostream>
- #define NAMESPACE std::
+#if wxUSE_IOSTREAMH
+#include <iostream.h>
+#define NAMESPACE
#else
- #include <iostream.h>
- #define NAMESPACE
-#endif //Visual C++
+#include <iostream>
+# ifdef _MSC_VER
+ using namespace std;
+# endif
+// for msvc (bcc50+ also) you don't need these NAMESPACE defines,
+// using namespace std; takes care of that.
+#define NAMESPACE std::
+#endif
+
NAMESPACE istream& operator>>(NAMESPACE istream& is, wxString& WXUNUSED(str))
{
{
public:
Averager(const char *sz) { m_sz = sz; m_nTotal = m_nCount = 0; }
- ~Averager()
+ ~Averager()
{ printf("wxString: average %s = %f\n", m_sz, ((float)m_nTotal)/m_nCount); }
void Add(size_t n) { m_nTotal += n; m_nCount++; }
wxString::wxString(const wchar_t *pwz)
{
// first get necessary size
+
+ // NB: GNU libc5 wcstombs() is completely broken, don't use it (it doesn't
+ // honor the 3rd parameter, thus it will happily crash here).
+#ifdef wxUSE_WCSRTOMBS
+ // don't know if it's really needed (or if we can pass NULL), but better safe
+ // than quick
+ mbstate_t mbstate;
+ size_t nLen = wcsrtombs((char *) NULL, &pwz, 0, &mbstate);
+#else // !GNU libc
size_t nLen = wcstombs((char *) NULL, pwz, 0);
+#endif // GNU
// empty?
if ( nLen != 0 ) {
// trims spaces (in the sense of isspace) from left or right side
wxString& wxString::Trim(bool bFromRight)
{
- CopyBeforeWrite();
-
- if ( bFromRight )
- {
- // find last non-space character
- char *psz = m_pchData + GetStringData()->nDataLength - 1;
- while ( isspace(*psz) && (psz >= m_pchData) )
- psz--;
-
- // truncate at trailing space start
- *++psz = '\0';
- GetStringData()->nDataLength = psz - m_pchData;
- }
- else
+ // first check if we're going to modify the string at all
+ if ( !IsEmpty() &&
+ (
+ (bFromRight && isspace(GetChar(Len() - 1))) ||
+ (!bFromRight && isspace(GetChar(0u)))
+ )
+ )
{
- // find first non-space character
- const char *psz = m_pchData;
- while ( isspace(*psz) )
- psz++;
-
- // fix up data and length
- int nDataLength = GetStringData()->nDataLength - (psz - m_pchData);
- memmove(m_pchData, psz, (nDataLength + 1)*sizeof(char));
- GetStringData()->nDataLength = nDataLength;
+ // ok, there is at least one space to trim
+ CopyBeforeWrite();
+
+ if ( bFromRight )
+ {
+ // find last non-space character
+ char *psz = m_pchData + GetStringData()->nDataLength - 1;
+ while ( isspace(*psz) && (psz >= m_pchData) )
+ psz--;
+
+ // truncate at trailing space start
+ *++psz = '\0';
+ GetStringData()->nDataLength = psz - m_pchData;
+ }
+ else
+ {
+ // find first non-space character
+ const char *psz = m_pchData;
+ while ( isspace(*psz) )
+ psz++;
+
+ // fix up data and length
+ int nDataLength = GetStringData()->nDataLength - (psz - m_pchData);
+ memmove(m_pchData, psz, (nDataLength + 1)*sizeof(char));
+ GetStringData()->nDataLength = nDataLength;
+ }
}
return *this;