kicad-developers team mailing list archive
-
kicad-developers team
-
Mailing list archive
-
Message #06494
Re: Windows build cmake script
> Cool, maybe we can dig up the patch to the floating point entry bug that was
> fixed for pre 2.9.2 and apply that to released 2.9.1, as part of this script,
> the external project for wxWidgets.
>
> https://lists.launchpad.net/kicad-developers/msg06421.html
>
> The above message suggest that wxWidgets rev 67407 would have come about at
> least in part because of this needed patch.
>
>
> Thanks for your persistance and help. This is exciting.
>
> Dick
Seems maybe that it was 67406. Attached is a patch generated from:
$ svn diff -r 67405:67406 > /tmp/float.patch
Index: src/common/xlocale.cpp
===================================================================
--- src/common/xlocale.cpp (revision 67405)
+++ src/common/xlocale.cpp (revision 67406)
@@ -279,71 +279,92 @@
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; \
+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\"") );
+ }
}
-#define IMPLEMENT_STRTOX_L_END \
- /* restore the original locale */ \
- wxSetlocale(LC_NUMERIC, oldLocale); \
- return ret;
+ ~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)
{
- IMPLEMENT_STRTOX_L_START
- double ret = wxStrtod(str, endptr);
- IMPLEMENT_STRTOX_L_END
+ wxCHECK( loc.IsOk(), 0. );
+
+ CNumericLocaleSetter locSetter;
+
+ return wxStrtod(str, endptr);
}
double wxStrtod_l(const char* str, char **endptr, const wxXLocale& loc)
{
- IMPLEMENT_STRTOX_L_START
- double ret = wxStrtod(str, endptr);
- IMPLEMENT_STRTOX_L_END
+ 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)
{
- IMPLEMENT_STRTOX_L_START
- long ret = wxStrtol(str, endptr, base);
- IMPLEMENT_STRTOX_L_END
+ wxCHECK( loc.IsOk(), 0 );
+
+ CNumericLocaleSetter locSetter;
+
+ return wxStrtol(str, endptr, base);
}
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
+ 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)
{
- IMPLEMENT_STRTOX_L_START
- unsigned long ret = wxStrtoul(str, endptr, base);
- IMPLEMENT_STRTOX_L_END
+ 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)
{
- IMPLEMENT_STRTOX_L_START
- unsigned long ret = wxStrtoul(str, endptr, base);
- IMPLEMENT_STRTOX_L_END
+ wxCHECK( loc.IsOk(), 0 );
+
+ CNumericLocaleSetter locSetter;
+
+ return wxStrtoul(str, endptr, base);
}
-
#endif // !defined(wxHAS_XLOCALE_SUPPORT)
#endif // wxUSE_XLOCALE
Index: tests/xlocale/xlocale.cpp
===================================================================
--- tests/xlocale/xlocale.cpp (revision 67405)
+++ tests/xlocale/xlocale.cpp (revision 67406)
@@ -39,11 +39,13 @@
private:
CPPUNIT_TEST_SUITE( XLocaleTestCase );
CPPUNIT_TEST( TestCtor );
+ CPPUNIT_TEST( PreserveLocale );
CPPUNIT_TEST( TestCtypeFunctions );
CPPUNIT_TEST( TestStdlibFunctions );
CPPUNIT_TEST_SUITE_END();
void TestCtor();
+ void PreserveLocale();
void TestCtypeFunctions();
void TestStdlibFunctions();
@@ -81,6 +83,16 @@
#endif
}
+void XLocaleTestCase::PreserveLocale()
+{
+ // Test that using locale functions doesn't change the global C locale.
+ const wxString origLocale(setlocale(LC_ALL, NULL));
+
+ wxStrtod_l(wxT("1.234"), NULL, wxCLocale);
+
+ CPPUNIT_ASSERT_EQUAL( origLocale, setlocale(LC_ALL, NULL) );
+}
+
// test the ctype functions with the given locale
void XLocaleTestCase::TestCtypeFunctionsWith(const wxXLocale& loc)
{
Follow ups
References