X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/619dcb095efac5a79b6bd1e7c65d62d651ef48fc..ce7208d49d5ce2ca1dc0b3b83f14f1d04f29c4bf:/src/common/string.cpp?ds=inline diff --git a/src/common/string.cpp b/src/common/string.cpp index 62d81aab29..b0bc3a1864 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -1677,6 +1677,8 @@ int wxString::Find(const wxChar *pszSub) const // the implementation of all the functions below is exactly the same so factor // it out +#ifndef __WATCOMC__ + template bool wxStringToIntType(const wxChar *start, T *val, @@ -1686,6 +1688,8 @@ bool wxStringToIntType(const wxChar *start, wxCHECK_MSG( val, false, _T("NULL output pointer") ); wxASSERT_MSG( !base || (base > 1 && base <= 36), _T("invalid base") ); + errno = 0; + wxChar *end; *val = (*func)(start, &end, base); @@ -1694,20 +1698,66 @@ bool wxStringToIntType(const wxChar *start, return !*end && (end != start) && (errno != ERANGE); } +#define wxSTR2INT(val, b, func) return wxStringToIntType(c_str(), val, b, func) + +#else // __WATCOMC__ + +// FIXME, TODO, ASAP !!! - ugly trick to make release for Open Watcom possible +// without changing code flow for other compilers + +#define wxSTR2INT(val, base, func) \ + wxCHECK_MSG( val, false, _T("NULL output pointer") ); \ + wxASSERT_MSG( !base || (base > 1 && base <= 36), _T("invalid base") ); \ + \ + errno = 0; \ + \ + wxChar *end; \ + *val = (*func)(c_str(), &end, base); \ + \ + return !*end && (end != c_str()) && (errno != ERANGE) + +#endif // !__WATCOMC__/__WATCOMC__ + bool wxString::ToLong(long *val, int base) const { - return wxStringToIntType(c_str(), val, base, wxStrtol); + wxSTR2INT(val, base, wxStrtol); } bool wxString::ToULong(unsigned long *val, int base) const { - return wxStringToIntType(c_str(), val, base, wxStrtoul); + wxSTR2INT(val, base, wxStrtoul); +} + +bool wxString::ToLongLong(wxLongLong_t *val, int base) const +{ +#ifdef wxHAS_STRTOLL + wxSTR2INT(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 + wxSTR2INT(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") ); + errno = 0; + const wxChar *start = c_str(); wxChar *end; *val = wxStrtod(start, &end); @@ -1791,9 +1841,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 {