[Libreoffice-commits] core.git: starmath/source

Takeshi Abe tabe at fixedpoint.jp
Wed Mar 29 13:11:56 UTC 2017


 starmath/source/parse.cxx |   82 ++++++++++++++++++++++------------------------
 1 file changed, 40 insertions(+), 42 deletions(-)

New commits:
commit 435011a6a7924ac56ab1a0ee78a2eecb99bdb353
Author: Takeshi Abe <tabe at 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 <ci at libreoffice.org>
    Reviewed-by: Takeshi Abe <tabe at 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()


More information about the Libreoffice-commits mailing list