// Purpose: Header to provide some xlocale wrappers
// Author: Brian Vanderburg II, Vadim Zeitlin
// Created: 2008-01-07
-// RCS-ID: $Id$
// Copyright: (c) 2008 Brian Vanderburg II
// 2008 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
using decimal point &c.
TODO: Currently only the character classification and transformation
- functions are implemented, we also need at least
- - numbers: atof_l(), strtod_l() &c
+ functions and number <-> string functions, are implemented,
+ we also need at least
- formatted IO: scanf_l(), printf_l() &c
- time: strftime_l(), strptime_l()
*/
#include <locale.h>
#include <xlocale.h>
#include <ctype.h>
+ #include <stdlib.h>
#if wxUSE_UNICODE
#include <wctype.h>
// Get the type
wxXLocale_t Get() const { return m_locale; }
+ bool operator== (const wxXLocale& loc) const
+ { return m_locale == loc.m_locale; }
+
private:
// Special ctor for the "C" locale, it's only used internally as the user
// code is supposed to use GetCLocale()
// doesn't give us any means to copy a _locale_t object so we reduce the
// functionality to least common denominator here -- it shouldn't be a
// problem as copying the locale objects shouldn't be often needed
- DECLARE_NO_COPY_CLASS(wxXLocale)
+ wxDECLARE_NO_COPY_CLASS(wxXLocale);
};
#else // !wxHAS_XLOCALE_SUPPORT
// although it's not a problem to copy the objects of this class, we use
// this macro in this implementation for consistency with the xlocale-based
// one which can't be copied when using MSVC locale API
- DECLARE_NO_COPY_CLASS(wxXLocale)
+ wxDECLARE_NO_COPY_CLASS(wxXLocale);
};
#endif // wxHAS_XLOCALE_SUPPORT/!wxHAS_XLOCALE_SUPPORT
// A shorter synonym for the most commonly used locale object
#define wxCLocale (wxXLocale::GetCLocale())
-
+extern WXDLLIMPEXP_DATA_BASE(wxXLocale) wxNullXLocale;
// Wrappers for various functions:
#ifdef wxHAS_XLOCALE_SUPPORT
#define wxCRT_Toupper_lA wxXLOCALE_IDENT(toupper_l)
inline int wxIsalnum_l(char c, const wxXLocale& loc)
- { return wxCRT_Isalnum_lA(wx_static_cast(unsigned char, c), loc.Get()); }
+ { return wxCRT_Isalnum_lA(static_cast<unsigned char>(c), loc.Get()); }
inline int wxIsalpha_l(char c, const wxXLocale& loc)
- { return wxCRT_Isalpha_lA(wx_static_cast(unsigned char, c), loc.Get()); }
+ { return wxCRT_Isalpha_lA(static_cast<unsigned char>(c), loc.Get()); }
inline int wxIscntrl_l(char c, const wxXLocale& loc)
- { return wxCRT_Iscntrl_lA(wx_static_cast(unsigned char, c), loc.Get()); }
+ { return wxCRT_Iscntrl_lA(static_cast<unsigned char>(c), loc.Get()); }
inline int wxIsdigit_l(char c, const wxXLocale& loc)
- { return wxCRT_Isdigit_lA(wx_static_cast(unsigned char, c), loc.Get()); }
+ { return wxCRT_Isdigit_lA(static_cast<unsigned char>(c), loc.Get()); }
inline int wxIsgraph_l(char c, const wxXLocale& loc)
- { return wxCRT_Isgraph_lA(wx_static_cast(unsigned char, c), loc.Get()); }
+ { return wxCRT_Isgraph_lA(static_cast<unsigned char>(c), loc.Get()); }
inline int wxIslower_l(char c, const wxXLocale& loc)
- { return wxCRT_Islower_lA(wx_static_cast(unsigned char, c), loc.Get()); }
+ { return wxCRT_Islower_lA(static_cast<unsigned char>(c), loc.Get()); }
inline int wxIsprint_l(char c, const wxXLocale& loc)
- { return wxCRT_Isprint_lA(wx_static_cast(unsigned char, c), loc.Get()); }
+ { return wxCRT_Isprint_lA(static_cast<unsigned char>(c), loc.Get()); }
inline int wxIspunct_l(char c, const wxXLocale& loc)
- { return wxCRT_Ispunct_lA(wx_static_cast(unsigned char, c), loc.Get()); }
+ { return wxCRT_Ispunct_lA(static_cast<unsigned char>(c), loc.Get()); }
inline int wxIsspace_l(char c, const wxXLocale& loc)
- { return wxCRT_Isspace_lA(wx_static_cast(unsigned char, c), loc.Get()); }
+ { return wxCRT_Isspace_lA(static_cast<unsigned char>(c), loc.Get()); }
inline int wxIsupper_l(char c, const wxXLocale& loc)
- { return wxCRT_Isupper_lA(wx_static_cast(unsigned char, c), loc.Get()); }
+ { return wxCRT_Isupper_lA(static_cast<unsigned char>(c), loc.Get()); }
inline int wxIsxdigit_l(char c, const wxXLocale& loc)
- { return wxCRT_Isxdigit_lA(wx_static_cast(unsigned char, c), loc.Get()); }
+ { return wxCRT_Isxdigit_lA(static_cast<unsigned char>(c), loc.Get()); }
inline int wxTolower_l(char c, const wxXLocale& loc)
- { return wxCRT_Tolower_lA(wx_static_cast(unsigned char, c), loc.Get()); }
+ { return wxCRT_Tolower_lA(static_cast<unsigned char>(c), loc.Get()); }
inline int wxToupper_l(char c, const wxXLocale& loc)
- { return wxCRT_Toupper_lA(wx_static_cast(unsigned char, c), loc.Get()); }
+ { return wxCRT_Toupper_lA(static_cast<unsigned char>(c), loc.Get()); }
+
+
+ // stdlib functions for numeric <-> string conversion
+ // NOTE: GNU libc does not have ato[fil]_l functions;
+ // MSVC++8 does not have _strto[u]ll_l functions;
+ // thus we take the minimal set of functions provided in both environments:
+
+ #define wxCRT_Strtod_lA wxXLOCALE_IDENT(strtod_l)
+ #define wxCRT_Strtol_lA wxXLOCALE_IDENT(strtol_l)
+ #define wxCRT_Strtoul_lA wxXLOCALE_IDENT(strtoul_l)
+
+ inline double wxStrtod_lA(const char *c, char **endptr, const wxXLocale& loc)
+ { return wxCRT_Strtod_lA(c, endptr, loc.Get()); }
+ inline long wxStrtol_lA(const char *c, char **endptr, int base, const wxXLocale& loc)
+ { return wxCRT_Strtol_lA(c, endptr, base, loc.Get()); }
+ inline unsigned long wxStrtoul_lA(const char *c, char **endptr, int base, const wxXLocale& loc)
+ { return wxCRT_Strtoul_lA(c, endptr, base, loc.Get()); }
#if wxUSE_UNICODE
+
+ // ctype functions
#define wxCRT_Isalnum_lW wxXLOCALE_IDENT(iswalnum_l)
#define wxCRT_Isalpha_lW wxXLOCALE_IDENT(iswalpha_l)
#define wxCRT_Iscntrl_lW wxXLOCALE_IDENT(iswcntrl_l)
inline wchar_t wxToupper_l(wchar_t c, const wxXLocale& loc)
{ return wxCRT_Toupper_lW(c, loc.Get()); }
- #endif // wxUSE_UNICDE (ctype functions)
+
+ // stdlib functions for numeric <-> string conversion
+ // (see notes above about missing functions)
+ #define wxCRT_Strtod_lW wxXLOCALE_IDENT(wcstod_l)
+ #define wxCRT_Strtol_lW wxXLOCALE_IDENT(wcstol_l)
+ #define wxCRT_Strtoul_lW wxXLOCALE_IDENT(wcstoul_l)
+
+ inline double wxStrtod_l(const wchar_t *c, wchar_t **endptr, const wxXLocale& loc)
+ { return wxCRT_Strtod_lW(c, endptr, loc.Get()); }
+ inline long wxStrtol_l(const wchar_t *c, wchar_t **endptr, int base, const wxXLocale& loc)
+ { return wxCRT_Strtol_lW(c, endptr, base, loc.Get()); }
+ inline unsigned long wxStrtoul_l(const wchar_t *c, wchar_t **endptr, int base, const wxXLocale& loc)
+ { return wxCRT_Strtoul_lW(c, endptr, base, loc.Get()); }
+ #else // !wxUSE_UNICODE
+ inline double wxStrtod_l(const char *c, char **endptr, const wxXLocale& loc)
+ { return wxCRT_Strtod_lA(c, endptr, loc.Get()); }
+ inline long wxStrtol_l(const char *c, char **endptr, int base, const wxXLocale& loc)
+ { return wxCRT_Strtol_lA(c, endptr, base, loc.Get()); }
+ inline unsigned long wxStrtoul_l(const char *c, char **endptr, int base, const wxXLocale& loc)
+ { return wxCRT_Strtoul_lA(c, endptr, base, loc.Get()); }
+ #endif // wxUSE_UNICODE
#else // !wxHAS_XLOCALE_SUPPORT
// ctype functions
int WXDLLIMPEXP_BASE wxIsalnum_l(const wxUniChar& c, const wxXLocale& loc);
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);
+
+ // 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