X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bd362275b853cc0308bbde6a60bb2525d659f709..f6669958924c3c3833e2932b65598b06073d2e65:/include/wx/string.h diff --git a/include/wx/string.h b/include/wx/string.h index 843002256a..53ae8907d8 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -69,7 +69,7 @@ // it would have to be re-tested and probably corrected // CS: under OSX release builds the string destructor/cache cleanup sometimes // crashes, disable until we find the true reason or a better workaround -#if wxUSE_UNICODE_UTF8 && !defined(__WXMSW__) && !defined(__WXOSX__) +#if wxUSE_UNICODE_UTF8 && !defined(__WINDOWS__) && !defined(__WXOSX__) #define wxUSE_STRING_POS_CACHE 1 #else #define wxUSE_STRING_POS_CACHE 0 @@ -154,7 +154,7 @@ inline int Stricmp(const char *psz1, const char *psz2) } 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); @@ -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); -#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 @@ -1150,6 +1142,25 @@ public: #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(ofs); + } + friend class iterator; friend class const_iterator; @@ -2613,9 +2624,21 @@ public: return *this; } + // This is a non-standard-compliant overload taking the first "len" + // characters of the source string. wxString& assign(const wxString& str, size_t len) { +#if wxUSE_STRING_POS_CACHE + // It is legal to pass len > str.length() to wxStringImpl::assign() but + // by restricting it here we save some work for that function so it's not + // really less efficient and, at the same time, ensure that we don't + // cache invalid length. + const size_t lenSrc = str.length(); + if ( len > lenSrc ) + len = lenSrc; + wxSTRING_SET_CACHED_LENGTH(len); +#endif // wxUSE_STRING_POS_CACHE m_impl.assign(str.m_impl, 0, str.LenToImpl(len)); @@ -2657,7 +2680,7 @@ public: 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); @@ -3473,7 +3496,7 @@ private: void DoUngetWriteBuf(size_t nLen) { - wxSTRING_SET_CACHED_LENGTH(nLen); + wxSTRING_INVALIDATE_CACHE(); m_impl.DoUngetWriteBuf(nLen); }