- /* vsnprintf() */
- #if defined(HAVE_VSNPRINTF) || defined(__MWERKS__) || defined(__WATCOMC__)
- /* assume we have snprintf() too if we have vsnprintf() */
- #define wxVsnprintf_ vsnprintf
- #define wxSnprintf_ snprintf
+ /* 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( 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_ _vswprintf_p
+ #else
+ #define wxVsnprintf_ _vsprintf_p
+ #endif