sc/qa/unit/ucalc.cxx            |   26 ++++++++++++++++++++++++++
 sc/source/core/tool/reffind.cxx |    4 ++--
 2 files changed, 28 insertions(+), 2 deletions(-)

New commits:
commit 40e3e9fd1c501cc1978d4370b6392701ccd42a71
Author:     Andreas Heinisch <andreas.heini...@yahoo.de>
AuthorDate: Thu Apr 6 17:38:52 2023 +0200
Commit:     Andreas Heinisch <andreas.heini...@yahoo.de>
CommitDate: Fri Apr 7 14:00:42 2023 +0200

    tdf#113027 - Allow cycling cell reference types including whitespaces
    
    A formula containing a remote reference to a sheet including a
    whitespace in its name does not correctly handle switching from
    relative to absolute cell references using the EXCEL R1C1
    formular grammar.
    
    Change-Id: I3391f4e8f57993899b5e97f0a173b624b5ef0b22
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150109
    Tested-by: Jenkins
    Reviewed-by: Andreas Heinisch <andreas.heini...@yahoo.de>

diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index 8563ef8283c3..aa8dbc32b220 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -450,6 +450,32 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf66613)
     m_pDoc->DeleteTab(nSecondTab);
 }
 
+CPPUNIT_TEST_FIXTURE(Test, testTdf113027)
+{
+    // Insert some sheets including a whitespace in their name and switch the 
grammar to R1C1
+    CPPUNIT_ASSERT(m_pDoc->InsertTab(0, "Sheet 1"));
+    CPPUNIT_ASSERT(m_pDoc->InsertTab(1, "Sheet 2"));
+    FormulaGrammarSwitch aFGSwitch(m_pDoc, 
formula::FormulaGrammar::GRAM_ENGLISH_XL_R1C1);
+
+    // Add a formula containing a remote reference, i.e., to another sheet
+    const ScAddress aScAddress(0, 0, 0);
+    const OUString aFormula = "='Sheet 2'!RC";
+    m_pDoc->SetString(aScAddress, aFormula);
+
+    // Switch from relative to absolute cell reference
+    ScRefFinder aFinder(aFormula, aScAddress, *m_pDoc, 
m_pDoc->GetAddressConvention());
+    aFinder.ToggleRel(0, aFormula.getLength());
+
+    // Without the fix in place, this test would have failed with
+    // - Expected: ='Sheet 2'!R1C1
+    // - Actual  : ='Sheet 2'!RC
+    // i.e. the cell reference was not changed from relative to absolute
+    CPPUNIT_ASSERT_EQUAL(OUString("='Sheet 2'!R1C1"), aFinder.GetText());
+
+    m_pDoc->DeleteTab(0);
+    m_pDoc->DeleteTab(1);
+}
+
 CPPUNIT_TEST_FIXTURE(Test, testTdf90698)
 {
     CPPUNIT_ASSERT(m_pDoc->InsertTab (0, "Test"));
diff --git a/sc/source/core/tool/reffind.cxx b/sc/source/core/tool/reffind.cxx
index ab276196d399..ac080ae5a56e 100644
--- a/sc/source/core/tool/reffind.cxx
+++ b/sc/source/core/tool/reffind.cxx
@@ -91,7 +91,7 @@ sal_Int32 FindEndPosR1C1(const sal_Unicode* p, sal_Int32 
nStartPos, sal_Int32 nE
         if (*p == '\'')
         {
             // Skip until the closing quote.
-            for (; nNewEnd <= nEndPos; ++p, ++nNewEnd)
+            for (++p; nNewEnd <= nEndPos; ++p, ++nNewEnd)
                 if (*p == '\'')
                     break;
             if (nNewEnd > nEndPos)
@@ -100,7 +100,7 @@ sal_Int32 FindEndPosR1C1(const sal_Unicode* p, sal_Int32 
nStartPos, sal_Int32 nE
         else if (*p == '[')
         {
             // Skip until the closing bracket.
-            for (; nNewEnd <= nEndPos; ++p, ++nNewEnd)
+            for (++p; nNewEnd <= nEndPos; ++p, ++nNewEnd)
                 if (*p == ']')
                     break;
             if (nNewEnd > nEndPos)

Reply via email to