sc/source/core/opencl/formulagroupcl.cxx | 77 ++++++++++--------------------- 1 file changed, 26 insertions(+), 51 deletions(-)
New commits: commit 448e9995d2c03df9d48de6092360a83892db47b3 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Wed Jul 10 22:09:29 2013 -0400 Parse the token array in the RPN order. Change-Id: I3770269e23980597c16dd613704bd7a9feb0aec9 diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 04a67d2..dee465e 100755 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -295,7 +295,7 @@ public: const ScFormulaCellGroupRef& xGroup, ScTokenArray& rCode); }; -#define RETURN_IF_FAIL(a,b) do { if (!(a)) { fprintf (stderr,b); return false; } } while (0) +#define RETURN_IF_FAIL(a,b) do { if (!(a)) { fprintf (stderr,b"\n"); return false; } } while (0) #include "compiler.hxx" @@ -313,61 +313,36 @@ bool FormulaGroupInterpreterGroundwater::interpret(ScDocument& rDoc, const ScAdd const double *pArrayToSubtractOneElementFrom; const double *pGroundWaterDataArray; - // Output: - std::vector<double> aMatrixContent; + const formula::FormulaToken* p = rCode.FirstRPN(); + RETURN_IF_FAIL(p != NULL && p->GetOpCode() == ocPush && p->GetType() == formula::svDoubleVectorRef, "double vector ref expected"); - const formula::FormulaToken *p; + // Get the range reference vector. + const formula::DoubleVectorRefToken* pDvr = static_cast<const formula::DoubleVectorRefToken*>(p); + const std::vector<const double*>& rArrays = pDvr->GetArrays(); + RETURN_IF_FAIL(rArrays.size() == 1, "unexpectedly large double ref array"); + RETURN_IF_FAIL(pDvr->GetArrayLength() == (size_t)xGroup->mnLength, "wrong double ref length"); + RETURN_IF_FAIL(pDvr->IsStartFixed() && pDvr->IsEndFixed(), "non-fixed ranges )"); + pGroundWaterDataArray = rArrays[0]; - // special cased formula parser: + // Function: + p = rCode.NextRPN(); + RETURN_IF_FAIL(p != NULL, "no operator"); + eOp = p->GetOpCode(); + RETURN_IF_FAIL(eOp == ocAverage || eOp == ocMax || eOp == ocMin, "unexpected opcode - expected either average, max, or min"); - p = rCode.FirstNoSpaces(); - RETURN_IF_FAIL(p != NULL && p->GetOpCode() == ocOpen, "no opening ("); + p = rCode.NextRPN(); + RETURN_IF_FAIL(p != NULL && p->GetOpCode() == ocPush && p->GetType() == formula::svSingleVectorRef, "single vector ref expected"); - { - p = rCode.NextNoSpaces(); - RETURN_IF_FAIL(p != NULL, "no operator"); - - // Function: - eOp = p->GetOpCode(); - RETURN_IF_FAIL(eOp == ocAverage || eOp == ocMax || eOp == ocMin, "unexpected opcode"); - - { // function arguments - p = rCode.NextNoSpaces(); - RETURN_IF_FAIL(p != NULL && p->GetOpCode() == ocOpen, "missing opening ("); - - p = rCode.NextNoSpaces(); - RETURN_IF_FAIL(p != NULL, "no function argument"); - RETURN_IF_FAIL(p->GetType() == formula::svDoubleVectorRef, "wrong type of fn argument"); - const formula::DoubleVectorRefToken* pDvr = static_cast<const formula::DoubleVectorRefToken*>(p); - const std::vector<const double*>& rArrays = pDvr->GetArrays(); - RETURN_IF_FAIL(rArrays.size() == 1, "unexpectedly large double ref array"); - RETURN_IF_FAIL(pDvr->GetArrayLength() == (size_t)xGroup->mnLength, "wrong double ref length"); - RETURN_IF_FAIL(pDvr->IsStartFixed() && pDvr->IsEndFixed(), "non-fixed ranges )"); - pGroundWaterDataArray = rArrays[0]; - - p = rCode.NextNoSpaces(); - RETURN_IF_FAIL(p != NULL && p->GetOpCode() == ocClose, "missing closing )"); - } + // Get the single reference vector. + const formula::SingleVectorRefToken* pSvr = static_cast<const formula::SingleVectorRefToken*>(p); + pArrayToSubtractOneElementFrom = pSvr->GetArray(); + RETURN_IF_FAIL(pSvr->GetArrayLength() == (size_t)xGroup->mnLength, "wrong single ref length"); - // Subtract operator - p = rCode.NextNoSpaces(); - RETURN_IF_FAIL(p != NULL && p->GetOpCode() == ocSub, "missing subtract opcode"); - - { // subtract parameter - p = rCode.NextNoSpaces(); - RETURN_IF_FAIL(p != NULL, "no tokens"); - RETURN_IF_FAIL(p->GetType() == formula::svSingleVectorRef, "not a single ref"); - const formula::SingleVectorRefToken* pSvr = static_cast<const formula::SingleVectorRefToken*>(p); - pArrayToSubtractOneElementFrom = pSvr->GetArray(); - RETURN_IF_FAIL(pSvr->GetArrayLength() == (size_t)xGroup->mnLength, "wrong single ref length"); - } - - p = rCode.NextNoSpaces(); - RETURN_IF_FAIL(p != NULL && p->GetOpCode() == ocClose, "missing closing )"); - } + p = rCode.NextRPN(); + RETURN_IF_FAIL(p != NULL && p->GetOpCode() == ocSub, "missing subtract opcode"); - p = rCode.NextNoSpaces(); - RETURN_IF_FAIL(p == NULL, "has 5th"); + p = rCode.NextRPN(); + RETURN_IF_FAIL(p == NULL, "there should be no more token"); static OclCalc ocl_calc; @@ -380,7 +355,7 @@ bool FormulaGroupInterpreterGroundwater::interpret(ScDocument& rDoc, const ScAdd // pArrayToSubtractOneElementFrom => contains L$5:L$7701 (ie. a copy) // length of this array -> xGroup->mnLength - fprintf (stderr, "Calculate !\n"); + fprintf (stderr, "Calculate !"); double *pResult = ocl_calc.OclSimpleDeltaOperation( eOp, pGroundWaterDataArray, pArrayToSubtractOneElementFrom, _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits