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,6 +319,15 @@ extern WXDLLIMPEXP_DATA_BASE(wxXLocale) wxNullXLocale;
|
|||||||
int WXDLLIMPEXP_BASE wxIsxdigit_l(const wxUniChar& c, const wxXLocale& loc);
|
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 wxTolower_l(const wxUniChar& c, const wxXLocale& loc);
|
||||||
int WXDLLIMPEXP_BASE wxToupper_l(const wxUniChar& c, const wxXLocale& loc);
|
int WXDLLIMPEXP_BASE wxToupper_l(const wxUniChar& c, const wxXLocale& loc);
|
||||||
|
|
||||||
|
// 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 // wxHAS_XLOCALE_SUPPORT/!wxHAS_XLOCALE_SUPPORT
|
||||||
|
|
||||||
#endif // wxUSE_XLOCALE
|
#endif // wxUSE_XLOCALE
|
||||||
|
@@ -31,6 +31,8 @@
|
|||||||
|
|
||||||
#include "wx/xlocale.h"
|
#include "wx/xlocale.h"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// module globals
|
// module globals
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -260,6 +262,85 @@ int wxToupper_l(const wxUniChar& c, const wxXLocale& loc)
|
|||||||
return c;
|
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 // !defined(wxHAS_XLOCALE_SUPPORT)
|
||||||
|
|
||||||
#endif // wxUSE_XLOCALE
|
#endif // wxUSE_XLOCALE
|
||||||
|
Reference in New Issue
Block a user