+// wxVsnprintf() needs to use a *system* implementation of swnprintf()
+// in order to perform some internal tasks.
+// NB: we cannot just use wxSnprintf() because for some systems it maybe
+// implemented later in this file using wxVsnprintf() and that would
+// result in an endless recursion and thus in a stack overflow
+#if wxUSE_UNICODE
+ #if defined(__WINDOWS__) && !defined(HAVE_SWPRINTF)
+ // all compilers under Windows should have swprintf()
+ #define HAVE_SWPRINTF
+ #endif
+
+ // NB: MSVC 6 has only non-standard swprintf() declaration and while MSVC 7
+ // and 7.1 do have the standard one, it's completely broken unless
+ // /Zc:wchar_t is used while the other one works so use it instead, and
+ // only VC8 has a working standard-compliant swprintf()
+ #if defined(__WXWINCE__) || \
+ (defined(__VISUALC__) && __VISUALC__ < 1400) || \
+ defined(__GNUWIN32__) || \
+ defined(__BORLANDC__)
+ #ifndef HAVE_BROKEN_SWPRINTF_DECL
+ #define HAVE_BROKEN_SWPRINTF_DECL
+ #endif
+ #endif
+
+ // problem: on some systems swprintf takes the 'max' argument while on
+ // others it doesn't
+ #if defined(HAVE_BROKEN_SWPRINTF_DECL)
+ // like when using sprintf(), since 'max' is not used, wxVsnprintf()
+ // should always ensure that 'buff' is big enough for all common needs
+ #define system_sprintf(buff, max, flags, data) \
+ ::swprintf(buff, flags, data)
+
+ #define SYSTEM_SPRINTF_IS_UNSAFE
+ #else
+ #if !defined(HAVE_SWPRINTF)
+ #error wxVsnprintf() needs a system swprintf() implementation!
+ #endif
+
+ #define system_sprintf(buff, max, flags, data) \
+ ::swprintf(buff, max, flags, data)
+ #endif
+#else // !wxUSE_UNICODE
+ #if defined(__VISUALC__) || \
+ (defined(__BORLANDC__) && __BORLANDC__ >= 0x540)
+ #define system_sprintf(buff, max, flags, data) \
+ ::_snprintf(buff, max, flags, data)
+ #elif defined(HAVE_SNPRINTF)
+ #define system_sprintf(buff, max, flags, data) \
+ ::snprintf(buff, max, flags, data)
+ #else // NB: at least sprintf() should always be available
+ // since 'max' is not used in this case, wxVsnprintf() should always
+ // ensure that 'buff' is big enough for all common needs
+ // (see wxMAX_SVNPRINTF_FLAGBUFFER_LEN and wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN)
+ #define system_sprintf(buff, max, flags, data) \
+ ::sprintf(buff, flags, data)
+
+ #define SYSTEM_SPRINTF_IS_UNSAFE
+ #endif
+#endif // wxUSE_UNICODE/!wxUSE_UNICODE
+
+
+
+// the conversion specifiers accepted by wxVsnprintf_