From 21f0762a1a4609749f43234c61f40d6692eb815a Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Tue, 26 Jun 2007 20:44:58 +0000 Subject: [PATCH] fixes to wint_t and wchar_t handling in unichar.h (fixes FreeBSD compilation and Mingw compilation with -pedantic) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46967 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- configure | 70 ++++++++++++++++++++++++- configure.in | 22 ++++++++ include/wx/unichar.h | 119 ++++++++++++++++++++----------------------- setup.h.in | 3 ++ setup.h_vms | 3 ++ 5 files changed, 151 insertions(+), 66 deletions(-) diff --git a/configure b/configure index 085d5ffc24..3eebc8b056 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Id: configure.in 46644 2007-06-22 18:06:12Z VZ . +# From configure.in Id: configure.in 46702 2007-06-26 11:58:21Z VS . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61 for wxWidgets 2.9.0. # @@ -34077,6 +34077,74 @@ _ACEOF fi fi +{ echo "$as_me:$LINENO: checking if wchar_t is separate type" >&5 +echo $ECHO_N "checking if wchar_t is separate type... $ECHO_C" >&6; } +if test "${wx_cv_wchar_t_is_separate_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + + return 0; } + + struct Foo { void foo(wchar_t); + void foo(unsigned short); + void foo(unsigned int); + void foo(unsigned long); }; + + int bar() { + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + wx_cv_wchar_t_is_separate_type=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + wx_cv_wchar_t_is_separate_type=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ echo "$as_me:$LINENO: result: $wx_cv_wchar_t_is_separate_type" >&5 +echo "${ECHO_T}$wx_cv_wchar_t_is_separate_type" >&6; } + +if test "$wx_cv_wchar_t_is_separate_type" = "yes"; then + cat >>confdefs.h <<\_ACEOF +#define wxWCHAR_T_IS_SEPARATE_TYPE 1 +_ACEOF + +fi + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' diff --git a/configure.in b/configure.in index 09afd685ee..921f809ca2 100644 --- a/configure.in +++ b/configure.in @@ -4411,6 +4411,28 @@ else fi fi +AC_CACHE_CHECK([if wchar_t is separate type], + wx_cv_wchar_t_is_separate_type, + AC_TRY_COMPILE([#include ], + [ + return 0; } + + struct Foo { void foo(wchar_t); + void foo(unsigned short); + void foo(unsigned int); + void foo(unsigned long); }; + + int bar() { + ], + wx_cv_wchar_t_is_separate_type=yes, + wx_cv_wchar_t_is_separate_type=no + ) +) + +if test "$wx_cv_wchar_t_is_separate_type" = "yes"; then + AC_DEFINE(wxWCHAR_T_IS_SEPARATE_TYPE) +fi + AC_LANG_POP() dnl C++ dnl --------------------------------------------------------------------------- diff --git a/include/wx/unichar.h b/include/wx/unichar.h index 36c4b13587..0d7c5a681b 100644 --- a/include/wx/unichar.h +++ b/include/wx/unichar.h @@ -15,29 +15,22 @@ #include "wx/chartype.h" #include "wx/stringimpl.h" -// wint_t is just a typedef for wchar_t for many old compilers but for modern -// ones it's a separate type and we must provide a conversion to it to allow -// passing wxUniChar[Ref] to functions taking wint_t such as iswalnum() &c -#if (defined(__GNUC__) && \ - !defined(__DARWIN__) && !defined(__OS2__) && !defined(__DOS__)) || \ - (defined(__VISUALC__) && defined(_NATIVE_WCHAR_T_DEFINED)) || \ - wxCHECK_SUNCC_VERSION(5, 9) - #define wxWINT_T_IS_SEPARATE_TYPE +#ifndef wxWCHAR_T_IS_SEPARATE_TYPE + #ifdef __GNUG__ + #define wxWCHAR_T_IS_SEPARATE_TYPE + #endif + #if defined(__VISUALC__) && defined(_NATIVE_WCHAR_T_DEFINED) + #define wxWCHAR_T_IS_SEPARATE_TYPE + #endif #endif -// helper macro for doing something dependent on whether wint_t is or isn't a +// helper macro for doing something dependent on whether wchar_t is or isn't a // typedef inside another macro -#ifdef wxWINT_T_IS_SEPARATE_TYPE - #define wxIF_WINT_T_TYPE(x) x -#else // !wxWINT_T_IS_SEPARATE_TYPE - #define wxIF_WINT_T_TYPE(x) -#endif // wxWINT_T_IS_SEPARATE_TYPE/!wxWINT_T_IS_SEPARATE_TYPE - -// wchar_t seems to be defined as unsigned short by all Windows compilers but -// unsigned int everywhere else -#ifndef __WIN32__ - #define wxWCHAR_T_IS_UINT -#endif +#ifdef wxWCHAR_T_IS_SEPARATE_TYPE + #define wxIF_WCHAR_T_TYPE(x) x +#else // !wxWCHAR_T_IS_SEPARATE_TYPE + #define wxIF_WCHAR_T_TYPE(x) +#endif // wxWCHAR_T_IS_SEPARATE_TYPE/!wxWCHAR_T_IS_SEPARATE_TYPE class WXDLLIMPEXP_BASE wxUniCharRef; class WXDLLIMPEXP_BASE wxStringIteratorNode; @@ -60,13 +53,16 @@ public: wxUniChar(unsigned char c) { m_value = From8bit((char)c); } // Create the character from a wchar_t character value. +#ifdef wxWCHAR_T_IS_SEPARATE_TYPE wxUniChar(wchar_t c) { m_value = c; } -#ifdef wxWINT_T_IS_SEPARATE_TYPE - wxUniChar(wint_t c) { m_value = c; } #endif wxUniChar(int c) { m_value = c; } + wxUniChar(unsigned int c) { m_value = c; } wxUniChar(long int c) { m_value = c; } + wxUniChar(unsigned long int c) { m_value = c; } + wxUniChar(short int c) { m_value = c; } + wxUniChar(unsigned short int c) { m_value = c; } wxUniChar(const wxUniCharRef& c); @@ -93,22 +89,16 @@ public: // able to pass wxUniChars to verious standard narrow and wide character // functions operator char() const { return To8bit(m_value); } + operator unsigned char() const { return (unsigned char)To8bit(m_value); } +#ifdef wxWCHAR_T_IS_SEPARATE_TYPE operator wchar_t() const { return m_value; } +#endif operator int() const { return m_value; } - operator long int() const { return m_value; } -#ifndef wxWCHAR_T_IS_UINT operator unsigned int() const { return m_value; } -#endif - - // More conversions needed for other standard functions: uchar is for VC++ - // _mbxxx() ones (to which toxxx/isxxx() are mapped when _MBCS is defined) - // and some wide character functions take wint_t which happens to be the - // same as wchar_t for Windows compilers but not for g++ (except for the - // special Apple version) - operator unsigned char() const { return (unsigned char)To8bit(m_value); } -#ifdef wxWINT_T_IS_SEPARATE_TYPE - operator wint_t() const { return m_value; } -#endif + operator long int() const { return m_value; } + operator unsigned long int() const { return m_value; } + operator short int() const { return m_value; } + operator unsigned short int() const { return m_value; } // We need this operator for the "*p" part of expressions like "for ( // const_iterator p = begin() + nStart; *p; ++p )". In this case, @@ -126,12 +116,15 @@ public: wxUniChar& operator=(const wxUniChar& c) { m_value = c.m_value; return *this; } wxUniChar& operator=(char c) { m_value = From8bit(c); return *this; } wxUniChar& operator=(unsigned char c) { m_value = From8bit((char)c); return *this; } +#ifdef wxWCHAR_T_IS_SEPARATE_TYPE wxUniChar& operator=(wchar_t c) { m_value = c; return *this; } +#endif wxUniChar& operator=(int c) { m_value = c; return *this; } + wxUniChar& operator=(unsigned int c) { m_value = c; return *this; } wxUniChar& operator=(long int c) { m_value = c; return *this; } -#ifdef wxWINT_T_IS_SEPARATE_TYPE - wxUniChar& operator=(wint_t c) { m_value = c; return *this; } -#endif + wxUniChar& operator=(unsigned long int c) { m_value = c; return *this; } + wxUniChar& operator=(short int c) { m_value = c; return *this; } + wxUniChar& operator=(unsigned short int c) { m_value = c; return *this; } // Comparison operators: @@ -140,10 +133,13 @@ public: bool operator op(const wxUniChar& c) const { return m_value op c.m_value; }\ bool operator op(char c) const { return m_value op From8bit(c); } \ bool operator op(unsigned char c) const { return m_value op From8bit((char)c); } \ - bool operator op(wchar_t c) const { return m_value op (value_type)c; } \ + wxIF_WCHAR_T_TYPE( bool operator op(wchar_t c) const { return m_value op (value_type)c; } ) \ bool operator op(int c) const { return m_value op (value_type)c; } \ + bool operator op(unsigned int c) const { return m_value op (value_type)c; } \ + bool operator op(short int c) const { return m_value op (value_type)c; } \ + bool operator op(unsigned short int c) const { return m_value op (value_type)c; } \ bool operator op(long int c) const { return m_value op (value_type)c; } \ - wxIF_WINT_T_TYPE( bool operator op(wint_t c) const { return m_value op (value_type)c; } ) + bool operator op(unsigned long int c) const { return m_value op (value_type)c; } wxFOR_ALL_COMPARISONS(wxDEFINE_UNICHAR_OPERATOR) @@ -154,9 +150,7 @@ public: int operator-(char c) const { return m_value - From8bit(c); } int operator-(unsigned char c) const { return m_value - From8bit((char)c); } int operator-(wchar_t c) const { return m_value - (value_type)c; } -#ifdef wxWINT_T_IS_SEPARATE_TYPE - int operator-(wint_t c) const { return m_value - (value_type)c; } -#endif + private: static value_type From8bit(char c); @@ -217,25 +211,28 @@ public: wxUniCharRef& operator=(char c) { return *this = wxUniChar(c); } wxUniCharRef& operator=(unsigned char c) { return *this = wxUniChar(c); } +#ifdef wxWCHAR_T_IS_SEPARATE_TYPE wxUniCharRef& operator=(wchar_t c) { return *this = wxUniChar(c); } +#endif wxUniCharRef& operator=(int c) { return *this = wxUniChar(c); } + wxUniCharRef& operator=(unsigned int c) { return *this = wxUniChar(c); } + wxUniCharRef& operator=(short int c) { return *this = wxUniChar(c); } + wxUniCharRef& operator=(unsigned short int c) { return *this = wxUniChar(c); } wxUniCharRef& operator=(long int c) { return *this = wxUniChar(c); } -#ifdef wxWINT_T_IS_SEPARATE_TYPE - wxUniCharRef& operator=(wint_t c) { return *this = wxUniChar(c); } -#endif + wxUniCharRef& operator=(unsigned long int c) { return *this = wxUniChar(c); } // Conversions to the same types as wxUniChar is convertible too: operator char() const { return UniChar(); } - operator int() const { return UniChar(); } - operator long int() const { return UniChar(); } operator unsigned char() const { return UniChar(); } +#ifdef wxWCHAR_T_IS_SEPARATE_TYPE operator wchar_t() const { return UniChar(); } -#ifdef wxWINT_T_IS_SEPARATE_TYPE - operator wint_t() const { return UniChar(); } #endif -#ifndef wxWCHAR_T_IS_UINT + operator int() const { return UniChar(); } operator unsigned int() const { return UniChar(); } -#endif + operator short int() const { return UniChar(); } + operator unsigned short int() const { return UniChar(); } + operator long int() const { return UniChar(); } + operator unsigned long int() const { return UniChar(); } // see wxUniChar::operator bool etc. for explanation operator bool() const { return (bool)UniChar(); } @@ -248,10 +245,13 @@ public: bool operator op(const wxUniChar& c) const { return UniChar() op c; } \ bool operator op(char c) const { return UniChar() op c; } \ bool operator op(unsigned char c) const { return UniChar() op c; } \ - bool operator op(wchar_t c) const { return UniChar() op c; } \ + wxIF_WCHAR_T_TYPE( bool operator op(wchar_t c) const { return UniChar() op c; } ) \ bool operator op(int c) const { return UniChar() op c; } \ + bool operator op(unsigned int c) const { return UniChar() op c; } \ + bool operator op(short int c) const { return UniChar() op c; } \ + bool operator op(unsigned short int c) const { return UniChar() op c; } \ bool operator op(long int c) const { return UniChar() op c; } \ - wxIF_WINT_T_TYPE( bool operator op(wint_t c) const { return UniChar() op c; } ) + bool operator op(unsigned long int c) const { return UniChar() op c; } wxFOR_ALL_COMPARISONS(wxDEFINE_UNICHARREF_OPERATOR) @@ -263,9 +263,6 @@ public: int operator-(char c) const { return UniChar() - c; } int operator-(unsigned char c) const { return UniChar() - c; } int operator-(wchar_t c) const { return UniChar() - c; } -#ifdef wxWINT_T_IS_SEPARATE_TYPE - int operator-(wint_t c) const { return UniChar() - c; } -#endif private: #if wxUSE_UNICODE_UTF8 @@ -300,11 +297,6 @@ wxDEFINE_COMPARISONS(char, const wxUniCharRef&, wxCMP_REVERSE) wxDEFINE_COMPARISONS(wchar_t, const wxUniChar&, wxCMP_REVERSE) wxDEFINE_COMPARISONS(wchar_t, const wxUniCharRef&, wxCMP_REVERSE) -#ifdef wxWINT_T_IS_SEPARATE_TYPE -wxDEFINE_COMPARISONS(wint_t, const wxUniChar&, wxCMP_REVERSE) -wxDEFINE_COMPARISONS(wint_t, const wxUniCharRef&, wxCMP_REVERSE) -#endif - wxDEFINE_COMPARISONS(const wxUniChar&, const wxUniCharRef&, wxCMP_REVERSE) #undef wxCMP_REVERSE @@ -313,8 +305,5 @@ wxDEFINE_COMPARISONS(const wxUniChar&, const wxUniCharRef&, wxCMP_REVERSE) inline int operator-(char c1, const wxUniCharRef& c2) { return -(c2 - c1); } inline int operator-(const wxUniChar& c1, const wxUniCharRef& c2) { return -(c2 - c1); } inline int operator-(wchar_t c1, const wxUniCharRef& c2) { return -(c2 - c1); } -#ifdef wxWINT_T_IS_SEPARATE_TYPE -inline int operator-(wint_t c1, const wxUniCharRef& c2) { return -(c2 - c1); } -#endif #endif /* _WX_UNICHAR_H_ */ diff --git a/setup.h.in b/setup.h.in index cc2bebdae8..777694bdc5 100644 --- a/setup.h.in +++ b/setup.h.in @@ -948,6 +948,9 @@ /* Define if size_t on your machine is the same type as unsigned long. */ #undef wxSIZE_T_IS_ULONG +/* Define if wchar_t is distinct type in your compiler. */ +#undef wxWCHAR_T_IS_SEPARATE_TYPE + /* Define if you have the dlopen function. */ #undef HAVE_DLOPEN diff --git a/setup.h_vms b/setup.h_vms index caa6b39605..742bbd7d73 100644 --- a/setup.h_vms +++ b/setup.h_vms @@ -1033,6 +1033,9 @@ typedef pid_t GPid; /* Define if size_t on your machine is the same type as unsigned long. */ #undef wxSIZE_T_IS_ULONG +/* Define if wchar_t is distinct type in your compiler. */ +#define wxWCHAR_T_IS_SEPARATE_TYPE 1 + /* Define if you have the dlopen function. */ #define HAVE_DLOPEN 1 -- 2.45.2