← Back to team overview

kicad-developers team mailing list archive

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