don't modify the output variable if ToXXX() fails to convert (modified patch 1849041)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50710 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2007-12-15 02:45:24 +00:00
parent 0c13edfa01
commit c95e653ca4
2 changed files with 34 additions and 33 deletions

View File

@@ -1205,8 +1205,8 @@ powerful means of converting wxString to C string.
Attempts to convert the string to a floating point number. Returns \true on
success (the number is stored in the location pointed to by \arg{val}) or \false
if the string does not represent such number (the value of \arg{val} shouldn't
be used in this case).
if the string does not represent such number (the value of \arg{val} is not
modified in this case).
\wxheading{See also}
@@ -1221,8 +1221,8 @@ be used in this case).
Attempts to convert the string to a signed integer in base {\it base}. Returns
\true on success in which case the number is stored in the location
pointed to by \arg{val} or \false if the string does not represent a
valid number in the given base (the value of \arg{val} shouldn't
be used in this case).
valid number in the given base (the value of \arg{val} is not modified
in this case).
The value of {\it base} must be comprised between $2$ and $36$, inclusive, or
be a special value $0$ which means that the usual rules of {\tt C} numbers are
@@ -1262,8 +1262,8 @@ with C99 support and Microsoft Visual C++ version 7 and higher do support this.
Attempts to convert the string to an unsigned integer in base {\it base}.
Returns \true on success in which case the number is stored in the
location pointed to by \arg{val} or \false if the string does not
represent a valid number in the given base (the value of \arg{val} shouldn't
be used in this case). Please notice that this function
represent a valid number in the given base (the value of \arg{val} is not
modified in this case). Please notice that this function
behaves in the same way as the standard \texttt{strtoul()} and so it simply
converts negative numbers to unsigned representation instead of rejecting them
(e.g. $-1$ is returned as \texttt{ULONG\_MAX}).

View File

@@ -1444,61 +1444,62 @@ int wxString::Find(wxUniChar ch, bool bFromEnd) const
#define DO_IF_NOT_WINCE(x)
#endif
#define WX_STRING_TO_INT_TYPE(val, base, func) \
wxCHECK_MSG( val, false, _T("NULL output pointer") ); \
#define WX_STRING_TO_INT_TYPE(out, base, func, T) \
wxCHECK_MSG( out, false, _T("NULL output pointer") ); \
wxASSERT_MSG( !base || (base > 1 && base <= 36), _T("invalid base") ); \
\
DO_IF_NOT_WINCE( errno = 0; ) \
\
const wxStringCharType *start = wx_str(); \
wxStringCharType *end; \
*val = func(start, &end, base); \
T 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) \
DO_IF_NOT_WINCE( && (errno != ERANGE) )
if ( *end || end == start DO_IF_NOT_WINCE(|| errno == ERANGE) ) \
return false; \
*out = val; \
return true
bool wxString::ToLong(long *val, int base) const
bool wxString::ToLong(long *pVal, int base) const
{
WX_STRING_TO_INT_TYPE(val, base, wxStrtol);
WX_STRING_TO_INT_TYPE(pVal, base, wxStrtol, long);
}
bool wxString::ToULong(unsigned long *val, int base) const
bool wxString::ToULong(unsigned long *pVal, int base) const
{
WX_STRING_TO_INT_TYPE(val, base, wxStrtoul);
WX_STRING_TO_INT_TYPE(pVal, base, wxStrtoul, unsigned long);
}
bool wxString::ToLongLong(wxLongLong_t *val, int base) const
bool wxString::ToLongLong(wxLongLong_t *pVal, int base) const
{
WX_STRING_TO_INT_TYPE(val, base, wxStrtoll);
WX_STRING_TO_INT_TYPE(pVal, base, wxStrtoll, wxLongLong_t);
}
bool wxString::ToULongLong(wxULongLong_t *val, int base) const
bool wxString::ToULongLong(wxULongLong_t *pVal, int base) const
{
WX_STRING_TO_INT_TYPE(val, base, wxStrtoull);
WX_STRING_TO_INT_TYPE(pVal, base, wxStrtoull, wxULongLong_t);
}
bool wxString::ToDouble(double *val) const
bool wxString::ToDouble(double *pVal) const
{
wxCHECK_MSG( val, false, _T("NULL pointer in wxString::ToDouble") );
wxCHECK_MSG( pVal, false, _T("NULL output pointer") );
#ifndef __WXWINCE__
errno = 0;
#endif
DO_IF_NOT_WINCE( errno = 0; )
const wxChar *start = c_str();
wxChar *end;
*val = wxStrtod(start, &end);
double val = wxStrtod(start, &end);
// 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)
#ifndef __WXWINCE__
&& (errno != ERANGE)
#endif
;
if ( *end || end == start DO_IF_NOT_WINCE(|| errno == ERANGE) )
return false;
*pVal = val;
return true;
}
// ---------------------------------------------------------------------------