#include "wx/xlocale.h"
+#include <errno.h>
+#include <locale.h>
+
// ----------------------------------------------------------------------------
// module globals
// ----------------------------------------------------------------------------
{
if ( !gs_cLocale )
{
- gs_cLocale = new wxXLocale(static_cast<wxXLocaleCTag *>(NULL));
+ // NOTE: bcc551 has trouble doing static_cast with incomplete
+ // type definition. reinterpret_cast used as workaround
+ gs_cLocale = new wxXLocale( reinterpret_cast<wxXLocaleCTag *>(NULL) );
}
return *gs_cLocale;
wxString buf(loc);
wxString buf2;
buf2 = buf + wxS(".UTF-8");
- m_locale = newlocale(LC_ALL_MASK, buf2, NULL);
+ m_locale = newlocale(LC_ALL_MASK, buf2.c_str(), NULL);
if ( !m_locale )
{
buf2 = buf + wxS(".utf-8");
- m_locale = newlocale(LC_ALL_MASK, buf2, NULL);
+ m_locale = newlocale(LC_ALL_MASK, buf2.c_str(), NULL);
}
if ( !m_locale )
{
buf2 = buf + wxS(".UTF8");
- m_locale = newlocale(LC_ALL_MASK, buf2, NULL);
+ m_locale = newlocale(LC_ALL_MASK, buf2.c_str(), NULL);
}
if ( !m_locale )
{
buf2 = buf + wxS(".utf8");
- m_locale = newlocale(LC_ALL_MASK, buf2, NULL);
+ m_locale = newlocale(LC_ALL_MASK, buf2.c_str(), NULL);
}
}
-
+
// TODO: wxLocale performs many more manipulations of the given locale
// string in the attempt to set a valid locale; reusing that code
// (changing it to take a generic wxTryLocale callback) would be nice
#define CTYPE_UPPER 0x0200
#define CTYPE_XDIGIT 0x0400
-static unsigned int gs_lookup[] =
+static const unsigned int gs_lookup[] =
{
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0004, 0x0004,
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...
+*/
+
+/*
+ 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; \
+ }
+
+#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