+
+// ----------------------------------------------------------------------------
+// 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...
+*/
+
+namespace
+{
+
+// Helper class that changes LC_NUMERIC facet of the global locale in its ctor
+// to "C" locale and restores it in its dtor later.
+class CNumericLocaleSetter
+{
+public:
+ CNumericLocaleSetter()
+ : m_oldLocale(wxStrdupA(setlocale(LC_NUMERIC, NULL)))
+ {
+ if ( !wxSetlocale(LC_NUMERIC, "C") )
+ {
+ // Setting locale to "C" should really always work.
+ wxFAIL_MSG( wxS("Couldn't set LC_NUMERIC to \"C\"") );
+ }
+ }
+
+ ~CNumericLocaleSetter()
+ {
+ wxSetlocale(LC_NUMERIC, m_oldLocale);
+ free(m_oldLocale);
+ }
+
+private:
+ char * const m_oldLocale;
+
+ wxDECLARE_NO_COPY_CLASS(CNumericLocaleSetter);
+};
+
+} // anonymous namespace
+
+double wxStrtod_l(const wchar_t* str, wchar_t **endptr, const wxXLocale& loc)
+{
+ wxCHECK( loc.IsOk(), 0. );
+
+ CNumericLocaleSetter locSetter;
+
+ return wxStrtod(str, endptr);
+}
+
+double wxStrtod_l(const char* str, char **endptr, const wxXLocale& loc)
+{
+ wxCHECK( loc.IsOk(), 0. );
+
+ CNumericLocaleSetter locSetter;
+
+ return wxStrtod(str, endptr);
+}
+
+long wxStrtol_l(const wchar_t* str, wchar_t **endptr, int base, const wxXLocale& loc)
+{
+ wxCHECK( loc.IsOk(), 0 );
+
+ CNumericLocaleSetter locSetter;
+
+ return wxStrtol(str, endptr, base);
+}
+
+long wxStrtol_l(const char* str, char **endptr, int base, const wxXLocale& loc)
+{
+ wxCHECK( loc.IsOk(), 0 );
+
+ CNumericLocaleSetter locSetter;
+
+ return wxStrtol(str, endptr, base);
+}
+
+unsigned long wxStrtoul_l(const wchar_t* str, wchar_t **endptr, int base, const wxXLocale& loc)
+{
+ wxCHECK( loc.IsOk(), 0 );
+
+ CNumericLocaleSetter locSetter;
+
+ return wxStrtoul(str, endptr, base);
+}
+
+unsigned long wxStrtoul_l(const char* str, char **endptr, int base, const wxXLocale& loc)
+{
+ wxCHECK( loc.IsOk(), 0 );
+
+ CNumericLocaleSetter locSetter;
+
+ return wxStrtoul(str, endptr, base);
+}
+