]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/string.cpp
CW Win32 support
[wxWidgets.git] / src / common / string.cpp
index e4ff09bf0f02605e9a9ac1ef3b14329870a5eeb8..77026933c0abc56f22083cd9bd768ebad0d80d8e 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))
@@ -871,8 +899,13 @@ wxString& wxString::Pad(size_t nCount, char chPad, bool bFromRight)
 // truncate the string
 wxString& wxString::Truncate(size_t uiLen)
 {
-  *(m_pchData + uiLen) = '\0';
-  GetStringData()->nDataLength = uiLen;
+  if ( uiLen < Len() ) {
+    CopyBeforeWrite();
+
+    *(m_pchData + uiLen) = '\0';
+    GetStringData()->nDataLength = uiLen;
+  }
+  //else: nothing to do, string is already short enough
 
   return *this;
 }
@@ -941,22 +974,14 @@ int wxString::Printf(const char *pszFormat, ...)
 
 int wxString::PrintfV(const char* pszFormat, va_list argptr)
 {
-#ifdef __BORLANDC__
-  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 +1011,6 @@ int wxString::PrintfV(const char* pszFormat, va_list argptr)
       free(buffer);
 
   return iLen;
-#endif
 }
 
 // ----------------------------------------------------------------------------