git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54802 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			279 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			279 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Name:        wx/chartype.h
 | |
|  * Purpose:     Declarations of wxChar and related types
 | |
|  * Author:      Joel Farley, Ove Kåven
 | |
|  * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee
 | |
|  * Created:     1998/06/12
 | |
|  * RCS-ID:      $Id$
 | |
|  * Copyright:   (c) 1998-2006 wxWidgets dev team
 | |
|  * Licence:     wxWindows licence
 | |
|  */
 | |
| 
 | |
| /* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */
 | |
| 
 | |
| #ifndef _WX_WXCHARTYPE_H_
 | |
| #define _WX_WXCHARTYPE_H_
 | |
| 
 | |
| /* defs.h indirectly includes this file, so don't include it here */
 | |
| #include "wx/platform.h"
 | |
| 
 | |
| /* check whether we have wchar_t and which size it is if we do */
 | |
| #if !defined(wxUSE_WCHAR_T)
 | |
|     #if defined(__UNIX__)
 | |
|         #if defined(HAVE_WCSTR_H) || defined(HAVE_WCHAR_H) || defined(__FreeBSD__) || defined(__DARWIN__)
 | |
|             #define wxUSE_WCHAR_T 1
 | |
|         #else
 | |
|             #define wxUSE_WCHAR_T 0
 | |
|         #endif
 | |
|     #elif defined(__GNUWIN32__) && !defined(__MINGW32__)
 | |
|         #define wxUSE_WCHAR_T 0
 | |
|     #elif defined(__WATCOMC__)
 | |
|         #define wxUSE_WCHAR_T 0
 | |
|     #elif defined(__VISAGECPP__) && (__IBMCPP__ < 400)
 | |
|         #define wxUSE_WCHAR_T 0
 | |
|     #else
 | |
|         /* add additional compiler checks if this fails */
 | |
|         #define wxUSE_WCHAR_T 1
 | |
|     #endif
 | |
| #endif /* !defined(wxUSE_WCHAR_T) */
 | |
| 
 | |
| /* Unicode support requires wchar_t */
 | |
| #if !wxUSE_WCHAR_T
 | |
|     #error "wchar_t must be available"
 | |
| #endif /* Unicode */
 | |
| 
 | |
| /*
 | |
|    non Unix compilers which do have wchar.h (but not tchar.h which is included
 | |
|    below and which includes wchar.h anyhow).
 | |
| 
 | |
|    Actually MinGW has tchar.h, but it does not include wchar.h
 | |
|  */
 | |
| #if defined(__MWERKS__) || defined(__VISAGECPP__) || defined(__MINGW32__) || defined(__WATCOMC__)
 | |
|     #ifndef HAVE_WCHAR_H
 | |
|         #define HAVE_WCHAR_H
 | |
|     #endif
 | |
| #endif
 | |
| #if defined(__MWERKS__) && !defined(__MACH__)
 | |
|     #ifndef HAVE_WCSLEN
 | |
|         #define HAVE_WCSLEN
 | |
|     #endif
 | |
| #endif
 | |
| 
 | |
| #if wxUSE_WCHAR_T
 | |
|     #ifdef HAVE_WCHAR_H
 | |
|         /* the current (as of Nov 2002) version of cygwin has a bug in its */
 | |
|         /* wchar.h -- there is no extern "C" around the declarations in it */
 | |
|         /* and this results in linking errors later; also, at least on some */
 | |
|         /* Cygwin versions, wchar.h requires sys/types.h */
 | |
|         #ifdef __CYGWIN__
 | |
|             #include <sys/types.h>
 | |
|             #ifdef __cplusplus
 | |
|                 extern "C" {
 | |
|             #endif
 | |
|         #endif /* Cygwin */
 | |
| 
 | |
|         #include <wchar.h>
 | |
| 
 | |
|         #if defined(__CYGWIN__) && defined(__cplusplus)
 | |
|             }
 | |
|         #endif /* Cygwin and C++ */
 | |
| 
 | |
|     #elif defined(HAVE_WCSTR_H)
 | |
|         /* old compilers have relevant declarations here */
 | |
|         #include <wcstr.h>
 | |
|     #elif defined(__FreeBSD__) || defined(__DARWIN__) || defined(__EMX__)
 | |
|         /* include stdlib.h for wchar_t */
 | |
|         #include <stdlib.h>
 | |
|     #endif /* HAVE_WCHAR_H */
 | |
| 
 | |
|     #ifdef HAVE_WIDEC_H
 | |
|         #include <widec.h>
 | |
|     #endif
 | |
| #endif /* wxUSE_WCHAR_T */
 | |
| 
 | |
| /* -------------------------------------------------------------------------- */
 | |
| /* define wxHAVE_TCHAR_SUPPORT for the compilers which support the TCHAR type */
 | |
| /* mapped to either char or wchar_t depending on the ASCII/Unicode mode and   */
 | |
| /* have the function mapping _tfoo() -> foo() or wfoo()                       */
 | |
