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:
@@ -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
|
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
|
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
|
if the string does not represent such number (the value of \arg{val} is not
|
||||||
be used in this case).
|
modified in this case).
|
||||||
|
|
||||||
\wxheading{See also}
|
\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
|
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
|
\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
|
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
|
valid number in the given base (the value of \arg{val} is not modified
|
||||||
be used in this case).
|
in this case).
|
||||||
|
|
||||||
The value of {\it base} must be comprised between $2$ and $36$, inclusive, or
|
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
|
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}.
|
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
|
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
|
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
|
represent a valid number in the given base (the value of \arg{val} is not
|
||||||
be used in this case). Please notice that this function
|
modified in this case). Please notice that this function
|
||||||
behaves in the same way as the standard \texttt{strtoul()} and so it simply
|
behaves in the same way as the standard \texttt{strtoul()} and so it simply
|
||||||
converts negative numbers to unsigned representation instead of rejecting them
|
converts negative numbers to unsigned representation instead of rejecting them
|
||||||
(e.g. $-1$ is returned as \texttt{ULONG\_MAX}).
|
(e.g. $-1$ is returned as \texttt{ULONG\_MAX}).
|
||||||
|
@@ -1348,7 +1348,7 @@ wxString& wxString::MakeLower()
|
|||||||
|
|
||||||
// some compilers (VC++ 6.0 not to name them) return true for a call to
|
// some compilers (VC++ 6.0 not to name them) return true for a call to
|
||||||
// isspace('\xEA') in the C locale which seems to be broken to me, but we have
|
// isspace('\xEA') in the C locale which seems to be broken to me, but we have
|
||||||
// to live with this by checking that the character is a 7 bit one - even if
|
// to live with this by checking that the character is a 7 bit one - even if
|
||||||
// this may fail to detect some spaces (I don't know if Unicode doesn't have
|
// this may fail to detect some spaces (I don't know if Unicode doesn't have
|
||||||
// space-like symbols somewhere except in the first 128 chars), it is arguably
|
// space-like symbols somewhere except in the first 128 chars), it is arguably
|
||||||
// still better than trimming away accented letters
|
// still better than trimming away accented letters
|
||||||
@@ -1444,61 +1444,62 @@ int wxString::Find(wxUniChar ch, bool bFromEnd) const
|
|||||||
#define DO_IF_NOT_WINCE(x)
|
#define DO_IF_NOT_WINCE(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define WX_STRING_TO_INT_TYPE(val, base, func) \
|
#define WX_STRING_TO_INT_TYPE(out, base, func, T) \
|
||||||
wxCHECK_MSG( val, false, _T("NULL output pointer") ); \
|
wxCHECK_MSG( out, false, _T("NULL output pointer") ); \
|
||||||
wxASSERT_MSG( !base || (base > 1 && base <= 36), _T("invalid base") ); \
|
wxASSERT_MSG( !base || (base > 1 && base <= 36), _T("invalid base") ); \
|
||||||
\
|
\
|
||||||
DO_IF_NOT_WINCE( errno = 0; ) \
|
DO_IF_NOT_WINCE( errno = 0; ) \
|
||||||
\
|
\
|
||||||
const wxStringCharType *start = wx_str(); \
|
const wxStringCharType *start = wx_str(); \
|
||||||
wxStringCharType *end; \
|
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 */ \
|
/* 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 */ \
|
/* if the string was not empty to start with and no under/overflow */ \
|
||||||
/* occurred: */ \
|
/* occurred: */ \
|
||||||
return !*end && (end != start) \
|
if ( *end || end == start DO_IF_NOT_WINCE(|| errno == ERANGE) ) \
|
||||||
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__
|
DO_IF_NOT_WINCE( errno = 0; )
|
||||||
errno = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const wxChar *start = c_str();
|
const wxChar *start = c_str();
|
||||||
wxChar *end;
|
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
|
// 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
|
// string was not empty to start with and no under/overflow occurred
|
||||||
return !*end && (end != start)
|
if ( *end || end == start DO_IF_NOT_WINCE(|| errno == ERANGE) )
|
||||||
#ifndef __WXWINCE__
|
return false;
|
||||||
&& (errno != ERANGE)
|
|
||||||
#endif
|
*pVal = val;
|
||||||
;
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
@@ -1620,7 +1621,7 @@ int wxString::DoPrintfUtf8(const char *format, ...)
|
|||||||
an undersized buffer and no other errno are defined we treat those two
|
an undersized buffer and no other errno are defined we treat those two
|
||||||
as meaning hard errors and everything else gets the old behavior which
|
as meaning hard errors and everything else gets the old behavior which
|
||||||
is to keep looping and increasing buffer size until the function succeeds.
|
is to keep looping and increasing buffer size until the function succeeds.
|
||||||
|
|
||||||
In practice it's impossible to determine before compilation which behavior
|
In practice it's impossible to determine before compilation which behavior
|
||||||
may be used. The vswprintf function may have vsnprintf-like behavior or
|
may be used. The vswprintf function may have vsnprintf-like behavior or
|
||||||
vice-versa. Behavior detected on one release can theoretically change
|
vice-versa. Behavior detected on one release can theoretically change
|
||||||
@@ -1730,7 +1731,7 @@ static int DoStringPrintfV(wxString& str,
|
|||||||
else if ( len >= size )
|
else if ( len >= size )
|
||||||
{
|
{
|
||||||
#if wxUSE_WXVSNPRINTF
|
#if wxUSE_WXVSNPRINTF
|
||||||
// we know that our own implementation of wxVsnprintf() returns
|
// we know that our own implementation of wxVsnprintf() returns
|
||||||
// size+1 when there's not enough space but that's not the size
|
// size+1 when there's not enough space but that's not the size
|
||||||
// of the required buffer!
|
// of the required buffer!
|
||||||
size *= 2; // so we just double the current size of the buffer
|
size *= 2; // so we just double the current size of the buffer
|
||||||
|
Reference in New Issue
Block a user