formula/source/core/api/token.cxx | 18 ++++++++++++++++++ include/formula/tokenarray.hxx | 4 ++++ sc/source/core/tool/compiler.cxx | 28 ++++++++++++++++++++++++---- 3 files changed, 46 insertions(+), 4 deletions(-)
New commits: commit 333f8a76341f5b4921e89012d133007503e49612 Author: Eike Rathke <er...@redhat.com> Date: Fri Mar 6 23:22:45 2015 +0100 first stab at handling table[] all range Change-Id: I608cf04cf4b0b991f4a45a868566faeae5be77c9 diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 0ab8f9b..dce9171 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -3931,6 +3931,17 @@ ScTokenArray* ScCompiler::CompileString( const OUString& rFormula ) { static_cast<ScTokenArray*>(pArr)->MergeRangeReference( aPos); } + else if (eLastOp == ocDBArea && pNewToken->GetOpCode() == ocTableRefOpen) + { + sal_uInt16 nIdx = pArr->GetLen() - 1; + const FormulaToken* pPrev = pArr->PeekPrev( nIdx); + if (pPrev && pPrev->GetOpCode() == ocDBArea) + { + // pPrev may be dead hereafter. + static_cast<ScTokenArray*>(pArr)->ReplaceToken( 1, + new ScTableRefToken( pPrev->GetIndex(), ScTableRefToken::ALL)); + } + } eLastOp = maRawToken.GetOpCode(); if ( bAutoCorrect ) aCorrectedFormula += aCorrectedSymbol; @@ -4664,12 +4675,19 @@ bool ScCompiler::HandleTableRef() aRange.aEnd.SetTab(aRange.aStart.Tab()); ScTokenArray* pNew = new ScTokenArray(); ScTableRefToken::Item eItem = pTR->GetItem(); + bool bGotToken = false; if (eItem == ScTableRefToken::ALL) { ScComplexRefData aRefData; aRefData.InitFlags(); aRefData.SetRange(aRange, aPos); pNew->AddDoubleReference( aRefData ); + // Optional [] (or [#All]) may follow. + if ((bGotToken = GetToken()) && mpToken->GetOpCode() == ocTableRefOpen) + { + if ((bGotToken = GetToken()) && mpToken->GetOpCode() == ocTableRefClose) + bGotToken = false; // get next token below + } } else { @@ -4678,7 +4696,7 @@ bool ScCompiler::HandleTableRef() } PushTokenArray( pNew, true ); pNew->Reset(); - return GetToken(); + return bGotToken ? true : GetToken(); } return true; } commit 40c9a46b78b8919aae82dd9b94774d63bb9cb4e6 Author: Eike Rathke <er...@redhat.com> Date: Fri Mar 6 22:39:53 2015 +0100 add FormulaTokenArray::ReplaceToken() Change-Id: I42c893677c1b8a35ee502a9ae438d4c0f19867d3 diff --git a/formula/source/core/api/token.cxx b/formula/source/core/api/token.cxx index 567c12c..117f276 100644 --- a/formula/source/core/api/token.cxx +++ b/formula/source/core/api/token.cxx @@ -849,6 +849,24 @@ FormulaToken* FormulaTokenArray::MergeArray( ) return NULL; } +FormulaToken* FormulaTokenArray::ReplaceToken( sal_uInt16 nOffset, FormulaToken* t ) +{ + if (nOffset < nLen) + { + CheckToken(*t); + sal_uInt16 nPos = nLen - nOffset - 1; + t->IncRef(); + pCode[nPos]->DecRef(); + pCode[nPos] = t; + return t; + } + else + { + t->Delete(); + return NULL; + } +} + FormulaToken* FormulaTokenArray::Add( FormulaToken* t ) { if( !pCode ) diff --git a/include/formula/tokenarray.hxx b/include/formula/tokenarray.hxx index 244a7b9..c70e6c1d 100644 --- a/include/formula/tokenarray.hxx +++ b/include/formula/tokenarray.hxx @@ -115,6 +115,10 @@ protected: /// Also used by the compiler. The token MUST had been allocated with new! FormulaToken* Add( FormulaToken* ); + /** Also used by the compiler. The token MUST had been allocated with new! + @param nOffset negative offset of token, 0==last, 1==previous, ... + */ + FormulaToken* ReplaceToken( sal_uInt16 nOffset, FormulaToken* ); inline void SetCombinedBitsRecalcMode( ScRecalcMode nBits ) { nMode |= (nBits & ~RECALCMODE_EMASK); } inline ScRecalcMode GetCombinedBitsRecalcMode() const commit bc4293bde13001a5e959ff90c189111932c05b3b Author: Eike Rathke <er...@redhat.com> Date: Fri Mar 6 21:56:22 2015 +0100 clarify this visually Change-Id: I04c1a00903cc0c057fc436e391f93b1e05eed8a1 diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 6469918..0ab8f9b 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -3924,11 +3924,13 @@ ScTokenArray* ScCompiler::CompileString( const OUString& rFormula ) FormulaToken* pNewToken = static_cast<ScTokenArray*>(pArr)->Add( maRawToken.CreateToken()); if (!pNewToken) { - SetError(errCodeOverflow); break; + SetError(errCodeOverflow); + break; } - else if (eLastOp == ocRange && pNewToken->GetOpCode() == ocPush && - pNewToken->GetType() == svSingleRef) + else if (eLastOp == ocRange && pNewToken->GetOpCode() == ocPush && pNewToken->GetType() == svSingleRef) + { static_cast<ScTokenArray*>(pArr)->MergeRangeReference( aPos); + } eLastOp = maRawToken.GetOpCode(); if ( bAutoCorrect ) aCorrectedFormula += aCorrectedSymbol; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits