1. made CRT wrappers definitions indepenent of wxUSE_UNICODE: both ANSI and Unicode variants are now defined
2. split wxcrt.h into wxcrtbase.h with lowlevel compiler-specific definitions and wxcrt.h with ANSI- and Unicode-compatible wx wrappers git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46390 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -25,24 +25,6 @@
|
||||
/* Required for wxPrintf() etc */
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifdef wxHAVE_TCHAR_SUPPORT
|
||||
#define wxCRT_Fprintf _ftprintf
|
||||
#define wxCRT_Printf _tprintf
|
||||
#define wxCRT_Vfprintf _vftprintf
|
||||
#define wxCRT_Vprintf _vtprintf
|
||||
#define wxCRT_Vsprintf _vstprintf
|
||||
#else /* !TCHAR-aware compilers */
|
||||
|
||||
#if !wxUSE_UNICODE /* ASCII */
|
||||
#define wxCRT_Fprintf fprintf
|
||||
#define wxCRT_Printf printf
|
||||
#define wxCRT_Vfprintf vfprintf
|
||||
#define wxCRT_Vprintf vprintf
|
||||
#define wxCRT_Vsprintf vsprintf
|
||||
#endif /* ASCII */
|
||||
#endif /* TCHAR-aware compilers/the others */
|
||||
|
||||
|
||||
/* printf() family saga */
|
||||
|
||||
/*
|
||||
@@ -64,7 +46,7 @@
|
||||
#else
|
||||
extern
|
||||
#endif
|
||||
WXDLLIMPEXP_BASE int snprintf(char *str, size_t size, const char *format, ...);
|
||||
int snprintf(char *str, size_t size, const char *format, ...);
|
||||
#endif /* !HAVE_SNPRINTF_DECL */
|
||||
|
||||
/* Wrapper for vsnprintf if it's 3rd parameter is non-const. Note: the
|
||||
@@ -94,16 +76,13 @@
|
||||
our wxVsnprintf() implementation.
|
||||
*/
|
||||
#if defined(HAVE_UNIX98_PRINTF)
|
||||
#if wxUSE_UNICODE
|
||||
#ifdef HAVE_VSWPRINTF
|
||||
#define wxVsnprintf_ vswprintf
|
||||
#endif
|
||||
#else /* ASCII */
|
||||
#ifdef HAVE_BROKEN_VSNPRINTF_DECL
|
||||
#define wxVsnprintf_ wx_fixed_vsnprintf
|
||||
#else
|
||||
#define wxVsnprintf_ vsnprintf
|
||||
#endif
|
||||
#ifdef HAVE_VSWPRINTF
|
||||
#define wxCRT_VsnprintfW_ vswprintf
|
||||
#endif
|
||||
#ifdef HAVE_BROKEN_VSNPRINTF_DECL
|
||||
#define wxCRT_VsnprintfA wx_fixed_vsnprintf
|
||||
#else
|
||||
#define wxCRT_VsnprintfA vsnprintf
|
||||
#endif
|
||||
#else /* !HAVE_UNIX98_PRINTF */
|
||||
/*
|
||||
@@ -113,11 +92,8 @@
|
||||
main release and does not have the printf_p functions.
|
||||
*/
|
||||
#if defined _MSC_FULL_VER && _MSC_FULL_VER >= 140050727 && !defined __WXWINCE__
|
||||
#if wxUSE_UNICODE
|
||||
#define wxVsnprintf_ _vswprintf_p
|
||||
#else
|
||||
#define wxVsnprintf_ _vsprintf_p
|
||||
#endif
|
||||
#define wxCRT_VsnprintfA _vsprintf_p
|
||||
#define wxCRT_VsnprintfW_ _vswprintf_p
|
||||
#endif
|
||||
#endif /* HAVE_UNIX98_PRINTF/!HAVE_UNIX98_PRINTF */
|
||||
#else /* !wxUSE_PRINTF_POS_PARAMS */
|
||||
@@ -131,60 +107,71 @@
|
||||
is a wrapper around it as explained below
|
||||
*/
|
||||
|
||||
/* first deal with TCHAR-aware compilers which have _vsntprintf */
|
||||
#ifndef wxVsnprintf_
|
||||
#if defined(__VISUALC__) || \
|
||||
(defined(__BORLANDC__) && __BORLANDC__ >= 0x540)
|
||||
#define wxVsnprintf_ _vsntprintf
|
||||
#if defined(__VISUALC__) || \
|
||||
(defined(__BORLANDC__) && __BORLANDC__ >= 0x540)
|
||||
#define wxCRT_VsnprintfA _vsnprintf
|
||||
#define wxCRT_VsnprintfW_ _vsnwprintf
|
||||
#else
|
||||
#if defined(HAVE__VSNWPRINTF)
|
||||
#define wxCRT_VsnprintfW_ _vsnwprintf
|
||||
#elif defined(HAVE_VSWPRINTF)
|
||||
#define wxCRT_VsnprintfW_ vswprintf
|
||||
#elif defined(__WATCOMC__)
|
||||
#define wxCRT_VsnprintfW_ _vsnwprintf
|
||||
#endif
|
||||
|
||||
/*
|
||||
All versions of CodeWarrior supported by wxWidgets apparently
|
||||
have both snprintf() and vsnprintf()
|
||||
*/
|
||||
#if defined(HAVE_VSNPRINTF) \
|
||||
|| defined(__MWERKS__) || defined(__WATCOMC__)
|
||||
#ifdef HAVE_BROKEN_VSNPRINTF_DECL
|
||||
#define wxCRT_VsnprintfA wx_fixed_vsnprintf
|
||||
#else
|
||||
#define wxCRT_VsnprintfA vsnprintf
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* if this didn't work, define it separately for Unicode and ANSI builds */
|
||||
#ifndef wxVsnprintf_
|
||||
#if wxUSE_UNICODE
|
||||
#if defined(HAVE__VSNWPRINTF)
|
||||
#define wxVsnprintf_ _vsnwprintf
|
||||
#elif defined(HAVE_VSWPRINTF)
|
||||
#define wxVsnprintf_ vswprintf
|
||||
#elif defined(__WATCOMC__)
|
||||
#define wxVsnprintf_ _vsnwprintf
|
||||
#endif
|
||||
#else /* ASCII */
|
||||
/*
|
||||
All versions of CodeWarrior supported by wxWidgets apparently
|
||||
have both snprintf() and vsnprintf()
|
||||
*/
|
||||
#if defined(HAVE_VSNPRINTF) \
|
||||
|| defined(__MWERKS__) || defined(__WATCOMC__)
|
||||
#ifdef HAVE_BROKEN_VSNPRINTF_DECL
|
||||
#define wxVsnprintf_ wx_fixed_vsnprintf
|
||||
#else
|
||||
#define wxVsnprintf_ vsnprintf
|
||||
#endif
|
||||
#endif
|
||||
#endif /* Unicode/ASCII */
|
||||
#endif /* wxVsnprintf_ */
|
||||
#endif /* wxUSE_PRINTF_POS_PARAMS/!wxUSE_PRINTF_POS_PARAMS */
|
||||
|
||||
#ifndef wxVsnprintf_
|
||||
#ifndef wxCRT_VsnprintfW_
|
||||
/* no (suitable) vsnprintf(), cook our own */
|
||||
WXDLLIMPEXP_BASE int
|
||||
wxVsnprintf_(wxChar *buf, size_t len, const wxChar *format, va_list argptr);
|
||||
|
||||
#define wxUSE_WXVSNPRINTF 1
|
||||
wxCRT_VsnprintfW_(wchar_t *buf, size_t len, const wchar_t *format, va_list argptr);
|
||||
#define wxUSE_WXVSNPRINTFW 1
|
||||
#else
|
||||
#define wxUSE_WXVSNPRINTF 0
|
||||
#define wxUSE_WXVSNPRINTFW 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
In Unicode mode we need to have all standard functions such as wprintf() and
|
||||
so on but not all systems have them so use our own implementations in this
|
||||
case.
|
||||
*/
|
||||
#if wxUSE_UNICODE && !defined(wxHAVE_TCHAR_SUPPORT) && !defined(HAVE_WPRINTF)
|
||||
#define wxNEED_WPRINTF
|
||||
#ifndef wxCRT_VsnprintfA
|
||||
/* no (suitable) vsnprintf(), cook our own */
|
||||
WXDLLIMPEXP_BASE int
|
||||
wxCRT_VsnprintfA(char *buf, size_t len, const char *format, va_list argptr);
|
||||
#define wxUSE_WXVSNPRINTFA 1
|
||||
#else
|
||||
#define wxUSE_WXVSNPRINTFA 0
|
||||
#endif
|
||||
|
||||
// for wxString code, define wxUSE_WXVSNPRINTF to indicate that wx
|
||||
// implementation is used no matter what (in UTF-8 build, either *A or *W
|
||||
// version may be called):
|
||||
#if !wxUSE_UNICODE
|
||||
#define wxUSE_WXVSNPRINTF wxUSE_WXVSNPRINTFA
|
||||
#elif wxUSE_UNICODE_WCHAR
|
||||
#define wxUSE_WXVSNPRINTF wxUSE_WXVSNPRINTFW
|
||||
#elif wxUSE_UTF8_LOCALE_ONLY
|
||||
#define wxUSE_WXVSNPRINTF wxUSE_WXVSNPRINTFA
|
||||
#else // UTF-8 under any locale
|
||||
#define wxUSE_WXVSNPRINTF (wxUSE_WXVSNPRINTFA && wxUSE_WXVSNPRINTFW)
|
||||
#endif
|
||||
|
||||
#define wxCRT_FprintfA fprintf
|
||||
#define wxCRT_PrintfA printf
|
||||
#define wxCRT_VfprintfA vfprintf
|
||||
#define wxCRT_VprintfA vprintf
|
||||
#define wxCRT_VsprintfA vsprintf
|
||||
|
||||
/*
|
||||
More Unicode complications: although both ANSI C and C++ define a number of
|
||||
wide character functions such as wprintf(), not all environments have them.
|
||||
@@ -197,6 +184,32 @@
|
||||
if we have wprintf() we still must wrap it in a non trivial wxPrintf().
|
||||
|
||||
*/
|
||||
#ifndef __WINDOWS__
|
||||
#define wxNEED_PRINTF_CONVERSION
|
||||
#endif
|
||||
|
||||
// FIXME-UTF8: format conversion should be moved outside of wxCRT_* and to the
|
||||
// vararg templates; after then, wxNEED_PRINTF_CONVERSION should
|
||||
// be removed and this code simplified
|
||||
#ifndef wxNEED_PRINTF_CONVERSION
|
||||
#ifdef wxHAVE_TCHAR_SUPPORT
|
||||
#define wxCRT_FprintfW fwprintf
|
||||
#define wxCRT_PrintfW wprintf
|
||||
#define wxCRT_VfprintfW vfwprintf
|
||||
#define wxCRT_VprintfW vwprintf
|
||||
#define wxCRT_VsprintfW vswprintf
|
||||
#endif
|
||||
#endif // !defined(wxNEED_PRINTF_CONVERSION)
|
||||
|
||||
/*
|
||||
In Unicode mode we need to have all standard functions such as wprintf() and
|
||||
so on but not all systems have them so use our own implementations in this
|
||||
case.
|
||||
*/
|
||||
#if wxUSE_UNICODE && !defined(wxHAVE_TCHAR_SUPPORT) && !defined(HAVE_WPRINTF)
|
||||
#define wxNEED_WPRINTF
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(wxNEED_PRINTF_CONVERSION) || defined(wxNEED_WPRINTF)
|
||||
/*
|
||||
@@ -204,23 +217,23 @@
|
||||
we don't have them at all or because they don't have the semantics we
|
||||
need
|
||||
*/
|
||||
int wxCRT_Printf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_1;
|
||||
int wxCRT_Fprintf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2;
|
||||
int wxCRT_Vfprintf( FILE *stream, const wxChar *format, va_list ap );
|
||||
int wxCRT_Vprintf( const wxChar *format, va_list ap );
|
||||
int wxCRT_Vsprintf( wxChar *str, const wxChar *format, va_list ap );
|
||||
int wxCRT_PrintfW( const wchar_t *format, ... ) ATTRIBUTE_PRINTF_1;
|
||||
int wxCRT_FprintfW( FILE *stream, const wchar_t *format, ... ) ATTRIBUTE_PRINTF_2;
|
||||
int wxCRT_VfprintfW( FILE *stream, const wchar_t *format, va_list ap );
|
||||
int wxCRT_VprintfW( const wchar_t *format, va_list ap );
|
||||
int wxCRT_VsprintfW( wchar_t *str, const wchar_t *format, va_list ap );
|
||||
#endif /* wxNEED_PRINTF_CONVERSION */
|
||||
|
||||
/* these 2 can be simply mapped to the versions with underscore at the end */
|
||||
/* if we don't have to do the conversion */
|
||||
/*
|
||||
However, if we don't have any vswprintf() at all we don't need to redefine
|
||||
anything as our own wxVsnprintf_() already behaves as needed.
|
||||
anything as our own wxCRT_VsnprintfW_() already behaves as needed.
|
||||
*/
|
||||
#if defined(wxNEED_PRINTF_CONVERSION) && defined(wxVsnprintf_)
|
||||
int wxCRT_Vsnprintf( wxChar *str, size_t size, const wxChar *format, va_list ap );
|
||||
#if defined(wxNEED_PRINTF_CONVERSION) && defined(wxCRT_VsnprintfW_)
|
||||
int wxCRT_VsnprintfW( wchar_t *str, size_t size, const wchar_t *format, va_list ap );
|
||||
#else
|
||||
#define wxCRT_Vsnprintf wxVsnprintf_
|
||||
#define wxCRT_VsnprintfW wxCRT_VsnprintfW_
|
||||
#endif
|
||||
|
||||
|
||||
@@ -265,40 +278,52 @@
|
||||
// we'll also need wxArgNormalizer<T> specializations for char,
|
||||
// wchar_t, wxUniChar and wxUniCharRef to handle this correctly
|
||||
|
||||
// FIXME-UTF8: remove this
|
||||
#if wxUSE_UNICODE
|
||||
#define wxCRT_PrintfNative wxCRT_PrintfW
|
||||
#define wxCRT_FprintfNative wxCRT_FprintfW
|
||||
#else
|
||||
#define wxCRT_PrintfNative wxCRT_PrintfA
|
||||
#define wxCRT_FprintfNative wxCRT_FprintfA
|
||||
#endif
|
||||
|
||||
WX_DEFINE_VARARG_FUNC(int, wxPrintf, 1, (const wxFormatString&),
|
||||
wxCRT_Printf, printf)
|
||||
wxCRT_PrintfNative, wxCRT_PrintfA)
|
||||
WX_DEFINE_VARARG_FUNC(int, wxFprintf, 2, (FILE*, const wxFormatString&),
|
||||
wxCRT_Fprintf, fprintf)
|
||||
wxCRT_FprintfNative, wxCRT_FprintfA)
|
||||
|
||||
// va_list versions of printf functions simply forward to the respective
|
||||
// CRT function; note that they assume that va_list was created using
|
||||
// wxArgNormalizer<T>!
|
||||
#if wxUSE_UNICODE_UTF8
|
||||
#if wxUSE_UTF8_LOCALE_ONLY
|
||||
#define WX_VARARG_VFOO_IMPL(args, implWchar, implUtf8) \
|
||||
return implUtf8 args
|
||||
#define WX_VARARG_VFOO_IMPL(args, implW, implA) \
|
||||
return implA args
|
||||
#else
|
||||
#define WX_VARARG_VFOO_IMPL(args, implWchar, implUtf8) \
|
||||
if ( wxLocaleIsUtf8 ) return implUtf8 args; \
|
||||
else return implWchar args
|
||||
#define WX_VARARG_VFOO_IMPL(args, implW, implA) \
|
||||
if ( wxLocaleIsUtf8 ) return implA args; \
|
||||
else return implW args
|
||||
#endif
|
||||
#else // wxUSE_UNICODE_WCHAR / ANSI
|
||||
#define WX_VARARG_VFOO_IMPL(args, implWchar, implUtf8) \
|
||||
return implWchar args
|
||||
#elif wxUSE_UNICODE_WCHAR
|
||||
#define WX_VARARG_VFOO_IMPL(args, implW, implA) \
|
||||
return implW args
|
||||
#else // ANSI
|
||||
#define WX_VARARG_VFOO_IMPL(args, implW, implA) \
|
||||
return implA args
|
||||
#endif
|
||||
|
||||
inline int
|
||||
wxVprintf(const wxString& format, va_list ap)
|
||||
{
|
||||
WX_VARARG_VFOO_IMPL((wxFormatString(format), ap),
|
||||
wxCRT_Vprintf, vprintf);
|
||||
wxCRT_VprintfW, wxCRT_VprintfA);
|
||||
}
|
||||
|
||||
inline int
|
||||
wxVfprintf(FILE *f, const wxString& format, va_list ap)
|
||||
{
|
||||
WX_VARARG_VFOO_IMPL((f, wxFormatString(format), ap),
|
||||
wxCRT_Vfprintf, vfprintf);
|
||||
wxCRT_VfprintfW, wxCRT_VfprintfA);
|
||||
}
|
||||
|
||||
#undef WX_VARARG_VFOO_IMPL
|
||||
|
Reference in New Issue
Block a user