sc/qa/unit/data/functions/text/fods/replace.fods |  230 +++++++++++++++++++++--
 sc/source/core/tool/interpr1.cxx                 |   17 +
 2 files changed, 227 insertions(+), 20 deletions(-)

New commits:
commit aaba725b466950f47c4e93d790986d209e80ead3
Author: Winfried Donkers <winfrieddonk...@libreoffice.org>
Date:   Tue Nov 28 15:55:56 2017 +0100

    tdf#97198 Make Calc function REPLACE work with UniCode non-BMP-characters.
    
    Change-Id: Ie9bd27ba2c28bdad0af9d91cb270ef37d5384791
    Reviewed-on: https://gerrit.libreoffice.org/45421
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Eike Rathke <er...@redhat.com>

diff --git a/sc/qa/unit/data/functions/text/fods/replace.fods 
b/sc/qa/unit/data/functions/text/fods/replace.fods
index 140b735e7090..1ab069f6460a 100644
--- a/sc/qa/unit/data/functions/text/fods/replace.fods
+++ b/sc/qa/unit/data/functions/text/fods/replace.fods
@@ -1141,36 +1141,230 @@
      <table:table-cell table:number-columns-repeated="7"/>
     </table:table-row>
     <table:table-row table:style-name="ro5">
-     <table:table-cell table:style-name="ce18"/>
-     <table:table-cell table:style-name="ce17"/>
-     <table:table-cell table:style-name="ce27"/>
-     <table:table-cell table:style-name="ce11"/>
+     <table:table-cell 
table:formula="of:=REPLACE(&quot;&quot;;5;1;&quot;Q&quot;)" 
office:value-type="string" office:string-value="Q" calcext:value-type="string">
+      <text:p>Q</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce17" office:value-type="string" 
calcext:value-type="string">
+      <text:p>Q</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce43" 
table:formula="of:=[.A10]=[.B10]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>TRUE</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce57" 
table:formula="of:=FORMULA([.A10])" office:value-type="string" 
office:string-value="=REPLACE(&quot;&quot;;5;1;&quot;Q&quot;)" 
calcext:value-type="string">
+      <text:p>=REPLACE(&quot;&quot;;5;1;&quot;Q&quot;)</text:p>
+     </table:table-cell>
      <table:table-cell table:number-columns-repeated="4"/>
-     <table:table-cell table:style-name="ce17"/>
+     <table:table-cell table:style-name="ce37" office:value-type="string" 
calcext:value-type="string">
+      <text:p>B😂</text:p>
+     </table:table-cell>
      <table:table-cell table:number-columns-repeated="2"/>
     </table:table-row>
-    <table:table-row table:style-name="ro5" table:number-rows-repeated="6">
-     <table:table-cell table:style-name="ce14"/>
-     <table:table-cell table:style-name="ce17"/>
-     <table:table-cell table:style-name="ce27"/>
-     <table:table-cell table:style-name="ce11"/>
+    <table:table-row table:style-name="ro6">
+     <table:table-cell table:style-name="ce34" 
table:formula="of:=REPLACE([.I11];4;3;[.I10])" office:value-type="string" 
office:string-value="ab😂B😂gh𝕬𝖈𝖍𝖙𝖚𝖓𝖌!" 
calcext:value-type="string">
+      <text:p>ab😂B😂gh𝕬𝖈𝖍𝖙𝖚𝖓𝖌!</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce37" office:value-type="string" 
calcext:value-type="string">
+      <text:p>ab😂B😂gh𝕬𝖈𝖍𝖙𝖚𝖓𝖌!</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce44" 
table:formula="of:=[.A11]=[.B11]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>TRUE</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce11" 
table:formula="of:=FORMULA([.A11])" office:value-type="string" 
office:string-value="=REPLACE(I11;4;3;I10)" calcext:value-type="string">
+      <text:p>=REPLACE(I11;4;3;I10)</text:p>
+     </table:table-cell>
      <table:table-cell table:number-columns-repeated="4"/>
-     <table:table-cell table:style-name="ce17"/>
+     <table:table-cell table:style-name="ce37" office:value-type="string" 
calcext:value-type="string">
+      <text:p>ab😂de𝔖gh𝕬𝖈𝖍𝖙𝖚𝖓𝖌!</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="2"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro6">
+     <table:table-cell table:style-name="ce34" 
table:formula="of:=REPLACE([.I12];3;1;&quot;xXx&quot;)" 
office:value-type="string" office:string-value="B😂xXx😂d" 
calcext:value-type="string">
+      <text:p>B😂xXx😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce37" office:value-type="string" 
calcext:value-type="string">
+      <text:p>B😂xXx😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce45" 
table:formula="of:=[.A12]=[.B12]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>TRUE</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce11" 
table:formula="of:=FORMULA([.A12])" office:value-type="string" 
office:string-value="=REPLACE(I12;3;1;&quot;xXx&quot;)" 
calcext:value-type="string">
+      <text:p>=REPLACE(I12;3;1;&quot;xXx&quot;)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="4"/>
+     <table:table-cell table:style-name="ce17" office:value-type="string" 
calcext:value-type="string">
+      <text:p>B😂c😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="2"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro2">
+     <table:table-cell table:style-name="ce37" 
table:formula="of:=REPLACE([.I12];2;1;&quot;xXx&quot;)" 
office:value-type="string" office:string-value="BxXxc😂d" 
calcext:value-type="string">
+      <text:p>BxXxc😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce37" office:value-type="string" 
calcext:value-type="string">
+      <text:p>BxXxc😂d</text:p>
+      </table:table-cell>
+     <table:table-cell table:style-name="ce46" 
table:formula="of:=[.A13]=[.B13]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>TRUE</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce11" 
table:formula="of:=FORMULA([.A13])" office:value-type="string" 
office:string-value="=REPLACE(I12;2;1;&quot;xXx&quot;)" 
calcext:value-type="string">
+      <text:p>=REPLACE(I12;2;1;&quot;xXx&quot;)</text:p>
+      </table:table-cell>
+      <table:table-cell table:number-columns-repeated="7"/>
+     </table:table-row>
+     <table:table-row table:style-name="ro5">
+     <table:table-cell table:style-name="ce37" 
table:formula="of:=REPLACE([.I12];3;1;&quot;𝖍𝖙&quot;)" 
office:value-type="string" office:string-value="B😂𝖍𝖙😂d" 
calcext:value-type="string">
+      <text:p>B😂𝖍𝖙😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce37" office:value-type="string" 
calcext:value-type="string">
+      <text:p>B😂𝖍𝖙😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce47" 
table:formula="of:=[.A14]=[.B14]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>TRUE</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce11" 
table:formula="of:=FORMULA([.A14])" office:value-type="string" 
office:string-value="=REPLACE(I12;3;1;&quot;𝖍𝖙&quot;)" 
calcext:value-type="string">
+      <text:p>=REPLACE(I12;3;1;&quot;𝖍𝖙&quot;)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="4"/>
+      <table:table-cell table:style-name="ce17"/>
      <table:table-cell table:number-columns-repeated="2"/>
     </table:table-row>
     <table:table-row table:style-name="ro5">
-     <table:table-cell/>
+     <table:table-cell table:style-name="ce37" 
table:formula="of:=REPLACE([.I12];2;1;&quot;x𝖍𝖙x&quot;)" 
office:value-type="string" office:string-value="Bx𝖍𝖙xc😂d" 
calcext:value-type="string">
+      <text:p>Bx𝖍𝖙xc😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce37" office:value-type="string" 
calcext:value-type="string">
+      <text:p>Bx𝖍𝖙xc😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce48" 
table:formula="of:=[.A15]=[.B15]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>TRUE</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce11" 
table:formula="of:=FORMULA([.A15])" office:value-type="string" 
office:string-value="=REPLACE(I12;2;1;&quot;x𝖍𝖙x&quot;)" 
calcext:value-type="string">
+      <text:p>=REPLACE(I12;2;1;&quot;x𝖍𝖙x&quot;)</text:p>
+     </table:table-cell>
+      <table:table-cell table:number-columns-repeated="4"/>
+      <table:table-cell table:style-name="ce17"/>
+      <table:table-cell table:number-columns-repeated="2"/>
+     </table:table-row>
+    <table:table-row table:style-name="ro5">
+     <table:table-cell table:style-name="ce37" 
table:formula="of:=REPLACE([.I12];2;0;&quot;xXx&quot;)" 
office:value-type="string" office:string-value="BxXx😂c😂d" 
calcext:value-type="string">
+      <text:p>BxXx😂c😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce37" office:value-type="string" 
calcext:value-type="string">
+      <text:p>BxXx😂c😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce49" 
table:formula="of:=[.A16]=[.B16]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>TRUE</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce11" 
table:formula="of:=FORMULA([.A16])" office:value-type="string" 
office:string-value="=REPLACE(I12;2;0;&quot;xXx&quot;)" 
calcext:value-type="string">
+      <text:p>=REPLACE(I12;2;0;&quot;xXx&quot;)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="4"/>
+      <table:table-cell table:style-name="ce17"/>
+     <table:table-cell table:number-columns-repeated="2"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro5">
+     <table:table-cell table:style-name="ce37" 
table:formula="of:=REPLACE([.I12];3;0;&quot;xXx&quot;)" 
office:value-type="string" office:string-value="B😂xXxc😂d" 
calcext:value-type="string">
+      <text:p>B😂xXxc😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce37" office:value-type="string" 
calcext:value-type="string">
+      <text:p>B😂xXxc😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce50" 
table:formula="of:=[.A17]=[.B17]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>TRUE</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce11" 
table:formula="of:=FORMULA([.A17])" office:value-type="string" 
office:string-value="=REPLACE(I12;3;0;&quot;xXx&quot;)" 
calcext:value-type="string">
+      <text:p>=REPLACE(I12;3;0;&quot;xXx&quot;)</text:p>
+     </table:table-cell>
+      <table:table-cell table:number-columns-repeated="4"/>
+      <table:table-cell table:style-name="ce17"/>
+      <table:table-cell table:number-columns-repeated="2"/>
+     </table:table-row>
+     <table:table-row table:style-name="ro5">
+     <table:table-cell table:style-name="ce14" 
table:formula="of:=REPLACE([.I12];1;0;&quot;xYx&quot;)" 
office:value-type="string" office:string-value="xYxB😂c😂d" 
calcext:value-type="string">
+      <text:p>xYxB😂c😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce17" office:value-type="string" 
calcext:value-type="string">
+      <text:p>xYxB😂c😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce51" 
table:formula="of:=[.A18]=[.B18]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>TRUE</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce11" 
table:formula="of:=FORMULA([.A18])" office:value-type="string" 
office:string-value="=REPLACE(I12;1;0;&quot;xYx&quot;)" 
calcext:value-type="string">
+      <text:p>=REPLACE(I12;1;0;&quot;xYx&quot;)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="7"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro5">
+     <table:table-cell table:style-name="ce14" 
table:formula="of:=REPLACE([.I12];1;1;&quot;xYx&quot;)" 
office:value-type="string" office:string-value="xYx😂c😂d" 
calcext:value-type="string">
+      <text:p>xYx😂c😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce17" office:value-type="string" 
calcext:value-type="string">
+      <text:p>xYx😂c😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce52" 
table:formula="of:=[.A19]=[.B19]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>TRUE</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce11" 
table:formula="of:=FORMULA([.A19])" office:value-type="string" 
office:string-value="=REPLACE(I12;1;1;&quot;xYx&quot;)" 
calcext:value-type="string">
+      <text:p>=REPLACE(I12;1;1;&quot;xYx&quot;)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="4"/>
+      <table:table-cell table:style-name="ce17"/>
+     <table:table-cell table:number-columns-repeated="2"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro5">
+     <table:table-cell table:style-name="ce14" 
table:formula="of:=REPLACE([.I12];1;2;&quot;xYx&quot;)" 
office:value-type="string" office:string-value="xYxc😂d" 
calcext:value-type="string">
+      <text:p>xYxc😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce17" office:value-type="string" 
calcext:value-type="string">
+      <text:p>xYxc😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce53" 
table:formula="of:=[.A20]=[.B20]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>TRUE</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce11" 
table:formula="of:=FORMULA([.A20])" office:value-type="string" 
office:string-value="=REPLACE(I12;1;2;&quot;xYx&quot;)" 
calcext:value-type="string">
+      <text:p>=REPLACE(I12;1;2;&quot;xYx&quot;)</text:p>
+     </table:table-cell>
+      <table:table-cell table:number-columns-repeated="4"/>
+      <table:table-cell table:style-name="ce17"/>
+      <table:table-cell table:number-columns-repeated="2"/>
+     </table:table-row>
+    <table:table-row table:style-name="ro5">
+     <table:table-cell table:style-name="ce14" 
table:formula="of:=REPLACE([.I12];1;3;&quot;xYx&quot;)" 
office:value-type="string" office:string-value="xYx😂d" 
calcext:value-type="string">
+      <text:p>xYx😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce17" office:value-type="string" 
calcext:value-type="string">
+      <text:p>xYx😂d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce54" 
table:formula="of:=[.A21]=[.B21]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>TRUE</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce11" 
table:formula="of:=FORMULA([.A21])" office:value-type="string" 
office:string-value="=REPLACE(I12;1;3;&quot;xYx&quot;)" 
calcext:value-type="string">
+      <text:p>=REPLACE(I12;1;3;&quot;xYx&quot;)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="4"/>
      <table:table-cell table:style-name="ce17"/>
-     <table:table-cell table:style-name="ce27"/>
-     <table:table-cell table:style-name="ce11"/>
+     <table:table-cell table:number-columns-repeated="2"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro5">
+     <table:table-cell table:style-name="ce14" 
table:formula="of:=REPLACE([.I12];1;4;&quot;xYx&quot;)" 
office:value-type="string" office:string-value="xYxd" 
calcext:value-type="string">
+      <text:p>xYxd</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce17" office:value-type="string" 
calcext:value-type="string">
+      <text:p>xYxd</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce55" 
table:formula="of:=[.A22]=[.B22]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>TRUE</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce11" 
table:formula="of:=FORMULA([.A22])" office:value-type="string" 
office:string-value="=REPLACE(I12;1;4;&quot;xYx&quot;)" 
calcext:value-type="string">
+      <text:p>=REPLACE(I12;1;4;&quot;xYx&quot;)</text:p>
+     </table:table-cell>
      <table:table-cell table:number-columns-repeated="4"/>
      <table:table-cell table:style-name="ce17"/>
      <table:table-cell table:number-columns-repeated="2"/>
     </table:table-row>
-    <table:table-row table:style-name="ro5" table:number-rows-repeated="20">
-     <table:table-cell table:style-name="ce14"/>
+    <table:table-row table:style-name="ro5" table:number-rows-repeated="15">
      <table:table-cell table:style-name="ce17"/>
-     <table:table-cell table:style-name="ce27"/>
      <table:table-cell table:style-name="ce11"/>
      <table:table-cell table:number-columns-repeated="4"/>
      <table:table-cell table:style-name="ce17"/>
@@ -1210,4 +1404,4 @@
    </table:named-expressions>
   </office:spreadsheet>
  </office:body>
-</office:document>
\ No newline at end of file
+</office:document>
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 2895c93f2a2e..164c1185e1b8 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -8451,9 +8451,22 @@ void ScInterpreter::ScReplace()
                 nPos = nLen + 1;
             if (nCount > nLen - nPos + 1)
                 nCount = nLen - nPos + 1;
-            aOldStr = aOldStr.replaceAt( nPos-1, nCount, "" );
+            sal_Int32 nIdx = 0;
+            sal_Int32 nCnt = 0;
+            while ( nIdx < nLen && nPos > nCnt + 1 )
+            {
+                aOldStr.iterateCodePoints( &nIdx );
+                ++nCnt;
+            }
+            sal_Int32 nStart = nIdx;
+            while ( nIdx < nLen && nPos + nCount - 1 > nCnt )
+            {
+                aOldStr.iterateCodePoints( &nIdx );
+                ++nCnt;
+            }
+            aOldStr = aOldStr.replaceAt( nStart, nIdx - nStart, "" );
             if ( CheckStringResultLen( aOldStr, aNewStr ) )
-                aOldStr = aOldStr.replaceAt( nPos-1, 0, aNewStr );
+                aOldStr = aOldStr.replaceAt( nStart, 0, aNewStr );
             PushString( aOldStr );
         }
     }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to