-/*
- 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; \
+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\"") );
+ }