| /* -------------------------------------------------------------------------- */
 | |
| 
 | |
| /* VC++ and BC++ starting with 5.2 have TCHAR support */
 | |
| #ifdef __VISUALC__
 | |
|     #define wxHAVE_TCHAR_SUPPORT
 | |
| #elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x520)
 | |
|     #define wxHAVE_TCHAR_SUPPORT
 | |
|     #include <ctype.h>
 | |
| #elif defined(__WATCOMC__)
 | |
|     #define wxHAVE_TCHAR_SUPPORT
 | |
| #elif defined(__DMC__)
 | |
|     #define wxHAVE_TCHAR_SUPPORT
 | |
| #elif defined(__WXPALMOS__)
 | |
|     #include <stddef.h>
 | |
| #elif defined(__MINGW32__) && wxCHECK_W32API_VERSION( 1, 0 )
 | |
|     #define wxHAVE_TCHAR_SUPPORT
 | |
|     #include <stddef.h>
 | |
|     #include <string.h>
 | |
|     #include <ctype.h>
 | |
| #elif 0 && defined(__VISAGECPP__) && (__IBMCPP__ >= 400)
 | |
|     /* VZ: the old VisualAge definitions were completely wrong and had no    */
 | |
|     /*     chance at all to work in Unicode build anyhow so let's pretend    */
 | |
|     /*     that VisualAge does _not_ support TCHAR for the moment (as        */
 | |
|     /*     indicated by "0 &&" above) until someone really has time to delve */
 | |
|     /*     into Unicode issues under OS/2 */
 | |
| 
 | |
|     /* VisualAge 4.0+ supports TCHAR */
 | |
|     #define wxHAVE_TCHAR_SUPPORT
 | |
| #endif /* compilers with (good) TCHAR support */
 | |
| 
 | |
| #ifdef wxHAVE_TCHAR_SUPPORT
 | |
|     /* get TCHAR definition if we've got it */
 | |
|     #include <tchar.h>
 | |
| 
 | |
|     /* we surely do have wchar_t if we have TCHAR */
 | |
|     #ifndef wxUSE_WCHAR_T
 | |
|         #define wxUSE_WCHAR_T 1
 | |
|     #endif /* !defined(wxUSE_WCHAR_T) */
 | |
| #endif /* wxHAVE_TCHAR_SUPPORT */
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| /* define wxChar type                                                        */
 | |
| /* ------------------------------------------------------------------------- */
 | |
| 
 | |
| /* TODO: define wxCharInt to be equal to either int or wint_t? */
 | |
| 
 | |
| #if !wxUSE_UNICODE
 | |
|     typedef char wxChar;
 | |
|     typedef signed char wxSChar;
 | |
|     typedef unsigned char wxUChar;
 | |
| #else
 | |
|     /* VZ: note that VC++ defines _T[SU]CHAR simply as wchar_t and not as    */
 | |
|     /*     signed/unsigned version of it which (a) makes sense to me (unlike */
 | |
|     /*     char wchar_t is always unsigned) and (b) was how the previous     */
 | |
|     /*     definitions worked so keep it like this                           */
 | |
| 
 | |
|     /* Sun's SunPro compiler supports the wchar_t type and wide character    */
 | |
|     /* functions, but does not define __WCHAR_TYPE__. Define it here to      */
 | |
|     /* allow unicode enabled builds.                                         */
 | |
|     #if (defined(__SUNPRO_CC) || defined(__SUNPRO_C)) && !defined(__WCHAR_TYPE__)
 | |
|         #define __WCHAR_TYPE__ wxchar_t
 | |
|     #endif
 | |
| 
 | |
|     /* GNU libc has __WCHAR_TYPE__ which requires special treatment, see */
 | |
|     /* comment below */
 | |
|     #if !defined(__WCHAR_TYPE__) || \
 | |
|         (!defined(__GNUC__) || wxCHECK_GCC_VERSION(2, 96))
 | |
|         /* standard case */
 | |
|         typedef wchar_t wxChar;
 | |
|         typedef wchar_t wxSChar;
 | |
|         typedef wchar_t wxUChar;
 | |
|     #else /* __WCHAR_TYPE__ and gcc < 2.96 */
 | |
|         /* VS: wxWidgets used to define wxChar as __WCHAR_TYPE__ here.       */
 | |
|         /*     However, this doesn't work with new GCC 3.x compilers because */
 | |
|         /*     wchar_t is C++'s builtin type in the new standard. OTOH, old  */
 | |
|         /*     compilers (GCC 2.x) won't accept new definition of            */
 | |
|         /*     wx{S,U}CharType, so we have to define wxChar                  */
 | |
|         /*     conditionally depending on detected compiler & compiler       */
 | |
|         /*     version.                                                      */
 | |
| 
 | |
|         /*     with old definition of wxChar. */
 | |
|         #define wchar_t __WCHAR_TYPE__
 | |
