]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/string.cpp
Added #include to get FIONBIO on Solaris 2.6
[wxWidgets.git] / src / common / string.cpp
index 407d143e3c3ec2f337722b8dcf9e04966cd0ba78..05dce3179ba7984c279628cbd326afe6a0ecf7b6 100644 (file)
@@ -34,6 +34,7 @@
 #ifndef WX_PRECOMP
 #include "wx/defs.h"
 #include "wx/string.h"
+#include <wx/intl.h>
 #endif
 
 #include <ctype.h>
@@ -46,7 +47,8 @@
 
 // allocating extra space for each string consumes more memory but speeds up
 // the concatenation operations (nLen is the current string's length)
-#define EXTRA_ALLOC       16
+// NB: EXTRA_ALLOC must be >= 0!
+#define EXTRA_ALLOC       (19 - nLen % 16)
 
 // ---------------------------------------------------------------------------
 // static class variables definition
@@ -133,10 +135,10 @@ NAMESPACE istream& operator>>(NAMESPACE istream& is, wxString& WXUNUSED(str))
    ~Averager() 
    { printf("wxString: average %s = %f\n", m_sz, ((float)m_nTotal)/m_nCount); }
 
-    void Add(uint n) { m_nTotal += n; m_nCount++; }
+    void Add(size_t n) { m_nTotal += n; m_nCount++; }
 
   private:
-    uint m_nCount, m_nTotal;
+    size_t m_nCount, m_nTotal;
     const char *m_sz;
   } g_averageLength("allocation size"),
     g_averageSummandLength("summand length"),
@@ -210,7 +212,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 ) {
@@ -253,7 +255,7 @@ void wxString::CopyBeforeWrite()
 
   if ( pData->IsShared() ) {
     pData->Unlock();                // memory not freed because shared
-    uint nLen = pData->nDataLength;
+    size_t nLen = pData->nDataLength;
     AllocBuffer(nLen);
     memcpy(m_pchData, pData->data(), nLen*sizeof(char));
   }
@@ -278,7 +280,7 @@ void wxString::AllocBeforeWrite(size_t nLen)
 }
 
 // allocate enough memory for nLen characters
-void wxString::Alloc(uint nLen)
+void wxString::Alloc(size_t nLen)
 {
   wxStringData *pData = GetStringData();
   if ( pData->nAllocLength <= nLen ) {
@@ -295,7 +297,7 @@ void wxString::Alloc(uint nLen)
     }
     else if ( pData->IsShared() ) {
       pData->Unlock();                // memory not freed because shared
-      uint nOldLen = pData->nDataLength;
+      size_t nOldLen = pData->nDataLength;
       AllocBuffer(nLen);
       memcpy(m_pchData, pData->data(), nOldLen*sizeof(char));
     }
@@ -336,7 +338,7 @@ void wxString::Shrink()
 }
 
 // get the pointer to writable buffer of (at least) nLen bytes
