X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/341e7d28891d72b0f7aee27ca41d5827d261c67b..50a1f2615497fd70659614559e62d0b70ac46a70:/src/common/string.cpp diff --git a/src/common/string.cpp b/src/common/string.cpp index 764d0a41c6..df8587fe66 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -64,6 +64,15 @@ // NB: EXTRA_ALLOC must be >= 0! #define EXTRA_ALLOC (19 - nLen % 16) +#if defined(__VISAGECPP__) && __IBMCPP__ >= 400 +// must define this in .cpp for VA or else you get multiply defined symbols everywhere + +// maximum possible length for a string means "take all string" everywhere +// (as sizeof(StringData) is unknown here, we substract 100) +const unsigned int wxSTRING_MAXLEN = UINT_MAX - 100; + +#endif + // --------------------------------------------------------------------------- // static class variables definition // --------------------------------------------------------------------------- @@ -360,8 +369,13 @@ wxString::wxString(const wchar_t *pwz) // allocates memory needed to store a C string of length nLen void wxString::AllocBuffer(size_t nLen) { - wxASSERT( nLen > 0 ); // - wxASSERT( nLen <= INT_MAX-1 ); // max size (enough room for 1 extra) + // allocating 0 sized buffer doesn't make sense, all empty strings should + // reuse g_strEmpty + wxASSERT( nLen > 0 ); + + // make sure that we don't overflow + wxASSERT( nLen < (INT_MAX / sizeof(wxChar)) - + (sizeof(wxStringData) + EXTRA_ALLOC + 1) ); STATISTICS_ADD(Length, nLen); @@ -1071,33 +1085,6 @@ bool wxString::ToDouble(double *val) const return !*end && (end != start); } -// --------------------------------------------------------------------------- -// stream-like operators -// --------------------------------------------------------------------------- -wxString& wxString::operator<<(int i) -{ - wxString res; - res.Printf(wxT("%d"), i); - - return (*this) << res; -} - -wxString& wxString::operator<<(float f) -{ - wxString res; - res.Printf(wxT("%f"), f); - - return (*this) << res; -} - -wxString& wxString::operator<<(double d) -{ - wxString res; - res.Printf(wxT("%g"), d); - - return (*this) << res; -} - // --------------------------------------------------------------------------- // formatted output // --------------------------------------------------------------------------- @@ -1105,14 +1092,15 @@ wxString& wxString::operator<<(double d) /* static */ wxString wxString::Format(const wxChar *pszFormat, ...) { - va_list argptr; - va_start(argptr, pszFormat); + va_list argptr; + va_start(argptr, pszFormat); - wxString s = FormatV(pszFormat, argptr); + wxString s; + s.PrintfV(pszFormat, argptr); - va_end(argptr); + va_end(argptr); - return s; + return s; } /* static */ @@ -1801,20 +1789,8 @@ void wxArrayString::Copy(const wxArrayString& src) if ( src.m_nCount > ARRAY_DEFAULT_INITIAL_SIZE ) Alloc(src.m_nCount); - // we can't just copy the pointers here because otherwise we would share - // the strings with another array because strings are ref counted -#if 0 - if ( m_nCount != 0 ) - memcpy(m_pItems, src.m_pItems, m_nCount*sizeof(wxChar *)); -#endif // 0 - for ( size_t n = 0; n < src.m_nCount; n++ ) Add(src[n]); - - // if the other array is auto sorted too, we're already sorted, but - // otherwise we should rearrange the items - if ( m_autoSort && !src.m_autoSort ) - Sort(); } // grow the array