fix problems with using incorrect vswprintf() for mingw32/VC6 when wxUSE_PRINTF_POS_PARAMS==1, try to simplify/better organize all wxVsnprintf_()-related code
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41637 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -153,7 +153,9 @@
|
||||
#endif
|
||||
|
||||
#ifdef wxHAVE_MWERKS_UNICODE
|
||||
#define HAVE_WPRINTF
|
||||
#define HAVE_WPRINTF 1
|
||||
#define HAVE_WCSRTOMBS 1
|
||||
#define HAVE_VSWPRINTF 1
|
||||
#endif
|
||||
#endif /* __MWERKS__ */
|
||||
|
||||
@@ -366,19 +368,6 @@
|
||||
#define wxVsscanf _vstscanf
|
||||
#define wxVsprintf _vstprintf
|
||||
|
||||
/* special case: not all TCHAR-aware compilers have those */
|
||||
#if defined(__VISUALC__) || \
|
||||
(defined(__BORLANDC__) && __BORLANDC__ >= 0x540)
|
||||
/*
|
||||
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 */
|
||||
/* have to implement them ourselves */
|
||||
#if wxUSE_UNICODE_MSLU
|
||||
@@ -446,12 +435,12 @@
|
||||
#define wxWcstombs wcstombs
|
||||
#endif
|
||||
|
||||
/*
|
||||
/*
|
||||
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.
|
||||
@@ -865,73 +854,40 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */
|
||||
#endif
|
||||
|
||||
/*
|
||||
First of all, we always want to define safe snprintf() function to be used
|
||||
instead of sprintf(). Some compilers already have it (or rather vsnprintf()
|
||||
which we really need...), otherwise we implement it using our own printf()
|
||||
code.
|
||||
MinGW MSVCRT has non-standard vswprintf() (for MSVC compatibility
|
||||
presumably) and normally _vsnwprintf() is used instead
|
||||
|
||||
We define function with a trailing underscore here because the real one is a
|
||||
wrapper around it as explained below
|
||||
vswprintf() under (early versions of) OS X is buggy
|
||||
*/
|
||||
#if !defined( wxVsnprintf_ ) && !wxUSE_PRINTF_POS_PARAMS
|
||||
#if wxUSE_UNICODE
|
||||
#ifdef wxHAVE_MWERKS_UNICODE
|
||||
#define HAVE_WCSRTOMBS 1
|
||||
#define HAVE_VSWPRINTF 1
|
||||
#endif /* Metrowerks with Unicode support */
|
||||
#if defined(__WATCOMC__)
|
||||
#define wxVsnprintf_ _vsnwprintf
|
||||
#define wxSnprintf_ _snwprintf
|
||||
#endif /* Watcom */
|
||||
#if defined(HAVE__VSNWPRINTF)
|
||||
#define wxVsnprintf_ _vsnwprintf
|
||||
/* MinGW?MSVCRT has the wrong vswprintf */
|
||||
/* 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__)
|
||||
#ifndef HAVE_BROKEN_SNPRINTF_DECL
|
||||
#define wxSnprintf_ snprintf
|
||||
#endif
|
||||
#endif
|
||||
#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(HAVE_VSWPRINTF) && (defined(__MINGW32__) || defined(__DARWIN__))
|
||||
#undef HAVE_VSWPRINTF
|
||||
#endif
|
||||
|
||||
#if !defined( wxVsnprintf_ ) && wxUSE_PRINTF_POS_PARAMS
|
||||
#if wxUSE_PRINTF_POS_PARAMS
|
||||
/*
|
||||
The systems where vsnprintf() supports positionals should define
|
||||
the HAVE_UNIX98_PRINTF symbol.
|
||||
The systems where vsnprintf() supports positional parameters 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
|
||||
#ifdef HAVE_VSWPRINTF
|
||||
#define wxVsnprintf_ vswprintf
|
||||
#endif
|
||||
#else /* ASCII */
|
||||
#if defined __cplusplus && defined HAVE_BROKEN_VSNPRINTF_DECL
|
||||
#ifdef 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
|
||||
#else /* !HAVE_UNIX98_PRINTF */
|
||||
/*
|
||||
The only compiler with positional parameters support under Windows
|
||||
is VC++ 8.0 which provides a new xxprintf_p() functions family
|
||||
*/
|
||||
#if defined(__VISUALC__) && __VISUALC__ >= 1400
|
||||
#if wxUSE_UNICODE
|
||||
#define wxVsnprintf_ _vswprintf_p
|
||||
@@ -939,17 +895,69 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */
|
||||
#define wxVsnprintf_ _vsprintf_p
|
||||
#endif
|
||||
#endif
|
||||
#endif /* HAVE_UNIX98_PRINTF/!HAVE_UNIX98_PRINTF */
|
||||
#else /* !wxUSE_PRINTF_POS_PARAMS */
|
||||
/*
|
||||
We always want to define safe snprintf() function to be used instead of
|
||||
sprintf(). Some compilers already have it (or rather vsnprintf() which
|
||||
we really need...), otherwise we implement it using our own printf()
|
||||
code.
|
||||
|
||||
We define function with a trailing underscore here because the real one
|
||||
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
|
||||
#define wxSnprintf_ _sntprintf
|
||||
#endif
|
||||
#endif
|
||||
#endif // !defined( wxVsnprintf_ ) && wxUSE_PRINTF_POS_PARAMS
|
||||
|
||||
/* 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
|
||||
#define wxSnprintf_ _snwprintf
|
||||
#endif
|
||||
#else /* ASCII */
|
||||
/*
|
||||
All versions of CodeWarrior supported by wxWidgets apparently
|
||||
have both snprintf() and vsnprintf()
|
||||
*/
|
||||
#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__)
|
||||
#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 wxSnprintf_
|
||||
/* no [v]snprintf(), cook our own */
|
||||
WXDLLIMPEXP_BASE int wxSnprintf_(wxChar *buf, size_t len, const wxChar *format,
|
||||
...) ATTRIBUTE_PRINTF_3;
|
||||
WXDLLIMPEXP_BASE int
|
||||
wxSnprintf_(wxChar *buf, size_t len, const wxChar *format, ...) ATTRIBUTE_PRINTF_3;
|
||||
#endif
|
||||
#ifndef wxVsnprintf_
|
||||
WXDLLIMPEXP_BASE int wxVsnprintf_(wxChar *buf, size_t len, const wxChar *format,
|
||||
va_list argptr);
|
||||
WXDLLIMPEXP_BASE int
|
||||
wxVsnprintf_(wxChar *buf, size_t len, const wxChar *format, va_list argptr);
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user