X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ab63f9985f6da3cd9921cd904e78f54b138f2b97..ab67e8874db324fab5223cc8d5dff8a8de3e2b77:/include/wx/xlocale.h diff --git a/include/wx/xlocale.h b/include/wx/xlocale.h index 39b49e7556..665fb6ecef 100644 --- a/include/wx/xlocale.h +++ b/include/wx/xlocale.h @@ -18,8 +18,8 @@ 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() */ @@ -44,6 +44,7 @@ #include #include #include + #include #if wxUSE_UNICODE #include @@ -96,6 +97,9 @@ public: // 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() @@ -116,7 +120,7 @@ private: // 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 @@ -169,7 +173,7 @@ private: // 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 @@ -177,7 +181,7 @@ private: // 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 @@ -198,33 +202,52 @@ private: #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(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(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(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(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(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(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(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(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(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(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(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(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(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) @@ -266,7 +289,27 @@ private: 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); @@ -282,6 +325,15 @@ private: 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