]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/string.cpp
no message
[wxWidgets.git] / src / common / string.cpp
index 84b2bb55496af39407b1ea0110f430b432ca8478..e00c8180332fec29d9a58bf666b4290d8722a063 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,33 @@ 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)
+#ifndef __SC__
+    #pragma message("Using sprintf() because no snprintf()-like function defined")
+#endif
+#endif
+
 // ----------------------------------------------------------------------------
 // global functions
 // ----------------------------------------------------------------------------
@@ -101,6 +134,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))
 {
@@ -299,6 +347,10 @@ void wxString::AllocBeforeWrite(size_t nLen)
     pData->Unlock();
     AllocBuffer(nLen);
   }
+  else {
+    // update the string length
+    pData->nDataLength = nLen;
+  }
 
   wxASSERT( !GetStringData()->IsShared() );  // we must be the only owner
 }
@@ -853,8 +905,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;
 }
@@ -923,26 +980,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 {
@@ -1036,6 +1081,19 @@ bool wxString::Matches(const char *pszMask) const
   return *pszTxt == '\0';
 }
 
+// Count the number of chars
+int wxString::Freq(char ch) const
+{
+    int count = 0;
+    int len = Len();
+    for (int i = 0; i < len; i++)
+    {
+        if (GetChar(i) == ch)
+            count ++;
+    }
+    return count;
+}
+
 // ---------------------------------------------------------------------------
 // standard C++ library string functions
 // ---------------------------------------------------------------------------
@@ -1077,6 +1135,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() );
@@ -1085,6 +1145,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
 {