]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/string.cpp
fix assert when adding an entry to an already full file history (closes #10118)
[wxWidgets.git] / src / common / string.cpp
index 827099f0a611bd82f7329006aeca04923e3d8ea8..04a606a3c563b308768b9678347732562de43ac4 100644 (file)
@@ -60,6 +60,12 @@ const size_t wxString::npos = (size_t) -1;
 
 #if wxUSE_STRING_POS_CACHE
 
+#ifdef wxHAS_COMPILER_TLS
+
+wxTLS_TYPE(wxString::Cache) wxString::ms_cache;
+
+#else // !wxHAS_COMPILER_TLS
+
 struct wxStrCacheInitializer
 {
     wxStrCacheInitializer()
@@ -70,15 +76,23 @@ struct wxStrCacheInitializer
     }
 };
 
+/*
+wxString::Cache& wxString::GetCache()
+{
+    static wxTLS_TYPE(Cache) s_cache;
+
+    return wxTLS_VALUE(s_cache);
+}
+*/
+
 static wxStrCacheInitializer gs_stringCacheInit;
 
+#endif // wxHAS_COMPILER_TLS/!wxHAS_COMPILER_TLS
+
 // gdb seems to be unable to display thread-local variables correctly, at least
 // not my 6.4.98 version under amd64, so provide this debugging helper to do it
 #ifdef __WXDEBUG__
 
-namespace
-{
-
 struct wxStrCacheDumper
 {
     static void ShowAll()
@@ -100,8 +114,6 @@ struct wxStrCacheDumper
     }
 };
 
-} // anonymous namespace
-
 void wxDumpStrCache() { wxStrCacheDumper::ShowAll(); }
 
 #endif // __WXDEBUG__
@@ -110,12 +122,9 @@ void wxDumpStrCache() { wxStrCacheDumper::ShowAll(); }
 
 wxString::CacheStats wxString::ms_cacheStats;
 
-namespace
-{
-
-struct ShowCacheStats
+struct wxStrCacheStatsDumper
 {
-    ~ShowCacheStats()
+    ~wxStrCacheStatsDumper()
     {
         const wxString::CacheStats& stats = wxString::ms_cacheStats;
 
@@ -140,9 +149,9 @@ struct ShowCacheStats
                    stats.lentot, 100.*float(stats.lenhits)/stats.lentot);
         }
     }
-} s_showCacheStats;
+};
 
-} // anonymous namespace
+static wxStrCacheStatsDumper s_showCacheStats;
 
 #endif // wxPROFILE_STRING_CACHE
 
@@ -159,7 +168,13 @@ struct ShowCacheStats
 wxSTD ostream& operator<<(wxSTD ostream& os, const wxCStrData& str)
 {
 #if wxUSE_UNICODE && !wxUSE_UNICODE_UTF8
-    return os << (const char *)str.AsCharBuf();
+    const wxCharBuffer buf(str.AsCharBuf());
+    if ( !buf )
+        os.clear(wxSTD ios_base::failbit);
+    else
+        os << buf.data();
+
+    return os;
 #else
     return os << str.AsInternal();
 #endif
@@ -1267,7 +1282,7 @@ wxString wxString::Right(size_t nCount) const
   return dest;
 }
 
-// get all characters after the last occurence of ch
+// get all characters after the last occurrence of ch
 // (returns the whole string if ch not found)
 wxString wxString::AfterLast(wxUniChar ch) const
 {
@@ -1276,7 +1291,7 @@ wxString wxString::AfterLast(wxUniChar ch) const
   if ( iPos == wxNOT_FOUND )
     str = *this;
   else
-    str = wx_str() + iPos + 1;
+    str.assign(*this, iPos + 1, npos);
 
   return str;
 }
@@ -1294,16 +1309,17 @@ wxString wxString::Left(size_t nCount) const
   return dest;
 }
 
-// get all characters before the first occurence of ch
+// get all characters before the first occurrence of ch
 // (returns the whole string if ch not found)
 wxString wxString::BeforeFirst(wxUniChar ch) const
 {
   int iPos = Find(ch);
-  if ( iPos == wxNOT_FOUND ) iPos = length();
+  if ( iPos == wxNOT_FOUND )
+      iPos = length();
   return wxString(*this, 0, iPos);
 }
 
-/// get all characters before the last occurence of ch
+/// get all characters before the last occurrence of ch
 /// (returns empty string if ch not found)
 wxString wxString::BeforeLast(wxUniChar ch) const
 {
@@ -1315,19 +1331,19 @@ wxString wxString::BeforeLast(wxUniChar ch) const
   return str;
 }
 
-/// get all characters after the first occurence of ch
+/// get all characters after the first occurrence of ch
 /// (returns empty string if ch not found)
 wxString wxString::AfterFirst(wxUniChar ch) const
 {
   wxString str;
   int iPos = Find(ch);
   if ( iPos != wxNOT_FOUND )
-    str = wx_str() + iPos + 1;
+      str.assign(*this, iPos + 1, npos);
 
   return str;
 }
 
-// replace first (or all) occurences of some substring with another one
+// replace first (or all) occurrences of some substring with another one
 size_t wxString::Replace(const wxString& strOld,
                          const wxString& strNew, bool bReplaceAll)
 {
@@ -2114,10 +2130,14 @@ wxUTF8StringBufferLength::~wxUTF8StringBufferLength()
 // wxCharBufferType<T>
 // ----------------------------------------------------------------------------
 
+#ifndef __VMS_BROKEN_TEMPLATES
 template<>
+#endif
 wxCharTypeBuffer<char>::Data
 wxCharTypeBuffer<char>::NullData(NULL);
 
+#ifndef __VMS_BROKEN_TEMPLATES
 template<>
+#endif
 wxCharTypeBuffer<wchar_t>::Data
 wxCharTypeBuffer<wchar_t>::NullData(NULL);