-#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;
+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