]> git.saurik.com Git - wxWidgets.git/commitdiff
implement wxStrtoX_l() variants even when wxHAS_XLOCALE_SUPPORT is not defined
authorFrancesco Montorsi <f18m_cpp217828@yahoo.it>
Fri, 20 Mar 2009 01:27:56 +0000 (01:27 +0000)
committerFrancesco Montorsi <f18m_cpp217828@yahoo.it>
Fri, 20 Mar 2009 01:27:56 +0000 (01:27 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59637 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/xlocale.h
src/common/xlocale.cpp

index d2ca8d2008e2631e0b787958ec0428263a32f1f1..bf8f8daf071e12f095da95dc9dc2e3f4517fbabb 100644 (file)
@@ -319,8 +319,17 @@ extern WXDLLIMPEXP_DATA_BASE(wxXLocale) wxNullXLocale;
     int WXDLLIMPEXP_BASE wxIsxdigit_l(const wxUniChar& c, const wxXLocale& loc);
     int WXDLLIMPEXP_BASE wxTolower_l(const wxUniChar& c, const wxXLocale& loc);
     int WXDLLIMPEXP_BASE wxToupper_l(const wxUniChar& c, const wxXLocale& loc);
-#endif // wxHAS_XLOCALE_SUPPORT/!wxHAS_XLOCALE_SUPPORT
 
+    // stdlib functions
+    double WXDLLIMPEXP_BASE wxStrtod_l(const wchar_t* str, wchar_t **endptr, const wxXLocale& loc);
+    double WXDLLIMPEXP_BASE wxStrtod_l(const char* str, char **endptr, const wxXLocale& loc);
+    long WXDLLIMPEXP_BASE wxStrtol_l(const wchar_t* str, wchar_t **endptr, int base, const wxXLocale& loc);
+    long WXDLLIMPEXP_BASE wxStrtol_l(const char* str, char **endptr, int base, const wxXLocale& loc);
+    unsigned long WXDLLIMPEXP_BASE wxStrtoul_l(const wchar_t* str, wchar_t **endptr, int base, const wxXLocale& loc);
+    unsigned long WXDLLIMPEXP_BASE wxStrtoul_l(const char* str, char **endptr, int base, const wxXLocale& loc);
+
+#endif // wxHAS_XLOCALE_SUPPORT/!wxHAS_XLOCALE_SUPPORT
+    
 #endif // wxUSE_XLOCALE
 
 #endif // _WX_XLOCALE_H_
index 05f7a5b7d33a4cee5d44f1a06c0c369f1fb74054..f66b2ab71a31e57ab8a2124f68db8c2782b47da2 100644 (file)
@@ -31,6 +31,8 @@
 
 #include "wx/xlocale.h"
 
+#include <errno.h>
+
 // ----------------------------------------------------------------------------
 // module globals
 // ----------------------------------------------------------------------------
@@ -260,6 +262,85 @@ int wxToupper_l(const wxUniChar& c, const wxXLocale& loc)
     return c;
 }
 
+
+// ----------------------------------------------------------------------------
+// string --> number conversion functions
+// ----------------------------------------------------------------------------
+
+/*
+    WARNING: the implementation of the wxStrtoX_l() functions below is unsafe
+             in a multi-threaded environment as we temporary change the locale
+             and if in the meanwhile an other thread performs some locale-dependent
+             operation, it may get unexpected results...
+             However this is the best we can do without reinventing the wheel in the
+             case !wxHAS_XLOCALE_SUPPORT...
+*/
+
+#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;
+
+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
+}
+
+double wxStrtod_l(const char* str, char **endptr, const wxXLocale& loc)
+{
+    IMPLEMENT_STRTOX_L_START
+    double ret = wxStrtod(str, endptr);
+    IMPLEMENT_STRTOX_L_END
+}
+
+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
+}
+
+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
+}
+
+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
+}
+
+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
+}
+
+
 #endif // !defined(wxHAS_XLOCALE_SUPPORT)
 
 #endif // wxUSE_XLOCALE