X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bda041e5616266c47b3e51b773d98cd92c2c1f92..c153cc08ebf622a5ec73be37e4368cdb3c00c24d:/src/common/string.cpp diff --git a/src/common/string.cpp b/src/common/string.cpp index 418fc9f077..8f20b9ac13 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -1675,38 +1675,63 @@ int wxString::Find(const wxChar *pszSub) const // conversion to numbers // ---------------------------------------------------------------------------- -bool wxString::ToLong(long *val, int base) const -{ - wxCHECK_MSG( val, false, _T("NULL pointer in wxString::ToLong") ); +// the implementation of all the functions below is exactly the same so factor +// it out +template +bool wxStringToIntType(const wxChar *start, + T *val, + int base, + T (*func)(const wxChar *, wxChar **, int)) +{ + wxCHECK_MSG( val, false, _T("NULL output pointer") ); wxASSERT_MSG( !base || (base > 1 && base <= 36), _T("invalid base") ); - const wxChar *start = c_str(); + errno = 0; + wxChar *end; - *val = wxStrtol(start, &end, base); + *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); } +bool wxString::ToLong(long *val, int base) const +{ + return wxStringToIntType(c_str(), val, base, wxStrtol); +} + bool wxString::ToULong(unsigned long *val, int base) const { - wxCHECK_MSG( val, false, _T("NULL pointer in wxString::ToULong") ); - wxASSERT_MSG( !base || (base > 1 && base <= 36), _T("invalid base") ); + return wxStringToIntType(c_str(), val, base, wxStrtoul); +} - const wxChar *start = c_str(); - wxChar *end; - *val = wxStrtoul(start, &end, base); +bool wxString::ToLongLong(wxLongLong_t *val, int base) const +{ +#ifdef wxHAS_STRTOLL + return wxStringToIntType(c_str(), val, base, wxStrtoll); +#else + // TODO: implement this ourselves + return false; +#endif // wxHAS_STRTOLL +} - // return true only if scan was stopped by the terminating NUL and if the - // string was not empty to start with and no overflow occurred - return !*end && (end != start) && (errno != ERANGE); +bool wxString::ToULongLong(wxULongLong_t *val, int base) const +{ +#ifdef wxHAS_STRTOLL + return wxStringToIntType(c_str(), val, base, wxStrtoull); +#else + // TODO: implement this ourselves + return false; +#endif } bool wxString::ToDouble(double *val) const { wxCHECK_MSG( val, false, _T("NULL pointer in wxString::ToDouble") ); + errno = 0; + const wxChar *start = c_str(); wxChar *end; *val = wxStrtod(start, &end); @@ -1790,9 +1815,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 {