starmath/source/parse.cxx | 82 ++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 42 deletions(-)
New commits: commit 435011a6a7924ac56ab1a0ee78a2eecb99bdb353 Author: Takeshi Abe <t...@fixedpoint.jp> Date: Sat Mar 25 15:42:31 2017 +0900 starmath: Refrain from skipping an extra token at missing "}" which requires closing "matrix {". Change-Id: I40cad5a29862d29cd2eda7f5641e732620bac217 Reviewed-on: https://gerrit.libreoffice.org/35785 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Takeshi Abe <t...@fixedpoint.jp> diff --git a/starmath/source/parse.cxx b/starmath/source/parse.cxx index d090cfecf93e..bbfa2e0f67e7 100644 --- a/starmath/source/parse.cxx +++ b/starmath/source/parse.cxx @@ -2096,58 +2096,56 @@ SmStructureNode *SmParser::DoMatrix() { std::unique_ptr<SmMatrixNode> pMNode(new SmMatrixNode(m_aCurToken)); NextToken(); - if (m_aCurToken.eType == TLGROUP) - { - sal_uInt16 c = 0; - - do - { - NextToken(); - m_aNodeStack.emplace_front(DoAlign()); - c++; - } - while (m_aCurToken.eType == TPOUND); + if (m_aCurToken.eType != TLGROUP) + return DoError(SmParseError::LgroupExpected); - sal_uInt16 r = 1; + SmNodeArray aExprArr; + do + { + NextToken(); + aExprArr.push_back(DoAlign()); + } + while (m_aCurToken.eType == TPOUND); - while (m_aCurToken.eType == TDPOUND) + size_t nCol = aExprArr.size(); + size_t nRow = 1; + while (m_aCurToken.eType == TDPOUND) + { + NextToken(); + for (size_t i = 0; i < nCol; i++) { - NextToken(); - for (sal_uInt16 i = 0; i < c; i++) + std::unique_ptr<SmNode> pNode(DoAlign()); + if (i < (nCol - 1)) { - m_aNodeStack.emplace_front(DoAlign()); - if (i < (c - 1)) - { - if (m_aCurToken.eType == TPOUND) - { - NextToken(); - } - else - Error(SmParseError::PoundExpected); - } + if (m_aCurToken.eType == TPOUND) + NextToken(); + else + pNode.reset(DoError(SmParseError::PoundExpected)); } - - r++; + aExprArr.push_back(pNode.release()); } + ++nRow; + } - size_t nRC = static_cast<size_t>(r) * c; - - SmNodeArray ExpressionArray(nRC); - for (auto rIt = ExpressionArray.rbegin(), rEnd = ExpressionArray.rend(); rIt != rEnd; ++rIt) + if (m_aCurToken.eType == TRGROUP) + NextToken(); + else + { + auto pENode = DoError(SmParseError::RgroupExpected); + if (aExprArr.empty()) + nRow = nCol = 1; + else { - *rIt = popOrZero(m_aNodeStack); + delete aExprArr.back(); + aExprArr.pop_back(); } - - if (m_aCurToken.eType != TRGROUP) - Error(SmParseError::RgroupExpected); - - pMNode->SetSubNodes(ExpressionArray); - pMNode->SetRowCol(r, c); - - NextToken(); - return pMNode.release(); + aExprArr.push_back(pENode); } - return DoError(SmParseError::LgroupExpected); + + pMNode->SetSubNodes(aExprArr); + pMNode->SetRowCol(static_cast<sal_uInt16>(nRow), + static_cast<sal_uInt16>(nCol)); + return pMNode.release(); } SmSpecialNode *SmParser::DoSpecial() _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits