summaryrefslogtreecommitdiff
path: root/formula
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2015-06-15 14:51:52 +0200
committerAndras Timar <andras.timar@collabora.com>2015-08-06 12:22:47 +0200
commit2b25c9d40f0bf5cfcf1eaca9f020f3ecb2811f4f (patch)
tree1afd11c8f70d83b7017cd4becafd4423f2e28066 /formula
parent791fe38f5582432992e330a0d844179097bbcf5b (diff)
prepare ReplaceToken() to replace also in RPN
Change-Id: I98fbcb9849f2c2b1f26109a54ecbf5347cdd8b4e (cherry picked from commit 1d463600f4db2993838c7660da2cb87aa19218fd)
Diffstat (limited to 'formula')
-rw-r--r--formula/source/core/api/token.cxx26
1 files changed, 22 insertions, 4 deletions
diff --git a/formula/source/core/api/token.cxx b/formula/source/core/api/token.cxx
index ba1be28e788f..cc88919e994f 100644
--- a/formula/source/core/api/token.cxx
+++ b/formula/source/core/api/token.cxx
@@ -848,15 +848,33 @@ FormulaToken* FormulaTokenArray::MergeArray( )
return NULL;
}
-FormulaToken* FormulaTokenArray::ReplaceToken( sal_uInt16 nOffset, FormulaToken* t )
+FormulaToken* FormulaTokenArray::ReplaceToken( sal_uInt16 nOffset, FormulaToken* t,
+ FormulaTokenArray::ReplaceMode eMode )
{
+ if (eMode == BACKWARD_CODE_ONLY)
+ nOffset = nLen - nOffset - 1;
+
if (nOffset < nLen)
{
CheckToken(*t);
- sal_uInt16 nPos = nLen - nOffset - 1;
t->IncRef();
- pCode[nPos]->DecRef();
- pCode[nPos] = t;
+ FormulaToken* p = pCode[nOffset];
+ pCode[nOffset] = t;
+ if (eMode == FORWARD_CODE_AND_RPN && p->GetRef() > 1)
+ {
+ for (sal_uInt16 i=0; i < nRPN; ++i)
+ {
+ if (pRPN[i] == p)
+ {
+ t->IncRef();
+ pRPN[i] = t;
+ p->DecRef();
+ if (p->GetRef() == 1)
+ break; // for
+ }
+ }
+ }
+ p->DecRef(); // may be dead now
return t;
}
else