]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/string.cpp
BC++/16-bit support now working, but without resource system
[wxWidgets.git] / src / common / string.cpp
index c4fdd0bb186d06e06ed891401abcdccf85168074..dcd371e0d25f7f975e8137a30708583a069bcd1b 100644 (file)
@@ -84,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
 // ----------------------------------------------------------------------------
@@ -874,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;
 }
@@ -947,9 +977,11 @@ int wxString::PrintfV(const char* pszFormat, va_list argptr)
   // 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 {
@@ -1084,6 +1116,8 @@ size_t wxString::find(const char* sz, size_t nStart, size_t n) const
 }
 #endif
 
+// Gives a duplicate symbol (presumably a case-insensitivity problem)
+#if !defined(__BORLANDC__)
 size_t wxString::find(char ch, size_t nStart) const
 {
   wxASSERT( nStart <= Len() );
@@ -1092,6 +1126,7 @@ size_t wxString::find(char ch, size_t nStart) const
 
   return p == NULL ? npos : p - c_str();
 }
+#endif
 
 size_t wxString::rfind(const wxString& str, size_t nStart) const
 {