]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/string.cpp
wxListBox::FindString(): it's not an error if the string is not found, so
[wxWidgets.git] / src / common / string.cpp
index 7739a1b864cb51fa443fe2132481bce063e014ea..054074c259f0483fd0208e95d8331bcc033e6b5d 100644 (file)
@@ -32,9 +32,9 @@
 #endif
 
 #ifndef WX_PRECOMP
-#include "wx/defs.h"
-#include "wx/string.h"
-#include <wx/intl.h>
+  #include "wx/defs.h"
+  #include "wx/string.h"
+  #include "wx/intl.h"
 #endif
 
 #include <ctype.h>
 // static data
 // ----------------------------------------------------------------------------
 
-// for an empty string, GetStringData() will return this address
-static int g_strEmpty[] = { -1,     // ref count (locked)
-                             0,     // current length
-                             0,     // allocated memory
-                             0 };   // string data
+// for an empty string, GetStringData() will return this address: this
+// structure has the same layout as wxStringData and it's data() method will
+// return the empty string (dummy pointer)
+static const struct
+{
+  wxStringData data;
+  char dummy;
+} g_strEmpty = { {-1, 0, 0}, '\0' };
+
 // empty C style string: points to 'string data' byte of g_strEmpty
-extern const char *g_szNul = (const char *)(&g_strEmpty[3]);
+extern const char *g_szNul = &g_strEmpty.dummy;
 
 // ----------------------------------------------------------------------------
 // global functions
@@ -212,7 +216,7 @@ wxString::wxString(const void *pStart, const void *pEnd)
 wxString::wxString(const wchar_t *pwz)
 {
   // first get necessary size
-  size_t nLen = wcstombs(NULL, pwz, 0);
+  size_t nLen = wcstombs((char *) NULL, pwz, 0);
 
   // empty?
   if ( nLen != 0 ) {
@@ -437,43 +441,44 @@ void wxString::ConcatSelf(int nSrcLen, const char *pszSrcData)
 {
   STATISTICS_ADD(SummandLength, nSrcLen);
 
-  // concatenating an empty string is a NOP, but it happens quite rarely,
-  // so we don't waste our time checking for it
-  // if ( nSrcLen > 0 )
-  wxStringData *pData = GetStringData();
-  size_t nLen = pData->nDataLength;
-  size_t nNewLen = nLen + nSrcLen;
+  // concatenating an empty string is a NOP
+  if ( nSrcLen > 0 ) {
+    wxStringData *pData = GetStringData();
+    size_t nLen = pData->nDataLength;
+    size_t nNewLen = nLen + nSrcLen;
 
-  // alloc new buffer if current is too small
-  if ( pData->IsShared() ) {
-    STATISTICS_ADD(ConcatHit, 0);
+    // alloc new buffer if current is too small
+    if ( pData->IsShared() ) {
+      STATISTICS_ADD(ConcatHit, 0);
 
-    // we have to allocate another buffer
-    wxStringData* pOldData = GetStringData();
-    AllocBuffer(nNewLen);
-    memcpy(m_pchData, pOldData->data(), nLen*sizeof(char));
-    pOldData->Unlock();
-  }
-  else if ( nNewLen > pData->nAllocLength ) {
-    STATISTICS_ADD(ConcatHit, 0);
+      // we have to allocate another buffer
+      wxStringData* pOldData = GetStringData();
+      AllocBuffer(nNewLen);
+      memcpy(m_pchData, pOldData->data(), nLen*sizeof(char));
+      pOldData->Unlock();
+    }
+    else if ( nNewLen > pData->nAllocLength ) {
+      STATISTICS_ADD(ConcatHit, 0);
 
-    // we have to grow the buffer
-    Alloc(nNewLen);
-  }
-  else {
-    STATISTICS_ADD(ConcatHit, 1);
+      // we have to grow the buffer
+      Alloc(nNewLen);
+    }
+    else {
+      STATISTICS_ADD(ConcatHit, 1);
 
-    // the buffer is already big enough
-  }
+      // the buffer is already big enough
+    }
 
-  // should be enough space
-  wxASSERT( nNewLen <= GetStringData()->nAllocLength );
+    // should be enough space
+    wxASSERT( nNewLen <= GetStringData()->nAllocLength );
 
-  // fast concatenation - all is done in our buffer
-  memcpy(m_pchData + nLen, pszSrcData, nSrcLen*sizeof(char));
+    // fast concatenation - all is done in our buffer
+    memcpy(m_pchData + nLen, pszSrcData, nSrcLen*sizeof(char));
 
-  m_pchData[nNewLen] = '\0';              // put terminating '\0'
-  GetStringData()->nDataLength = nNewLen; // and fix the length
+    m_pchData[nNewLen] = '\0';              // put terminating '\0'
+    GetStringData()->nDataLength = nNewLen; // and fix the length
+  }
+  //else: the string to append was empty
 }
 
 /*
@@ -930,13 +935,15 @@ wxString& wxString::insert(size_t nPos, const wxString& str)
   wxASSERT( str.GetStringData()->IsValid() );
   wxASSERT( nPos <= Len() );
 
-  wxString strTmp;
-  char *pc = strTmp.GetWriteBuf(Len() + str.Len());
-  strncpy(pc, c_str(), nPos);
-  strcpy(pc + nPos, str);
-  strcpy(pc + nPos + str.Len(), c_str() + nPos);
-  strTmp.UngetWriteBuf();
-  *this = strTmp;
+  if ( !str.IsEmpty() ) {
+    wxString strTmp;
+    char *pc = strTmp.GetWriteBuf(Len() + str.Len());
+    strncpy(pc, c_str(), nPos);
+    strcpy(pc + nPos, str);
+    strcpy(pc + nPos + str.Len(), c_str() + nPos);
+    strTmp.UngetWriteBuf();
+    *this = strTmp;
+  }
 
   return *this;
 }
@@ -1075,7 +1082,7 @@ wxArrayString::wxArrayString()
 {
   m_nSize  =
   m_nCount = 0;
-  m_pItems = NULL;
+  m_pItems = (char **) NULL;
 }
 
 // copy ctor
@@ -1083,7 +1090,7 @@ wxArrayString::wxArrayString(const wxArrayString& src)
 {
   m_nSize  =
   m_nCount = 0;
-  m_pItems = NULL;
+  m_pItems = (char **) NULL;
 
   *this = src;
 }