From 3affcd078b1dc6d92cd06f18b5cc4c41a33161ea Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 6 May 2006 17:27:52 +0000 Subject: [PATCH] added wxString::EndsWith() (patch 1483049) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39069 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + docs/latex/wx/wxstring.tex | 17 +++++++++++++++-- include/wx/string.h | 10 +++++++--- src/common/string.cpp | 21 +++++++++++++++++++++ tests/strings/strings.cpp | 26 +++++++++++++++++++++----- 5 files changed, 65 insertions(+), 10 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 2fca925a3a..8ea62d91a0 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -72,6 +72,7 @@ All: - Fixed bug where wxDateTime::Now() would sometimes return an incorrect value the first time it was called. - Added wxString::rbegin() and rend() +- Added wxString::EndsWith() All (GUI): diff --git a/docs/latex/wx/wxstring.tex b/docs/latex/wx/wxstring.tex index e6f1334c4f..40305dd472 100644 --- a/docs/latex/wx/wxstring.tex +++ b/docs/latex/wx/wxstring.tex @@ -124,7 +124,8 @@ length of the prefix then. \helpref{CmpNoCase}{wxstringcmpnocase}\\ \helpref{IsSameAs}{wxstringissameas}\\ \helpref{Matches}{wxstringmatches}\\ -\helpref{StartsWith}{wxstringstartswith} +\helpref{StartsWith}{wxstringstartswith}\\ +\helpref{EndsWith}{wxstringendswith} \membersection{Substring extraction}\label{substringextractioninwxstring} @@ -140,7 +141,9 @@ substring. \helpref{BeforeLast}{wxstringbeforelast}\\ \helpref{AfterFirst}{wxstringafterfirst}\\ \helpref{AfterLast}{wxstringafterlast}\\ -\helpref{StartsWith}{wxstringstartswith} +\helpref{StartsWith}{wxstringstartswith}\\ +\helpref{EndsWith}{wxstringendswith} + \membersection{Case conversion}\label{caseconversioninwxstring} @@ -967,6 +970,16 @@ of the string (i.e. after the prefix) into {\it rest} string if it is not {\tt NULL}. Otherwise, the function returns {\tt false} and doesn't modify the {\it rest}. +\membersection{wxString::EndsWith}\label{wxstringendswith} + +\constfunc{bool}{EndsWith}{\param{const wxChar }{*suffix}, \param{wxString }{*rest = NULL}} + +This function can be used to test if the string ends with the specified +{\it suffix}. If it does, the function will return {\tt true} and put the +beginning of the string before the suffix into {\it rest} string if it is not +{\tt NULL}. Otherwise, the function returns {\tt false} and doesn't +modify the {\it rest}. + \membersection{wxString::Strip}\label{wxstringstrip} \begin{verbatim} diff --git a/include/wx/string.h b/include/wx/string.h index 37ad4b835b..c2202864cb 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -1056,10 +1056,14 @@ public: wxString operator()(size_t start, size_t len) const { return Mid(start, len); } - // check that the string starts with prefix and return the rest of the - // string in the provided pointer if it is not NULL, otherwise return - // false + // check if the string starts with the given prefix and return the rest + // of the string in the provided pointer if it is not NULL; otherwise + // return false bool StartsWith(const wxChar *prefix, wxString *rest = NULL) const; + // check if the string ends with the given suffix and return the + // beginning of the string before the suffix in the provided pointer if + // it is not NULL; otherwise return false + bool EndsWith(const wxChar *suffix, wxString *rest = NULL) const; // get first nCount characters wxString Left(size_t nCount) const; diff --git a/src/common/string.cpp b/src/common/string.cpp index b4735f8d07..04969d3246 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -1394,6 +1394,27 @@ bool wxString::StartsWith(const wxChar *prefix, wxString *rest) const return true; } + +// check that the string ends with suffix and return the rest of it in the +// provided pointer if it is not NULL, otherwise return false +bool wxString::EndsWith(const wxChar *suffix, wxString *rest) const +{ + wxASSERT_MSG( suffix, _T("invalid parameter in wxString::EndssWith") ); + + int start = length() - wxStrlen(suffix); + if ( start < 0 || wxStrcmp(c_str() + start, suffix) != 0 ) + return false; + + if ( rest ) + { + // put the rest of the string into provided pointer + rest->assign(*this, 0, start); + } + + return true; +} + + // extract nCount last (rightmost) characters wxString wxString::Right(size_t nCount) const { diff --git a/tests/strings/strings.cpp b/tests/strings/strings.cpp index 66cbfb6389..25b8a59574 100644 --- a/tests/strings/strings.cpp +++ b/tests/strings/strings.cpp @@ -165,11 +165,10 @@ void StringTestCase::Extraction() wxString rest; - #define TEST_STARTS_WITH( prefix , correct_rest, result ) \ - CPPUNIT_ASSERT( \ - ( s.StartsWith( prefix, &rest ) == result ) && \ - ( ( result == false ) || ( wxStrcmp( correct_rest , rest ) == 0 ) ) \ - ) + #define TEST_STARTS_WITH(prefix, correct_rest, result) \ + CPPUNIT_ASSERT_EQUAL(result, s.StartsWith(prefix, &rest)); \ + if ( result ) \ + CPPUNIT_ASSERT_EQUAL(wxString(correct_rest), rest) TEST_STARTS_WITH( _T("Hello"), _T(", world!"), true ); TEST_STARTS_WITH( _T("Hello, "), _T("world!"), true ); @@ -180,6 +179,23 @@ void StringTestCase::Extraction() TEST_STARTS_WITH( _T("Hi"), _T(""), false ); #undef TEST_STARTS_WITH + + #define TEST_ENDS_WITH(suffix, correct_rest, result) \ + CPPUNIT_ASSERT_EQUAL(result, s.EndsWith(suffix, &rest)); \ + if ( result ) \ + CPPUNIT_ASSERT_EQUAL(wxString(correct_rest), rest) + + TEST_ENDS_WITH( _T(""), _T("Hello, world!"), true ); + TEST_ENDS_WITH( _T("!"), _T("Hello, world"), true ); + TEST_ENDS_WITH( _T(", world!"), _T("Hello"), true ); + TEST_ENDS_WITH( _T("ello, world!"), _T("H"), true ); + TEST_ENDS_WITH( _T("Hello, world!"), _T(""), true ); + TEST_ENDS_WITH( _T("very long string"), _T(""), false ); + TEST_ENDS_WITH( _T("?"), _T(""), false ); + TEST_ENDS_WITH( _T("Hello, world"), _T(""), false ); + TEST_ENDS_WITH( _T("Gello, world!"), _T(""), false ); + + #undef TEST_ENDS_WITH } void StringTestCase::Find() -- 2.45.2