#include <clib.h>
#endif
-#if 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
{
wxStringData *pData = GetStringData();
- // this variable is unused in release build, so avoid the compiler warning
- // by just not declaring it
-#ifdef __WXDEBUG__
- void *p =
-#endif
- realloc(pData, sizeof(wxStringData) + (pData->nDataLength + 1)*sizeof(wxChar));
+ size_t nLen = pData->nDataLength;
+ void *p = realloc(pData, sizeof(wxStringData) + (nLen + 1)*sizeof(wxChar));
+
+ wxASSERT_MSG( p != NULL, _T("can't free memory?") );
- // we rely on a reasonable realloc() implementation here - so far I haven't
- // seen any which wouldn't behave like this
+ if ( p != pData )
+ {
+ // contrary to what one might believe, some realloc() implementation do
+ // move the memory block even when its size is reduced
+ pData = (wxStringData *)p;
+
+ m_pchData = pData->data();
+ }
- wxASSERT( p != NULL ); // can't free memory?
- wxASSERT( p == pData ); // we're decrementing the size - block shouldn't move!
+ pData->nAllocLength = nLen;
}
// get the pointer to writable buffer of (at least) nLen bytes
// conversion to numbers
// ----------------------------------------------------------------------------
-bool wxString::ToLong(long *val) const
+bool wxString::ToLong(long *val, int base) const
{
wxCHECK_MSG( val, FALSE, _T("NULL pointer in wxString::ToLong") );
const wxChar *start = c_str();
wxChar *end;
- *val = wxStrtol(start, &end, 10);
+ *val = wxStrtol(start, &end, base);
// return TRUE only if scan was stopped by the terminating NUL and if the
// string was not empty to start with
return !*end && (end != start);
}
-bool wxString::ToULong(unsigned long *val) const
+bool wxString::ToULong(unsigned long *val, int base) const
{
wxCHECK_MSG( val, FALSE, _T("NULL pointer in wxString::ToULong") );
const wxChar *start = c_str();
wxChar *end;
- *val = wxStrtoul(start, &end, 10);
+ *val = wxStrtoul(start, &end, base);
// return TRUE only if scan was stopped by the terminating NUL and if the
// string was not empty to start with