-/*
- 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 locale to 'C' */ \
- const char *oldLocale = wxSetlocale(LC_NUMERIC, NULL); \
- 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; \
+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\"") );
+ }