X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8907154c1a8a6882c6797d1f16393ddfb23e7f3a..a69aabc360d54a93e355fab72c6513c75aaa7337:/include/wx/wxchar.h diff --git a/include/wx/wxchar.h b/include/wx/wxchar.h index f580470286..7c70a8b4d3 100644 --- a/include/wx/wxchar.h +++ b/include/wx/wxchar.h @@ -14,7 +14,9 @@ #ifndef _WX_WXCHAR_H_ #define _WX_WXCHAR_H_ -#include "wx/defs.h" /* for wxUSE_UNICODE */ +/* defs.h indirectly includes this file, so don't include it here */ +#include "wx/platform.h" +#include "wx/dlimpexp.h" #if defined(HAVE_STRTOK_R) && defined(__DARWIN__) && defined(_MSL_USING_MW_C_HEADERS) && _MSL_USING_MW_C_HEADERS char *strtok_r(char *, const char *, char **); @@ -48,7 +50,7 @@ /* Standard headers we need here. - NB: don't include any wxWidgets headers here because almost of them include + NB: don't include any wxWidgets headers here because almost all of them include this one! */ @@ -57,7 +59,9 @@ /* Almost all compiler have strdup(), but not quite all: CodeWarrior under Mac */ /* and VC++ for Windows CE don't provide it */ -#if !(defined(__MWERKS__) && defined(__WXMAC__)) && !defined(__WXWINCE__) +#if defined(__VISUALC__) && __VISUALC__ >= 1400 + #define wxStrdupA _strdup +#elif !(defined(__MWERKS__) && defined(__WXMAC__)) && !defined(__WXWINCE__) /* use #define, not inline wrapper, as it is tested with #ifndef below */ #define wxStrdupA strdup #endif @@ -141,9 +145,17 @@ #define wxHAVE_TCHAR_SUPPORT #endif /* compilers with (good) TCHAR support */ -#ifdef __MWERKS__ - #define HAVE_WPRINTF -#endif +#if defined(__MWERKS__) + /* Metrowerks only has wide char support for OS X >= 10.3 */ + #if !defined(__DARWIN__) || \ + (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3) + #define wxHAVE_MWERKS_UNICODE + #endif + + #ifdef wxHAVE_MWERKS_UNICODE + #define HAVE_WPRINTF + #endif +#endif /* __MWERKS__ */ #ifdef wxHAVE_TCHAR_SUPPORT /* get TCHAR definition if we've got it */ @@ -176,6 +188,13 @@ /* 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) + #define __WCHAR_TYPE__ wxchar_t + #endif + /* GNU libc has __WCHAR_TYPE__ which requires special treatment, see */ /* comment below */ #if !defined(__WCHAR_TYPE__) || \ @@ -213,7 +232,8 @@ #if !wxUSE_UNICODE #define _T(x) x #else /* Unicode */ - #define _T(x) L ## x + /* 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) */ @@ -222,20 +242,20 @@ /* 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 __XFILE__(x) wxT(x) - #define __TFILE__ __XFILE__(__FILE__) + #define __TFILE__ wxAPPLY_T(__FILE__) #endif #ifndef __TDATE__ - #define __XDATE__(x) wxT(x) - #define __TDATE__ __XDATE__(__DATE__) + #define __TDATE__ wxAPPLY_T(__DATE__) #endif #ifndef __TTIME__ - #define __XTIME__(x) wxT(x) - #define __TTIME__ __XTIME__(__TIME__) + #define __TTIME__ wxAPPLY_T(__TIME__) #endif /* @@ -349,8 +369,14 @@ /* special case: not all TCHAR-aware compilers have those */ #if defined(__VISUALC__) || \ (defined(__BORLANDC__) && __BORLANDC__ >= 0x540) - #define wxVsnprintf_ _vsntprintf - #define wxSnprintf_ _sntprintf + /* + we can only use the system _vsntprintf() if we don't require the + Unix98 positional parameters support as it doesn't have it + */ + #if !wxUSE_PRINTF_POS_PARAMS + #define wxVsnprintf_ _vsntprintf + #define wxSnprintf_ _sntprintf + #endif #endif /* special case: these functions are missing under Win9x with Unicows so we */ @@ -389,8 +415,28 @@ #define wxMbstowcs mbstowcs #define wxWcstombs wcstombs #else /* !TCHAR-aware compilers */ + /* + There are 2 unrelated problems with these functions under Mac: + a) Metrowerks MSL CRT implements them strictly in C99 sense and + doesn't support (very common) extension of allowing to call + mbstowcs(NULL, ...) which makes it pretty useless as you can't + know the size of the needed buffer + b) OS X <= 10.2 declares and even defined these functions but + doesn't really implement them -- they always return an error + + So use our own replacements in both cases. + */ + #if defined(__MWERKS__) && defined(__MSL__) + #define wxNEED_WX_MBSTOWCS + #endif - #if !defined(__MWERKS__) && defined(__DARWIN__) && ( MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 ) + #ifdef __DARWIN__ + #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 + #define wxNEED_WX_MBSTOWCS + #endif + #endif + + #ifdef wxNEED_WX_MBSTOWCS /* even though they are defined and "implemented", they are bad and just stubs so we need our own - we need these even in ANSI builds!! */ WXDLLIMPEXP_BASE size_t wxMbstowcs (wchar_t *, const char *, size_t); @@ -400,9 +446,19 @@ #define wxWcstombs wcstombs #endif - /* No UNICODE in the c library except wchar_t typedef on mac OSX 10.2 and less - roll our own */ - #if !defined(__MWERKS__) && wxUSE_UNICODE && defined(__DARWIN__) && ( MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 ) - + /* + The system C library on Mac OS X 10.2 and below does not support + unicode: in other words all wide-character functions such as towupper et + al. do simply not exist so we need to provide our own in that context, + except for the wchar_t definition/typedef itself. + + We need to do this for both project builder and CodeWarrior as + the latter uses the system C library in Mach builds for wide character + support, which as mentioned does not exist on 10.2 and below. + */ + #if wxUSE_UNICODE && \ + defined(__DARWIN__) && \ + ( MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 ) /* we need everything! */ #define wxNEED_WX_STRING_H #define wxNEED_WX_CTYPE_H @@ -817,31 +873,34 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */ We define function with a trailing underscore here because the real one is a wrapper around it as explained below */ -#ifndef wxVsnprintf_ +#if !defined( wxVsnprintf_ ) && !wxUSE_PRINTF_POS_PARAMS #if wxUSE_UNICODE - #if defined(__MWERKS__) + #ifdef wxHAVE_MWERKS_UNICODE #define HAVE_WCSRTOMBS 1 #define HAVE_VSWPRINTF 1 - #endif + #endif /* Metrowerks with Unicode support */ #if defined(__WATCOMC__) #define wxVsnprintf_ _vsnwprintf #define wxSnprintf_ _snwprintf - #endif + #endif /* Watcom */ #if defined(HAVE__VSNWPRINTF) #define wxVsnprintf_ _vsnwprintf /* MinGW?MSVCRT has the wrong vswprintf */ - #elif defined(HAVE_VSWPRINTF) && !defined(__MINGW32__) + /* Mac OS X has a somehow buggy vswprintf */ + #elif defined(HAVE_VSWPRINTF) && !defined(__MINGW32__) && !defined(__DARWIN__) #define wxVsnprintf_ vswprintf #endif #else /* ASCII */ /* all versions of CodeWarrior supported by wxWidgets apparently have */ /* both snprintf() and vsnprintf() */ - #if defined(HAVE_SNPRINTF) || defined(__MWERKS__) || defined(__WATCOMC__) + #if defined(HAVE_SNPRINTF) \ + || defined(__MWERKS__) || defined(__WATCOMC__) #ifndef HAVE_BROKEN_SNPRINTF_DECL #define wxSnprintf_ snprintf #endif #endif - #if defined(HAVE_VSNPRINTF) || defined(__MWERKS__) || defined(__WATCOMC__) + #if defined(HAVE_VSNPRINTF) \ + || defined(__MWERKS__) || defined(__WATCOMC__) #if defined __cplusplus && defined HAVE_BROKEN_VSNPRINTF_DECL #define wxVsnprintf_ wx_fixed_vsnprintf #else @@ -849,7 +908,28 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */ #endif #endif #endif -#endif /* wxVsnprintf_ not defined yet */ +#endif /* wxVsnprintf_ not defined yet && !wxUSE_PRINTF_POS_PARAMS */ + +#if !defined( wxVsnprintf_ ) && wxUSE_PRINTF_POS_PARAMS + /* + The systems where vsnprintf() supports positionals should define + the HAVE_UNIX98_PRINTF symbol. + + On systems which don't (e.g. Windows) we are forced to use + our wxVsnprintf() implementation. + */ + #if defined(HAVE_UNIX98_PRINTF) + #if wxUSE_UNICODE + #define wxVsnprintf_ vswprintf + #else /* ASCII */ + #if defined __cplusplus && defined HAVE_BROKEN_VSNPRINTF_DECL + #define wxVsnprintf_ wx_fixed_vsnprintf + #else + #define wxVsnprintf_ vsnprintf + #endif + #endif + #endif +#endif // !defined( wxVsnprintf_ ) && wxUSE_PRINTF_POS_PARAMS #ifndef wxSnprintf_ /* no [v]snprintf(), cook our own */ @@ -1206,13 +1286,13 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); return szRet; } - #else //!wxUSE_UNICODE + #else /* !wxUSE_UNICODE */ # define wxTmemchr memchr # define wxTmemcmp memcmp # define wxTmemcpy memcpy # define wxTmemmove memmove # define wxTmemset memset - #endif + #endif /* wxUSE_UNICODE/!wxUSE_UNICODE */ #endif /*__cplusplus*/