implement wxStrtoX_l() variants even when wxHAS_XLOCALE_SUPPORT is not defined
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59637 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -319,8 +319,17 @@ extern WXDLLIMPEXP_DATA_BASE(wxXLocale) wxNullXLocale;
|
||||
int WXDLLIMPEXP_BASE wxIsxdigit_l(const wxUniChar& c, const wxXLocale& loc);
|
||||
int WXDLLIMPEXP_BASE wxTolower_l(const wxUniChar& c, const wxXLocale& loc);
|
||||
int WXDLLIMPEXP_BASE wxToupper_l(const wxUniChar& c, const wxXLocale& loc);
|
||||
#endif // wxHAS_XLOCALE_SUPPORT/!wxHAS_XLOCALE_SUPPORT
|
||||
|
||||
// stdlib functions
|
||||
double WXDLLIMPEXP_BASE wxStrtod_l(const wchar_t* str, wchar_t **endptr, const wxXLocale& loc);
|
||||
double WXDLLIMPEXP_BASE wxStrtod_l(const char* str, char **endptr, const wxXLocale& loc);
|
||||
long WXDLLIMPEXP_BASE wxStrtol_l(const wchar_t* str, wchar_t **endptr, int base, const wxXLocale& loc);
|
||||
long WXDLLIMPEXP_BASE wxStrtol_l(const char* str, char **endptr, int base, const wxXLocale& loc);
|
||||
unsigned long WXDLLIMPEXP_BASE wxStrtoul_l(const wchar_t* str, wchar_t **endptr, int base, const wxXLocale& loc);
|
||||
unsigned long WXDLLIMPEXP_BASE wxStrtoul_l(const char* str, char **endptr, int base, const wxXLocale& loc);
|
||||
|
||||
#endif // wxHAS_XLOCALE_SUPPORT/!wxHAS_XLOCALE_SUPPORT
|
||||
|
||||
#endif // wxUSE_XLOCALE
|
||||
|
||||
#endif // _WX_XLOCALE_H_
|
||||
|
@@ -31,6 +31,8 @@
|
||||
|
||||
#include "wx/xlocale.h"
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// module globals
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -260,6 +262,85 @@ int wxToupper_l(const wxUniChar& c, const wxXLocale& loc)
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// string --> number conversion functions
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
/*
|
||||
WARNING: the implementation of the wxStrtoX_l() functions below is unsafe
|
||||
in a multi-threaded environment as we temporary change the locale
|
||||
and if in the meanwhile an other thread performs some locale-dependent
|
||||
operation, it may get unexpected results...
|
||||
However this is the best we can do without reinventing the wheel in the
|
||||
case !wxHAS_XLOCALE_SUPPORT...
|
||||
*/
|
||||
|
||||
#define IMPLEMENT_STRTOX_L_START \
|
||||
wxCHECK(loc.IsOk(), 0); \
|
||||
\
|
||||
/* (Try to) temporary set the locale to 'C' */ \
|
||||
const char *oldLocale = wxSetlocale(LC_NUMERIC, ""); \
|
||||
const char *tmp = wxSetlocale(LC_NUMERIC, "C"); \
|
||||
if ( !tmp ) \
|
||||
{ \
|
||||
/* restore the original locale */ \
|
||||
wxSetlocale(LC_NUMERIC, oldLocale); \
|
||||
errno = EINVAL; \
|
||||
/* signal an error (better than nothing) */ \
|
||||
return 0; \
|
||||
} \
|
||||
\
|
||||
|
||||
|
||||
#define IMPLEMENT_STRTOX_L_END \
|
||||
/* restore the original locale */ \
|
||||
wxSetlocale(LC_NUMERIC, oldLocale); \
|
||||
return ret;
|
||||
|
||||
double wxStrtod_l(const wchar_t* str, wchar_t **endptr, const wxXLocale& loc)
|
||||
{
|
||||
IMPLEMENT_STRTOX_L_START
|
||||
double ret = wxStrtod(str, endptr);
|
||||
IMPLEMENT_STRTOX_L_END
|
||||
}
|
||||
|
||||
double wxStrtod_l(const char* str, char **endptr, const wxXLocale& loc)
|
||||
{
|
||||
IMPLEMENT_STRTOX_L_START
|
||||
double ret = wxStrtod(str, endptr);
|
||||
IMPLEMENT_STRTOX_L_END
|
||||
}
|
||||
|
||||
long wxStrtol_l(const wchar_t* str, wchar_t **endptr, int base, const wxXLocale& loc)
|
||||
{
|
||||
IMPLEMENT_STRTOX_L_START
|
||||
long ret = wxStrtol(str, endptr, base);
|
||||
IMPLEMENT_STRTOX_L_END
|
||||
}
|
||||
|
||||
long wxStrtol_l(const char* str, char **endptr, int base, const wxXLocale& loc)
|
||||
{
|
||||
IMPLEMENT_STRTOX_L_START
|
||||
long ret = wxStrtol(str, endptr, base);
|
||||
IMPLEMENT_STRTOX_L_END
|
||||
}
|
||||
|
||||
unsigned long wxStrtoul_l(const wchar_t* str, wchar_t **endptr, int base, const wxXLocale& loc)
|
||||
{
|
||||
IMPLEMENT_STRTOX_L_START
|
||||
unsigned long ret = wxStrtoul(str, endptr, base);
|
||||
IMPLEMENT_STRTOX_L_END
|
||||
}
|
||||
|
||||
unsigned long wxStrtoul_l(const char* str, char **endptr, int base, const wxXLocale& loc)
|
||||
{
|
||||
IMPLEMENT_STRTOX_L_START
|
||||
unsigned long ret = wxStrtoul(str, endptr, base);
|
||||
IMPLEMENT_STRTOX_L_END
|
||||
}
|
||||
|
||||
|
||||
#endif // !defined(wxHAS_XLOCALE_SUPPORT)
|
||||
|
||||
#endif // wxUSE_XLOCALE
|
||||
|
Reference in New Issue
Block a user