sw/qa/extras/uiwriter/uiwriter7.cxx |    5 +++++
 sw/source/core/crsr/findtxt.cxx     |   19 +++++++++++++++++++
 2 files changed, 24 insertions(+)

New commits:
commit e830394c068c229bb840018f2f0e8810da6a1487
Author:     Justin Luth <justin.l...@collabora.com>
AuthorDate: Tue Mar 19 15:28:32 2024 -0400
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Thu Mar 21 10:59:23 2024 +0100

    related tdf#147583 sw find: fix backwards search for string at end of para
    
    Prior to this fix, it was finding every single character in the document
    when searching for ".$".
    
    Interestingly, the unit test worked even before the patch.
    Not sure how that could be possible...
    
    make CppunitTest_sw_uiwriter7 \
        CPPUNIT_TEST_NAME=testTdf147583_backwardSearch
    
    Change-Id: I20779898c01736eb39ecd7db7d66c2c24e4358b0
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165037
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <jl...@mail.com>
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/sw/qa/extras/uiwriter/uiwriter7.cxx 
b/sw/qa/extras/uiwriter/uiwriter7.cxx
index bf9a4ee1bd1c..dda894b7fda5 100644
--- a/sw/qa/extras/uiwriter/uiwriter7.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter7.cxx
@@ -386,6 +386,11 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, 
testTdf147583_backwardSearch)
     xIndex.set(xSearch->findAll(xSearchDes), uno::UNO_SET_THROW);
     // should actually be 10 (including the empty para with the comment 
marker, and the last para)
     CPPUNIT_ASSERT_EQUAL(sal_Int32(8), xIndex->getCount());
+
+    xSearchDes->setSearchString(".$"); // any last character (not just 
full-stops) in a paragraph
+    xIndex.set(xSearch->findAll(xSearchDes), uno::UNO_SET_THROW);
+    // should be one for every non-empty paragraph
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(14), xIndex->getCount());
 }
 
 CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf69282)
diff --git a/sw/source/core/crsr/findtxt.cxx b/sw/source/core/crsr/findtxt.cxx
index 930ac7926ce2..34d16d2a91b9 100644
--- a/sw/source/core/crsr/findtxt.cxx
+++ b/sw/source/core/crsr/findtxt.cxx
@@ -726,6 +726,25 @@ bool DoSearch(SwPaM & rSearchPam,
         SwTextNode const*const pNode, SwTextFrame const*const pFrame,
         SwRootFrame const*const pLayout, SwPaM& rPam)
 {
+    if (bRegSearch && rSearchOpt.searchString.endsWith("$"))
+    {
+        bool bAlwaysSearchingForEndOfPara = true;
+        sal_Int32 nIndex = 0;
+        while ((nIndex = rSearchOpt.searchString.indexOf("|", nIndex)) != -1)
+        {
+            if (!nIndex || rSearchOpt.searchString[nIndex - 1] != '$')
+            {
+                bAlwaysSearchingForEndOfPara = false;
+                break;
+            }
+            ++nIndex;
+        }
+        // when searching for something at the end of the paragraph, the para 
end must be in range
+        const AmbiguousIndex& rParaEnd = bSrchForward ? nEnd : nStart;
+        if (bAlwaysSearchingForEndOfPara && nTextLen.GetAnyIndex() != 
rParaEnd.GetAnyIndex())
+            return false;
+    }
+
     bool bFound = false;
     OUString sCleanStr;
     std::vector<AmbiguousIndex> aFltArr;

Reply via email to