diff options
Diffstat (limited to 'formula')
-rw-r--r-- | formula/source/core/api/FormulaCompiler.cxx | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index 964c38cdb69d..8e79e5ca68dd 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -1873,6 +1873,11 @@ void FormulaCompiler::UnaryLine() FormulaTokenRef p = mpToken; NextToken(); UnaryLine(); + if (mbComputeII && IsIIOpCode(p->GetOpCode())) + { + FormulaToken** pArg = pCode - 1; + HandleIIOpCode(p->GetOpCode(), p->GetInForceArray(), &pArg, 1); + } PutCode( p ); } else @@ -1884,6 +1889,11 @@ void FormulaCompiler::PostOpLine() UnaryLine(); while ( mpToken->GetOpCode() == ocPercentSign ) { // this operator _follows_ its operand + if (mbComputeII && IsIIOpCode(mpToken->GetOpCode())) + { + FormulaToken** pArg = pCode - 1; + HandleIIOpCode(mpToken->GetOpCode(), mpToken->GetInForceArray(), &pArg, 1); + } PutCode( mpToken ); NextToken(); } @@ -1895,8 +1905,17 @@ void FormulaCompiler::PowLine() while (mpToken->GetOpCode() == ocPow) { FormulaTokenRef p = mpToken; + bool bDoIICompute = mbComputeII && IsIIOpCode(p->GetOpCode()); + FormulaToken** pArgArray[2]; + if (bDoIICompute) + pArgArray[0] = pCode - 1; // Add first argument NextToken(); PostOpLine(); + if (bDoIICompute) + { + pArgArray[1] = pCode - 1; // Add second argument + HandleIIOpCode(p->GetOpCode(), p->GetInForceArray(), pArgArray, 2); + } PutCode(p); } } @@ -1907,8 +1926,17 @@ void FormulaCompiler::MulDivLine() while (mpToken->GetOpCode() == ocMul || mpToken->GetOpCode() == ocDiv) { FormulaTokenRef p = mpToken; + bool bDoIICompute = mbComputeII && IsIIOpCode(p->GetOpCode()); + FormulaToken** pArgArray[2]; + if (bDoIICompute) + pArgArray[0] = pCode - 1; // Add first argument NextToken(); PowLine(); + if (bDoIICompute) + { + pArgArray[1] = pCode - 1; // Add second argument + HandleIIOpCode(p->GetOpCode(), p->GetInForceArray(), pArgArray, 2); + } PutCode(p); } } @@ -1919,8 +1947,17 @@ void FormulaCompiler::AddSubLine() while (mpToken->GetOpCode() == ocAdd || mpToken->GetOpCode() == ocSub) { FormulaTokenRef p = mpToken; + bool bDoIICompute = mbComputeII && IsIIOpCode(p->GetOpCode()); + FormulaToken** pArgArray[2]; + if (bDoIICompute) + pArgArray[0] = pCode - 1; // Add first argument NextToken(); MulDivLine(); + if (bDoIICompute) + { + pArgArray[1] = pCode - 1; // Add second argument + HandleIIOpCode(p->GetOpCode(), p->GetInForceArray(), pArgArray, 2); + } PutCode(p); } } @@ -1931,8 +1968,17 @@ void FormulaCompiler::ConcatLine() while (mpToken->GetOpCode() == ocAmpersand) { FormulaTokenRef p = mpToken; + bool bDoIICompute = mbComputeII && IsIIOpCode(p->GetOpCode()); + FormulaToken** pArgArray[2]; + if (bDoIICompute) + pArgArray[0] = pCode - 1; // Add first argument NextToken(); AddSubLine(); + if (bDoIICompute) + { + pArgArray[1] = pCode - 1; // Add second argument + HandleIIOpCode(p->GetOpCode(), p->GetInForceArray(), pArgArray, 2); + } PutCode(p); } } @@ -1943,8 +1989,17 @@ void FormulaCompiler::CompareLine() while (mpToken->GetOpCode() >= ocEqual && mpToken->GetOpCode() <= ocGreaterEqual) { FormulaTokenRef p = mpToken; + bool bDoIICompute = mbComputeII && IsIIOpCode(p->GetOpCode()); + FormulaToken** pArgArray[2]; + if (bDoIICompute) + pArgArray[0] = pCode - 1; // Add first argument NextToken(); ConcatLine(); + if (bDoIICompute) + { + pArgArray[1] = pCode - 1; // Add second argument + HandleIIOpCode(p->GetOpCode(), p->GetInForceArray(), pArgArray, 2); + } PutCode(p); } } @@ -1963,8 +2018,17 @@ OpCode FormulaCompiler::Expression() { FormulaTokenRef p = mpToken; mpToken->SetByte( 2 ); // 2 parameters! + bool bDoIICompute = mbComputeII && IsIIOpCode(p->GetOpCode()); + FormulaToken** pArgArray[2]; + if (bDoIICompute) + pArgArray[0] = pCode - 1; // Add first argument NextToken(); CompareLine(); + if (bDoIICompute) + { + pArgArray[1] = pCode - 1; // Add second argument + HandleIIOpCode(p->GetOpCode(), p->GetInForceArray(), pArgArray, 2); + } PutCode(p); } return mpToken->GetOpCode(); |