X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e71e5b37269174d78ec72d490148a3dece174483..1cb311851d96ed4fb5290c65455075c6989f7142:/src/common/string.cpp?ds=sidebyside diff --git a/src/common/string.cpp b/src/common/string.cpp index f222417109..8a722a4f4c 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -35,7 +35,11 @@ #endif #include -#include + +#ifndef __WXWINCE__ + #include +#endif + #include #include @@ -1604,7 +1608,7 @@ wxString& wxString::Trim(bool bFromRight) reverse_iterator psz = rbegin(); while ( (psz != rend()) && wxSafeIsspace(*psz) ) psz++; - + // truncate at trailing space start erase(psz.base(), end()); } @@ -1677,23 +1681,36 @@ int wxString::Find(const wxChar *pszSub) const // the implementation of all the functions below is exactly the same so factor // it out + +#ifdef __WATCOMC__ + #define STR2INTLINK _WCRTLINK +#else + #define STR2INTLINK +#endif + template bool wxStringToIntType(const wxChar *start, T *val, int base, - T (*func)(const wxChar *, wxChar **, int)) + T STR2INTLINK (*func)(const wxChar *, wxChar **, int)) { wxCHECK_MSG( val, false, _T("NULL output pointer") ); wxASSERT_MSG( !base || (base > 1 && base <= 36), _T("invalid base") ); +#ifndef __WXWINCE__ errno = 0; +#endif wxChar *end; *val = (*func)(start, &end, base); // return true only if scan was stopped by the terminating NUL and if the // string was not empty to start with and no under/overflow occurred - return !*end && (end != start) && (errno != ERANGE); + return !*end && (end != start) +#ifndef __WXWINCE__ + && (errno != ERANGE) +#endif + ; } bool wxString::ToLong(long *val, int base) const @@ -1706,11 +1723,37 @@ bool wxString::ToULong(unsigned long *val, int base) const return wxStringToIntType(c_str(), val, base, wxStrtoul); } +bool wxString::ToLongLong(wxLongLong_t *val, int base) const +{ +#ifdef wxHAS_STRTOLL + return wxStringToIntType(c_str(), val, base, wxStrtoll); +#else + // TODO: implement this ourselves + wxUnusedVar(val); + wxUnusedVar(base); + return false; +#endif // wxHAS_STRTOLL +} + +bool wxString::ToULongLong(wxULongLong_t *val, int base) const +{ +#ifdef wxHAS_STRTOLL + return wxStringToIntType(c_str(), val, base, wxStrtoull); +#else + // TODO: implement this ourselves + wxUnusedVar(val); + wxUnusedVar(base); + return false; +#endif +} + bool wxString::ToDouble(double *val) const { wxCHECK_MSG( val, false, _T("NULL pointer in wxString::ToDouble") ); +#ifndef __WXWINCE__ errno = 0; +#endif const wxChar *start = c_str(); wxChar *end; @@ -1718,7 +1761,11 @@ bool wxString::ToDouble(double *val) const // return true only if scan was stopped by the terminating NUL and if the // string was not empty to start with and no under/overflow occurred - return !*end && (end != start) && (errno != ERANGE); + return !*end && (end != start) +#ifndef __WXWINCE__ + && (errno != ERANGE) +#endif + ; } // --------------------------------------------------------------------------- @@ -1795,9 +1842,11 @@ int wxString::PrintfV(const wxChar* pszFormat, va_list argptr) // current size of the buffer size *= 2; } - else if ( len > size ) + else if ( len >= size ) { - size = len; + // some vsnprintf() implementations NUL-terminate the buffer and + // some don't in len == size case, to be safe always add 1 + size = len + 1; } else // ok, there was enough space { @@ -2142,13 +2191,16 @@ void wxArrayString::Alloc(size_t nSize) { // only if old buffer was not big enough if ( nSize > m_nSize ) { - Free(); - wxDELETEA(m_pItems); - m_pItems = new wxChar *[nSize]; + wxChar **pNew = new wxChar *[nSize]; + if ( !pNew ) + return; + + memcpy(pNew, m_pItems, m_nCount*sizeof(wxChar *)); + delete [] m_pItems; + + m_pItems = pNew; m_nSize = nSize; } - - m_nCount = 0; } // minimizes the memory usage by freeing unused memory