[Libreoffice-commits] core.git: 2 commits - i18npool/qa i18npool/source
Eike Rathke
erack at redhat.com
Sun Apr 24 14:43:05 UTC 2016
i18npool/qa/cppunit/test_textsearch.cxx | 23 ++++++++++++++++++
i18npool/source/search/textsearch.cxx | 40 +++++++++++++++++++++++++-------
2 files changed, 55 insertions(+), 8 deletions(-)
New commits:
commit 5291e4826a9512bd6d8d3b03199c49222a83e972
Author: Eike Rathke <erack at redhat.com>
Date: Sun Apr 24 16:40:33 2016 +0200
unit test for tdf#99468
Change-Id: I833ad2779d0eda6f5183b2dd062dffaa410a7937
diff --git a/i18npool/qa/cppunit/test_textsearch.cxx b/i18npool/qa/cppunit/test_textsearch.cxx
index 893bed5..c4e98c9 100644
--- a/i18npool/qa/cppunit/test_textsearch.cxx
+++ b/i18npool/qa/cppunit/test_textsearch.cxx
@@ -251,6 +251,29 @@ void TestTextSearch::testWildcardSearch()
aRes = m_xSearch2->searchBackward( aText, aText.getLength(), 0);
CPPUNIT_ASSERT(aRes.subRegExpressions == 1);
CPPUNIT_ASSERT((aRes.startOffset[0] == 5) && (aRes.endOffset[0] == 0));
+
+ aText = "123123";
+ aOptions.searchString = "*2?";
+ m_xSearch2->setOptions2( aOptions );
+ // match first "123", [0,3)
+ aRes = m_xSearch2->searchForward( aText, 0, aText.getLength());
+ CPPUNIT_ASSERT(aRes.subRegExpressions == 1);
+ CPPUNIT_ASSERT((aRes.startOffset[0] == 0) && (aRes.endOffset[0] == 3));
+ // match "123123", (6,0] Yes this looks odd, but it is as searching "?2*" forward.
+ aRes = m_xSearch2->searchBackward( aText, aText.getLength(), 0);
+ CPPUNIT_ASSERT(aRes.subRegExpressions == 1);
+ CPPUNIT_ASSERT((aRes.startOffset[0] == 6) && (aRes.endOffset[0] == 0));
+
+ aOptions.searchFlag |= util::SearchFlags::WILD_MATCH_SELECTION;
+ m_xSearch2->setOptions2( aOptions );
+ // match "123123", [0,6) with greedy '*'
+ aRes = m_xSearch2->searchForward( aText, 0, aText.getLength());
+ CPPUNIT_ASSERT(aRes.subRegExpressions == 1);
+ CPPUNIT_ASSERT((aRes.startOffset[0] == 0) && (aRes.endOffset[0] == 6));
+ // match "123123", (6,0]
+ aRes = m_xSearch2->searchBackward( aText, aText.getLength(), 0);
+ CPPUNIT_ASSERT(aRes.subRegExpressions == 1);
+ CPPUNIT_ASSERT((aRes.startOffset[0] == 6) && (aRes.endOffset[0] == 0));
}
void TestTextSearch::setUp()
commit ffbe1b43bff59aae506446a5f408bba8ba9315c2
Author: Eike Rathke <erack at redhat.com>
Date: Sun Apr 24 16:16:51 2016 +0200
Resolves: tdf#99468 do greedy '*' match if substring match is not allowed
Change-Id: I89ac29b7e8c2e8c567e85a5025dbc1f50050465d
diff --git a/i18npool/source/search/textsearch.cxx b/i18npool/source/search/textsearch.cxx
index 07cceb0..5791ff6 100644
--- a/i18npool/source/search/textsearch.cxx
+++ b/i18npool/source/search/textsearch.cxx
@@ -1188,7 +1188,7 @@ SearchResult TextSearch::WildcardSrchFrwrd( const OUString& searchStr, sal_Int32
rPattern.iterateCodePoints( &nAfterFakePattern);
}
- sal_Int32 nString = nStartPos, nPat = -1, nStr = -1;
+ sal_Int32 nString = nStartPos, nPat = -1, nStr = -1, nLastAsterisk = -1;
sal_uInt32 cPatternAfterAsterisk = 0;
bool bEscaped = false, bEscapedAfterAsterisk = false;
@@ -1215,11 +1215,21 @@ SearchResult TextSearch::WildcardSrchFrwrd( const OUString& searchStr, sal_Int32
}
else
{
- // A trailing '*' is handled below. If the pattern is consumed and
- // substring match allowed we're good.
+ // A trailing '*' is handled below.
if (mbWildcardAllowSubstring)
+ {
+ // If the pattern is consumed and substring match allowed we're good.
setWildcardMatch( aRes, nStartOffset, nString);
- return aRes;
+ return aRes;
+ }
+ else if (nString < nEndPos && nLastAsterisk >= 0)
+ {
+ // If substring match is not allowed try a greedy '*' match.
+ nPattern = nLastAsterisk;
+ continue; // do
+ }
+ else
+ return aRes;
}
if (cPattern == '*' && !bEscaped)
@@ -1235,6 +1245,8 @@ SearchResult TextSearch::WildcardSrchFrwrd( const OUString& searchStr, sal_Int32
return aRes;
}
+ nLastAsterisk = nPattern; // Remember last encountered '*'.
+
// cPattern will be the next non-'*' character, nPattern
// incremented.
cPattern = rPattern.iterateCodePoints( &nPattern);
@@ -1406,7 +1418,7 @@ SearchResult TextSearch::WildcardSrchBkwrd( const OUString& searchStr, sal_Int32
rReversePattern.iterateCodePoints( &nAfterFakePattern, -1);
}
- sal_Int32 nString = nStartPos, nPat = -1, nStr = -1;
+ sal_Int32 nString = nStartPos, nPat = -1, nStr = -1, nLastAsterisk = -1;
sal_uInt32 cPatternAfterAsterisk = 0;
bool bEscaped = false, bEscapedAfterAsterisk = false;
@@ -1433,11 +1445,21 @@ SearchResult TextSearch::WildcardSrchBkwrd( const OUString& searchStr, sal_Int32
}
else
{
- // A leading '*' is handled below. If the pattern is consumed and
- // substring match allowed we're good.
+ // A trailing '*' is handled below.
if (mbWildcardAllowSubstring)
+ {
+ // If the pattern is consumed and substring match allowed we're good.
setWildcardMatch( aRes, nStartOffset, nString);
- return aRes;
+ return aRes;
+ }
+ else if (nString > nEndPos && nLastAsterisk >= 0)
+ {
+ // If substring match is not allowed try a greedy '*' match.
+ nPattern = nLastAsterisk;
+ continue; // do
+ }
+ else
+ return aRes;
}
if (cPattern == '*' && !bEscaped)
@@ -1453,6 +1475,8 @@ SearchResult TextSearch::WildcardSrchBkwrd( const OUString& searchStr, sal_Int32
return aRes;
}
+ nLastAsterisk = nPattern; // Remember last encountered '*'.
+
// cPattern will be the previous non-'*' character, nPattern
// decremented.
cPattern = rReversePattern.iterateCodePoints( &nPattern, -1);
More information about the Libreoffice-commits
mailing list