-char *wxString::GetWriteBuf(uint nLen)
+char *wxString::GetWriteBuf(size_t nLen)
 {
   AllocBeforeWrite(nLen);
 
@@ -439,8 +441,8 @@ void wxString::ConcatSelf(int nSrcLen, const char *pszSrcData)
   // so we don't waste our time checking for it
   // if ( nSrcLen > 0 )
   wxStringData *pData = GetStringData();
-  uint nLen = pData->nDataLength;
-  uint nNewLen = nLen + nSrcLen;
+  size_t nLen = pData->nDataLength;
+  size_t nNewLen = nLen + nSrcLen;
 
   // alloc new buffer if current is too small
   if ( pData->IsShared() ) {
@@ -646,11 +648,11 @@ wxString wxString::After(char ch) const
 }
 
 // replace first (or all) occurences of some substring with another one
-uint wxString::Replace(const char *szOld, const char *szNew, bool bReplaceAll)
+size_t wxString::Replace(const char *szOld, const char *szNew, bool bReplaceAll)
 {
-  uint uiCount = 0;   // count of replacements made
+  size_t uiCount = 0;   // count of replacements made
 
-  uint uiOldLen = Strlen(szOld);
+  size_t uiOldLen = Strlen(szOld);
 
   wxString strTemp;
   const char *pCurrent = m_pchData;
@@ -884,7 +886,7 @@ bool wxString::Matches(const char *pszMask) const
             return TRUE;
 
           // are there any other metacharacters in the mask?
-          uint uiLenMask;
+          size_t uiLenMask;
           const char *pEndMask = strpbrk(pszMask, "*?");
 
           if ( pEndMask != NULL ) {
@@ -928,13 +930,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;
 }
@@ -1073,7 +1077,7 @@ wxArrayString::wxArrayString()
 {
   m_nSize  =
   m_nCount = 0;
-  m_pItems = NULL;
+  m_pItems = (char **) NULL;
 }
 
 // copy ctor
@@ -1081,7 +1085,7 @@ wxArrayString::wxArrayString(const wxArrayString& src)
 {
   m_nSize  =
   m_nCount = 0;
-  m_pItems = NULL;
+  m_pItems = (char **) NULL;
 
   *this = src;
 }
@@ -1089,15 +1093,15 @@ wxArrayString::wxArrayString(const wxArrayString& src)
 // assignment operator
 wxArrayString& wxArrayString::operator=(const wxArrayString& src)
 {
-  Clear();
+  if ( m_nSize > 0 )
+    Clear();
 
-  m_nSize = 0;
   if ( src.m_nCount > ARRAY_DEFAULT_INITIAL_SIZE )
     Alloc(src.m_nCount);
 
   // we can't just copy the pointers here because otherwise we would share
   // the strings with another array
-  for ( uint n = 0; n < src.m_nCount; n++ )
+  for ( size_t n = 0; n < src.m_nCount; n++ )
     Add(src[n]);
 
   if ( m_nCount != 0 )
@@ -1133,7 +1137,7 @@ void wxArrayString::Grow()
       memcpy(pNew, m_pItems, m_nCount*sizeof(char *));
 
       // delete old memory (but do not release the strings!)
-      DELETEA(m_pItems);
+      wxDELETEA(m_pItems);
 
       m_pItems = pNew;
     }
@@ -1163,8 +1167,7 @@ void wxArrayString::Clear()
   m_nSize  =
   m_nCount = 0;
 
-  DELETEA(m_pItems);
-  m_pItems = NULL;
+  wxDELETEA(m_pItems);
 }
 
 // dtor
@@ -1172,7 +1175,7 @@ wxArrayString::~wxArrayString()
 {
   Free();
 
-  DELETEA(m_pItems);
+  wxDELETEA(m_pItems);
 }
 
 // pre-allocates memory (frees the previous data!)
@@ -1183,7 +1186,7 @@ void wxArrayString::Alloc(size_t nSize)
   // only if old buffer was not big enough
   if ( nSize > m_nSize ) {
     Free();
-    DELETEA(m_pItems);
+    wxDELETEA(m_pItems);
     m_pItems = new char *[nSize];
     m_nSize  = nSize;
   }
@@ -1196,7 +1199,7 @@ int wxArrayString::Index(const char *sz, bool bCase, bool bFromEnd) const
 {
   if ( bFromEnd ) {
     if ( m_nCount > 0 ) {
-      uint ui = m_nCount;
+      size_t ui = m_nCount;
       do {
         if ( STRING(m_pItems[--ui])->IsSameAs(sz, bCase) )
           return ui;
@@ -1205,7 +1208,7 @@ int wxArrayString::Index(const char *sz, bool bCase, bool bFromEnd) const
     }
   }
   else {
-    for( uint ui = 0; ui < m_nCount; ui++ ) {
+    for( size_t ui = 0; ui < m_nCount; ui++ ) {
       if( STRING(m_pItems[ui])->IsSameAs(sz, bCase) )
         return ui;
     }
@@ -1231,7 +1234,7 @@ void wxArrayString::Insert(const wxString& str, size_t nIndex)
 {
   wxASSERT( str.GetStringData()->IsValid() );
 
-  wxCHECK_RET( nIndex <= m_nCount, "bad index in wxArrayString::Insert" );
+  wxCHECK_RET( nIndex <= m_nCount, ("bad index in wxArrayString::Insert") );
 
   Grow();
 
@@ -1247,7 +1250,7 @@ void wxArrayString::Insert(const wxString& str, size_t nIndex)
 // removes item from array (by index)
 void wxArrayString::Remove(size_t nIndex)
 {
-  wxCHECK_RET( nIndex <= m_nCount, "bad index in wxArrayString::Remove" );
+  wxCHECK_RET( nIndex <= m_nCount, _("bad index in wxArrayString::Remove") );
 
   // release our lock
   Item(nIndex).GetStringData()->Unlock();
@@ -1263,9 +1266,9 @@ void wxArrayString::Remove(const char *sz)
   int iIndex = Index(sz);
 
   wxCHECK_RET( iIndex != NOT_FOUND,
-               "removing inexistent element in wxArrayString::Remove" );
+               _("removing inexistent element in wxArrayString::Remove") );
 
-  Remove((size_t)iIndex);
+  Remove(iIndex);
 }
 
 // sort array elements using passed comparaison function