X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7be07660b4dec326ec99f84edac9b862ac34d224..463c1fa1a916b1a262023601f3913fb12c4bcc8f:/src/common/string.cpp diff --git a/src/common/string.cpp b/src/common/string.cpp index 84b2bb5549..749a952b34 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -41,6 +41,12 @@ #include #include +// This probably isn't right, what should it be Vadim? +// Otherwise we end up with no wxVsprintf defined. +#ifdef __WXMOTIF__ +#define HAVE_VPRINTF +#endif + #ifdef wxUSE_WCSRTOMBS #include // for wcsrtombs(), see comments where it's used #endif // GNU @@ -78,6 +84,31 @@ static const struct // empty C style string: points to 'string data' byte of g_strEmpty extern const char *g_szNul = &g_strEmpty.dummy; +// ---------------------------------------------------------------------------- +// conditional compilation +// ---------------------------------------------------------------------------- + +// we want to find out if the current platform supports vsnprintf()-like +// function: for Unix this is done with configure, for Windows we test the +// compiler explicitly. +#ifdef __WXMSW__ + #ifdef _MSC_VER + #define wxVsprintf _vsnprintf + #endif +#else // !Windows + #ifdef HAVE_VSNPRINTF + #define wxVsprintf vsnprintf + #endif +#endif // Windows/!Windows + +#ifndef wxVsprintf + // in this case we'll use vsprintf() (which is ANSI and thus should be + // always available), but it's unsafe because it doesn't check for buffer + // size - so give a warning + #define wxVsprintf(buffer,len,format,argptr) vsprintf(buffer,format, argptr) + #pragma message("Using sprintf() because no snprintf()-like function defined") +#endif + // ---------------------------------------------------------------------------- // global functions // ---------------------------------------------------------------------------- @@ -101,6 +132,21 @@ extern const char *g_szNul = &g_strEmpty.dummy; #define NAMESPACE std:: #endif +#ifdef __WXMSW__ + #ifdef _MSC_VER + #define wxVsprintf _vsnprintf + #endif +#else + #if defined ( HAVE_VSNPRINTF ) + #define wxVsprintf vsnprintf + #endif +#endif + +#ifndef wxVsprintf + // vsprintf() is ANSI so we can always use it, but it's unsafe! + #define wxVsprintf(buffer,len,format,argptr) vsprintf(buffer,format, argptr) + #pragma message("Using sprintf() because no snprintf()-like function defined") +#endif NAMESPACE istream& operator>>(NAMESPACE istream& is, wxString& WXUNUSED(str)) { @@ -923,26 +969,14 @@ int wxString::Printf(const char *pszFormat, ...) int wxString::PrintfV(const char* pszFormat, va_list argptr) { -#ifdef __WXMSW__ - #ifdef _MSC_VER - #define wxVsprintf _vsnprintf - #endif -#else // guess that any Unix has snprintf() - feel free to insert additional - // platform/compiler tests here if this is not the case for you - #define wxVsprintf vsnprintf -#endif - -#ifndef wxVsprintf - #pragma message("Using sprintf() because no snprintf()-like function defined") - #define wxVsprintf vsprintf -#endif - // static buffer to avoid dynamic memory allocation each time static char s_szScratch[1024]; + // NB: wxVsprintf() may return either less than the buffer size or -1 if there + // is not enough place depending on implementation int iLen = wxVsprintf(s_szScratch, WXSIZEOF(s_szScratch), pszFormat, argptr); char *buffer; - if ( (size_t)iLen < WXSIZEOF(s_szScratch) ) { + if ( iLen < (int)WXSIZEOF(s_szScratch) ) { buffer = s_szScratch; } else {