From e66eb2dfae8805989fddd8ad5ffceb3333f5cfdc Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 28 Sep 2006 11:38:51 +0000 Subject: [PATCH] fixed Contains() to pass the unit test (didn't work for empty strings) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41487 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/string.cpp | 51 ++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/src/common/string.cpp b/src/common/string.cpp index 98a635bc49..5770917d5f 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -434,36 +434,47 @@ void wxStringBase::swap(wxStringBase& str) size_t wxStringBase::find(const wxStringBase& str, size_t nStart) const { + // deal with the special case of empty string first + const size_t nLen = length(); + const size_t nLenOther = str.length(); + + if ( !nLenOther ) + { + // empty string is a substring of anything + return 0; + } + + if ( !nLen ) + { + // the other string is non empty so can't be our substring + return npos; + } + wxASSERT( str.GetStringData()->IsValid() ); - wxASSERT( nStart <= length() ); + wxASSERT( nStart <= nLen ); - //anchor + const wxChar * const other = str.c_str(); + + // anchor const wxChar* p = (const wxChar*)wxTmemchr(c_str() + nStart, - str.c_str()[0], - length() - nStart); + *other, + nLen - nStart); - if(!p) + if ( !p ) return npos; - while(p - c_str() + str.length() <= length() && - wxTmemcmp(p, str.c_str(), str.length()) ) + while ( p - c_str() + nLenOther <= nLen && wxTmemcmp(p, other, nLenOther) ) { - //Previosly passed as the first argument to wxTmemchr, - //but C/C++ standard does not specify evaluation order - //of arguments to functions - - //http://embedded.com/showArticle.jhtml?articleID=9900607 - ++p; - - //anchor again - p = (const wxChar*)wxTmemchr(p, - str.c_str()[0], - length() - (p - c_str())); - - if(!p) + p++; + + // anchor again + p = (const wxChar*)wxTmemchr(p, *other, nLen - (p - c_str())); + + if ( !p ) return npos; } - return (p - c_str() + str.length() <= length()) ? p - c_str() : npos; + return p - c_str() + nLenOther <= nLen ? p - c_str() : npos; } size_t wxStringBase::find(const wxChar* sz, size_t nStart, size_t n) const -- 2.45.2