X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dad013ac0177be398b26236d5aa606a32d0a3356..f1d7af8f68fe64084878504ba8ebc6e5cfcfdd54:/src/common/xlocale.cpp diff --git a/src/common/xlocale.cpp b/src/common/xlocale.cpp index b2b035aed1..96c8a558ca 100644 --- a/src/common/xlocale.cpp +++ b/src/common/xlocale.cpp @@ -31,6 +31,8 @@ #include "wx/xlocale.h" +#include + // ---------------------------------------------------------------------------- // module globals // ---------------------------------------------------------------------------- @@ -134,21 +136,21 @@ void wxXLocale::Init(const char *loc) wxString buf(loc); wxString buf2; buf2 = buf + wxS(".UTF-8"); - m_locale = newlocale(LC_ALL_MASK, buf2, NULL); + m_locale = newlocale(LC_ALL_MASK, buf2.c_str(), NULL); if ( !m_locale ) { buf2 = buf + wxS(".utf-8"); - m_locale = newlocale(LC_ALL_MASK, buf2, NULL); + m_locale = newlocale(LC_ALL_MASK, buf2.c_str(), NULL); } if ( !m_locale ) { buf2 = buf + wxS(".UTF8"); - m_locale = newlocale(LC_ALL_MASK, buf2, NULL); + m_locale = newlocale(LC_ALL_MASK, buf2.c_str(), NULL); } if ( !m_locale ) { buf2 = buf + wxS(".utf8"); - m_locale = newlocale(LC_ALL_MASK, buf2, NULL); + m_locale = newlocale(LC_ALL_MASK, buf2.c_str(), NULL); } } @@ -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... +*/ + +/* + Note that this code is similar to (a portion of) wxLocale::IsAvailable code +*/ +#define IMPLEMENT_STRTOX_L_START \ + wxCHECK(loc.IsOk(), 0); \ + \ + /* (Try to) temporary set the 'C' locale */ \ + const char *oldLocale = wxSetlocale(LC_NUMERIC, "C"); \ + if ( !oldLocale ) \ + { \ + /* the current locale was not changed; no need to */ \ + /* restore the previous one... */ \ + 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