]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/string.cpp
added wxWS_EX_VALIDATE_RECURSIVELY
[wxWidgets.git] / src / common / string.cpp
index 1a86ca3d1b599461da5fc336612a60a7143b6b03..4304d78ff73fdb07f45a8fa23674f79435a5a40c 100644 (file)
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-  #pragma implementation "string.h"
-#endif
-
 /*
  * About ref counting:
  *  1) all empty strings use g_strEmpty, nRefs = -1 (set in Init())
 #include <string.h>
 #include <stdlib.h>
 
+#ifndef __WXMSW__
+#include <errno.h>
+#endif
+
 #ifdef __SALFORDC__
   #include <clib.h>
 #endif
@@ -319,7 +319,7 @@ bool wxStringBase::AllocBeforeWrite(size_t nLen)
   // it doesn't really matter what the string length is as it's going to be
   // overwritten later but, for extra safety, set it to 0 for now as we may
   // have some junk in m_pchData
-  pData->nDataLength = 0;
+  GetStringData()->nDataLength = 0;
 
   return true;
 }
@@ -1792,50 +1792,54 @@ wxString wxString::FormatV(const wxChar *pszFormat, va_list argptr)
 
 int wxString::Printf(const wxChar *pszFormat, ...)
 {
-  va_list argptr;
-  va_start(argptr, pszFormat);
+    va_list argptr;
+    va_start(argptr, pszFormat);
 
-  int iLen = PrintfV(pszFormat, argptr);
+    int iLen = PrintfV(pszFormat, argptr);
 
-  va_end(argptr);
+    va_end(argptr);
 
-  return iLen;
+    return iLen;
 }
 
 int wxString::PrintfV(const wxChar* pszFormat, va_list argptr)
 {
     int size = 1024;
-    int len;
 
     for ( ;; )
     {
+        wxStringBuffer tmp(*this, size + 1);
+        wxChar* buf = tmp;
+
+        if ( !buf )
         {
-            wxStringBuffer tmp(*this, size + 1);
-            wxChar* buf = tmp;
+            // out of memory
+            return -1;
+        }
 
-            if ( !buf )
-            {
-                // out of memory
-                return -1;
-            }
+        // wxVsnprintf() may modify the original arg pointer, so pass it
+        // only a copy
+        va_list argptrcopy;
+        wxVaCopy(argptrcopy, argptr);
+        int len = wxVsnprintf(buf, size, pszFormat, argptrcopy);
+        va_end(argptrcopy);
 
-            // wxVsnprintf() may modify the original arg pointer, so pass it
-            // only a copy
-            va_list argptrcopy;
-            wxVaCopy(argptrcopy, argptr);
-            len = wxVsnprintf(buf, size, pszFormat, argptrcopy);
-            va_end(argptrcopy);
-
-            // some implementations of vsnprintf() don't NUL terminate
-            // the string if there is not enough space for it so
-            // always do it manually
-            buf[size] = _T('\0');
-        }
+        // some implementations of vsnprintf() don't NUL terminate
+        // the string if there is not enough space for it so
+        // always do it manually
+        buf[size] = _T('\0');
 
         // vsnprintf() may return either -1 (traditional Unix behaviour) or the
         // total number of characters which would have been written if the
         // buffer were large enough
-        if ( len >= 0 && len <= size )
+        // also, it may return an errno may be something like EILSEQ,
+        // in which case we need to break out
+        if ( (len >= 0 && len <= size)
+        // No EOVERFLOW on Windows nor Palm 6.0 nor OpenVMS nor MacOS (not X)
+#if !defined(__WXMSW__) && !defined(__WXPALMOS__) && !defined( __VMS ) && !(defined(__WXMAC__) && !defined(__WXMAC_OSX__))
+            || errno != EOVERFLOW
+#endif
+            )
         {
             // ok, there was enough space
             break;
@@ -2028,6 +2032,24 @@ int wxString::sprintf(const wxChar *pszFormat, ...)
 
 #include "wx/arrstr.h"
 
+wxArrayString::wxArrayString(size_t sz, const wxChar** a)
+{
+#if !wxUSE_STL
+    Init(false);
+#endif
+    for (size_t i=0; i < sz; i++)
+        Add(a[i]);
+}
+
+wxArrayString::wxArrayString(size_t sz, const wxString* a)
+{
+#if !wxUSE_STL
+    Init(false);
+#endif
+    for (size_t i=0; i < sz; i++)
+        Add(a[i]);
+}
+
 #if !wxUSE_STL
 
 // size increment = min(50% of current size, ARRAY_MAXSIZE_INCREMENT)