]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/string.h
Richtext interface fixes and additions for Phoenix
[wxWidgets.git] / include / wx / string.h
index 4591e1b07516e11265d23a9c8422aad45e85d25e..53ae8907d8b0185320b00251412fc71c9ecb392e 100644 (file)
@@ -154,7 +154,7 @@ inline int Stricmp(const char *psz1, const char *psz2)
   } while ( c1 && (c1 == c2) );
 
   return c1 - c2;
   } while ( c1 && (c1 == c2) );
 
   return c1 - c2;
-#elif defined(__VISUALC__) || ( defined(__MWERKS__) && defined(__INTEL__) )
+#elif defined(__VISUALC__)
   return _stricmp(psz1, psz2);
 #elif defined(__SC__)
   return _stricmp(psz1, psz2);
   return _stricmp(psz1, psz2);
 #elif defined(__SC__)
   return _stricmp(psz1, psz2);
@@ -172,14 +172,6 @@ inline int Stricmp(const char *psz1, const char *psz2)
       defined(HAVE_STRCASECMP_IN_STRINGS_H) || \
       defined(__GNUWIN32__)
   return strcasecmp(psz1, psz2);
       defined(HAVE_STRCASECMP_IN_STRINGS_H) || \
       defined(__GNUWIN32__)
   return strcasecmp(psz1, psz2);
-#elif defined(__MWERKS__) && !defined(__INTEL__)
-  register char c1, c2;
-  do {
-    c1 = tolower(*psz1++);
-    c2 = tolower(*psz2++);
-  } while ( c1 && (c1 == c2) );
-
-  return c1 - c2;
 #else
   // almost all compilers/libraries provide this function (unfortunately under
   // different names), that's why we don't implement our own which will surely
 #else
   // almost all compilers/libraries provide this function (unfortunately under
   // different names), that's why we don't implement our own which will surely
@@ -1150,6 +1142,25 @@ public:
   #undef WX_STR_ITERATOR_TAG
   #undef WX_STR_ITERATOR_IMPL
 
   #undef WX_STR_ITERATOR_TAG
   #undef WX_STR_ITERATOR_IMPL
 
+  // This method is mostly used by wxWidgets itself and return the offset of
+  // the given iterator in bytes relative to the start of the buffer
+  // representing the current string contents in the current locale encoding.
+  //
+  // It is inefficient as it involves converting part of the string to this
+  // encoding (and also unsafe as it simply returns 0 if the conversion fails)
+  // and so should be avoided if possible, wx itself only uses it to implement
+  // backwards-compatible API.
+  ptrdiff_t IterOffsetInMBStr(const const_iterator& i) const
+  {
+      const wxString str(begin(), i);
+
+      // This is logically equivalent to strlen(str.mb_str()) but avoids
+      // actually converting the string to multibyte and just computes the
+      // length that it would have after conversion.
+      size_t ofs = wxConvLibc.FromWChar(NULL, 0, str.wc_str(), str.length());
+      return ofs == wxCONV_FAILED ? 0 : static_cast<ptrdiff_t>(ofs);
+  }
+
   friend class iterator;
   friend class const_iterator;
 
   friend class iterator;
   friend class const_iterator;
 
@@ -2669,7 +2680,7 @@ public:
 
   wxString& assign(const char *sz, size_t n)
   {
 
   wxString& assign(const char *sz, size_t n)
   {
-      wxSTRING_SET_CACHED_LENGTH(n);
+      wxSTRING_INVALIDATE_CACHE();
 
       SubstrBufFromMB str(ImplStr(sz, n));
       m_impl.assign(str.data, str.len);
 
       SubstrBufFromMB str(ImplStr(sz, n));
       m_impl.assign(str.data, str.len);
@@ -3485,7 +3496,7 @@ private:
 
   void DoUngetWriteBuf(size_t nLen)
   {
 
   void DoUngetWriteBuf(size_t nLen)
   {
-      wxSTRING_SET_CACHED_LENGTH(nLen);
+      wxSTRING_INVALIDATE_CACHE();
 
       m_impl.DoUngetWriteBuf(nLen);
   }
 
       m_impl.DoUngetWriteBuf(nLen);
   }