X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ac6178d747f7b3c50a61627c65d6a73ea6dcee5b..fdc62f44622dfcfea2f43910478fe5bb8ac0e938:/include/wx/wxchar.h diff --git a/include/wx/wxchar.h b/include/wx/wxchar.h index ad650d57e8..82e17f0d6f 100644 --- a/include/wx/wxchar.h +++ b/include/wx/wxchar.h @@ -1,11 +1,11 @@ /* * Name: wx/wxchar.h * Purpose: Declarations common to wx char/wchar_t usage (wide chars) - * Author: Joel Farley, Ove Kåven + * Author: Joel Farley, Ove K�en * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee * Created: 1998/06/12 * RCS-ID: $Id$ - * Copyright: (c) 1998-2002 Joel Farley, Ove Kåven, Robert Roebling, Ron Lee + * Copyright: (c) 1998-2002 Joel Farley, Ove K�en, Robert Roebling, Ron Lee * Licence: wxWindows licence */ @@ -232,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) */ @@ -241,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 /* @@ -368,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 */ @@ -866,7 +873,7 @@ 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 #ifdef wxHAVE_MWERKS_UNICODE #define HAVE_WCSRTOMBS 1 @@ -879,26 +886,61 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */ #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 + #define wxVsnprintf_ vsnprintf + #endif + #endif + #endif +#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 + #else + // the only exception on Windows is VC++ 8.0; it provides a new family + // of printf() functions with positional parameter support which should + // behave mostly identic to our wxVsnprintf() implementation + #if defined(__VISUALC__) && __VISUALC__ >= 1400 + #if wxUSE_UNICODE + #define wxVsnprintf_ _vsprintf_p + #else + #define wxVsnprintf_ _vswprintf_p + #endif + #endif #endif -#endif /* wxVsnprintf_ not defined yet */ +#endif // !defined( wxVsnprintf_ ) && wxUSE_PRINTF_POS_PARAMS #ifndef wxSnprintf_ /* no [v]snprintf(), cook our own */