|         typedef __WCHAR_TYPE__ wxChar;
 | |
|         typedef __WCHAR_TYPE__ wxSChar;
 | |
|         typedef __WCHAR_TYPE__ wxUChar;
 | |
|     #endif /* __WCHAR_TYPE__ */
 | |
| #endif /* ASCII/Unicode */
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| /* define wxStringCharType                                                   */
 | |
| /* ------------------------------------------------------------------------- */
 | |
| 
 | |
| /* depending on the platform, Unicode build can either store wxStrings as
 | |
|    wchar_t* or UTF-8 encoded char*: */
 | |
| #if wxUSE_UNICODE
 | |
|     /* FIXME-UTF8: what would be better place for this? */
 | |
|     #if defined(wxUSE_UTF8_LOCALE_ONLY) && !defined(wxUSE_UNICODE_UTF8)
 | |
|         #error "wxUSE_UTF8_LOCALE_ONLY only makes sense with wxUSE_UNICODE_UTF8"
 | |
|     #endif
 | |
|     #ifndef wxUSE_UTF8_LOCALE_ONLY
 | |
|         #define wxUSE_UTF8_LOCALE_ONLY 0
 | |
|     #endif
 | |
| 
 | |
|     #ifndef wxUSE_UNICODE_UTF8
 | |
|         #define wxUSE_UNICODE_UTF8 0
 | |
|     #endif
 | |
| 
 | |
|     #if wxUSE_UNICODE_UTF8
 | |
|         #define wxUSE_UNICODE_WCHAR 0
 | |
|     #else
 | |
|         #define wxUSE_UNICODE_WCHAR 1
 | |
|     #endif
 | |
| #else
 | |
|     #define wxUSE_UNICODE_WCHAR 0
 | |
|     #define wxUSE_UNICODE_UTF8  0
 | |
|     #define wxUSE_UTF8_LOCALE_ONLY 0
 | |
| #endif
 | |
| 
 | |
| /* define char type used by wxString internal representation: */
 | |
| #if wxUSE_UNICODE_WCHAR
 | |
|     typedef wchar_t wxStringCharType;
 | |
| #else /* wxUSE_UNICODE_UTF8 || ANSI */
 | |
|     typedef char wxStringCharType;
 | |
| #endif
 | |
| 
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| /* define _T() and related macros                                            */
 | |
| /* ------------------------------------------------------------------------- */
 | |
| 
 | |
| /* BSD systems define _T() to be something different in ctype.h, override it */
 | |
| #if defined(__FreeBSD__) || defined(__DARWIN__)
 | |
|     #include <ctype.h>
 | |
|     #undef _T
 | |
| #endif
 | |
| 
 | |
| /* could already be defined by tchar.h (it's quasi standard) */
 | |
| #ifndef _T
 | |
|     #if !wxUSE_UNICODE
 | |
|         #define _T(x) x
 | |
|     #else /* Unicode */
 | |
|         /* use wxCONCAT_HELPER so that x could be expanded if it's a macro */
 | |
|         #define _T(x) wxCONCAT_HELPER(L, x)
 | |
|     #endif /* ASCII/Unicode */
 | |
| #endif /* !defined(_T) */
 | |
| 
 | |
| /*
 | |
|    wxS ("wx string") macro can be used to create literals using the same
 | |
|    representation as wxString does internally, i.e. wchar_t in Unicode build
 | |
|    under Windows or char in UTF-8-based Unicode builds and (deprecated) ANSI
 | |
|    builds everywhere (see wxStringCharType definition above).
 | |
|  */
 | |
| #if wxUSE_UNICODE_WCHAR
 | |
|     #define wxS(x) wxCONCAT_HELPER(L, x)
 | |
| #else /* wxUSE_UNICODE_UTF8 || ANSI */
 | |
|     #define wxS(x) x
 | |
| #endif
 | |
| 
 | |
| /* although global macros with such names are normally bad, we want to have  */
 | |
| /* another name for _T() which should be used to avoid confusion between     */
 | |
| /* _T() and _() in wxWidgets sources */
 | |
| #define wxT(x)       _T(x)
 | |
| 
 | |
| /* a helper macro allowing to make another macro Unicode-friendly, see below */
 | |
| #define wxAPPLY_T(x) _T(x)
 | |
| 
 | |
| /* Unicode-friendly __FILE__, __DATE__ and __TIME__ analogs */
 | |
| #ifndef __TFILE__
 | |
|     #define __TFILE__ wxAPPLY_T(__FILE__)
 | |
| #endif
 | |
| 
 | |
| #ifndef __TDATE__
 | |
|     #define __TDATE__ wxAPPLY_T(__DATE__)
 | |
| #endif
 | |
| 
 | |
| #ifndef __TTIME__
 | |
|     #define __TTIME__ wxAPPLY_T(__TIME__)
 | |
| #endif
 | |
| 
 | |
| #endif /* _WX_WXCHARTYPE_H_ */
 | |
| 
 |