From 28e0798fcdffb5233097060f7d43ffa01df7271d Mon Sep 17 00:00:00 2001 From: Francesco Montorsi Date: Fri, 20 Mar 2009 01:27:56 +0000 Subject: [PATCH] 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 --- include/wx/xlocale.h | 11 +++++- src/common/xlocale.cpp | 81 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/include/wx/xlocale.h b/include/wx/xlocale.h index d2ca8d2008..bf8f8daf07 100644 --- a/include/wx/xlocale.h +++ b/include/wx/xlocale.h @@ -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_ diff --git a/src/common/xlocale.cpp b/src/common/xlocale.cpp index 05f7a5b7d3..f66b2ab71a 100644 --- a/src/common/xlocale.cpp +++ b/src/common/xlocale.cpp @@ -31,6 +31,8 @@ #include "wx/xlocale.h" +#include + // ---------------------------------------------------------------------------- // 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 -- 2.45.2