summaryrefslogtreecommitdiffstats
path: root/formula
diff options
context:
space:
mode:
Diffstat (limited to 'formula')
-rw-r--r--formula/source/core/api/FormulaCompiler.cxx64
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();