wxChar dummy;
} g_strEmpty = { {-1, 0, 0}, wxT('\0') };
+#if defined(__VISAGECPP__) && __IBMCPP__ >= 400
+// must define this static for VA or else you get multiply defined symbols everywhere
+const unsigned int wxSTRING_MAXLEN = UINT_MAX - 100;
+
+#endif
+
// empty C style string: points to 'string data' byte of g_strEmpty
extern const wxChar WXDLLEXPORT *wxEmptyString = &g_strEmpty.dummy;
// function wxVsnprintfA (A for ANSI), should also find one for Unicode
// strings in Unicode build
#ifdef __WXMSW__
- #if (defined(__VISUALC__) || defined(wxUSE_NORLANDER_HEADERS)) && !defined(__MINGW32__)
+ #if defined(__VISUALC__) || wxUSE_NORLANDER_HEADERS
#define wxVsnprintfA _vsnprintf
#endif
#else // !Windows
{
Init();
- wxASSERT( nPos <= wxStrlen(psz) );
-
if ( nLength == wxSTRING_MAXLEN )
nLength = wxStrlen(psz + nPos);
+ wxASSERT_MSG( nPos + nLength <= wxStrlen(psz), _T("index out of bounds") );
+
STATISTICS_ADD(InitialLength, nLength);
if ( nLength > 0 ) {
// 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);
GetStringData()->Validate(TRUE);
}
+void wxString::UngetWriteBuf(size_t nLen)
+{
+ GetStringData()->nDataLength = nLen;
+ GetStringData()->Validate(TRUE);
+}
+
// ---------------------------------------------------------------------------
// data access
// ---------------------------------------------------------------------------
bool wxString::IsNumber() const
{
const wxChar *s = (const wxChar*) *this;
+ if (wxStrlen(s))
+ if ((s[0] == '-') || (s[0] == '+')) s++;
while(*s){
if(!wxIsdigit(*s)) return(FALSE);
s++;
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
// ---------------------------------------------------------------------------
/* 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 */
#if !defined(__VISUALC__) || defined(__WIN32__)
size_t wxString::find(const wxChar* sz, size_t nStart, size_t n) const
{
- return find(wxString(sz, n == npos ? 0 : n), nStart);
+ return find(wxString(sz, n), nStart);
}
#endif // VC++ 1.5
const wxChar *start = c_str() + nStart;
const wxChar *firstOf = wxStrpbrk(start, sz);
if ( firstOf )
- return firstOf - start;
+ return firstOf - c_str();
else
return npos;
}
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