]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/string.cpp
"wxGDIObject * => &" related changes (see mail to the list)
[wxWidgets.git] / src / common / string.cpp
index 15976eb5e148c872ec53e27c52ee6158825f1518..749a952b349fc86d1800d7e0ec6c0a4c95983096 100644 (file)
 #include <string.h>
 #include <stdlib.h>
 
+// 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 <wchar.h>    // 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
 // ----------------------------------------------------------------------------
@@ -102,22 +133,19 @@ extern const char *g_szNul = &g_strEmpty.dummy;
 #endif
 
 #ifdef __WXMSW__
-  #ifdef _MSC_VER
-    #define wxVsprintf     _vsnprintf
-  #endif
+    #ifdef _MSC_VER
+        #define wxVsprintf     _vsnprintf
+    #endif
 #else
-   #if defined ( HAVE_VSNPRINTF )
-     #define wxVsprintf       vsnprintf
-   #endif
+    #if defined ( HAVE_VSNPRINTF )
+        #define wxVsprintf       vsnprintf
+    #endif
 #endif
 
 #ifndef wxVsprintf
-  #ifdef HAVE_VPRINTF
+    // 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")
-  #else
-    #pragma error("No vsnprintf() or vsprintf() function available.")
-  #endif
 #endif
 
 NAMESPACE istream& operator>>(NAMESPACE istream& is, wxString& WXUNUSED(str))
@@ -941,22 +969,14 @@ int wxString::Printf(const char *pszFormat, ...)
 
 int wxString::PrintfV(const char* pszFormat, va_list argptr)
 {
-#if defined(__BORLANDC__) || defined(__GNUWIN32__)
-  static char s_szScratch[1024];
-
-  int iLen = vsprintf(s_szScratch, pszFormat, argptr);
-  AllocBeforeWrite(iLen);
-  strcpy(m_pchData, s_szScratch);
-
-  return iLen;
-#else
-
   // 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 {
@@ -986,7 +1006,6 @@ int wxString::PrintfV(const char* pszFormat, va_list argptr)
       free(buffer);
 
   return iLen;
-#endif
 }
 
 // ----------------------------------------------------------------------------