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

Caolán McNamara caolanm at redhat.com
Mon Dec 11 21:24:14 UTC 2017


 starmath/source/mathmlattr.cxx   |   83 ++++++++++-----------------------------
 starmath/source/mathmlattr.hxx   |    4 -
 starmath/source/mathmlimport.cxx |    4 -
 3 files changed, 27 insertions(+), 64 deletions(-)

New commits:
commit 44e47c2c32799e7833cc6cfd249c4d15306fd7e6
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Mon Dec 11 15:41:50 2017 +0000

    ofz#4594 Integer-overflow
    
    Change-Id: I6d73f514536e5b3e69573e24fd8b9f4b84e315c5
    Reviewed-on: https://gerrit.libreoffice.org/46248
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/starmath/source/mathmlattr.cxx b/starmath/source/mathmlattr.cxx
index 2b0c70335430..74e32d42944b 100644
--- a/starmath/source/mathmlattr.cxx
+++ b/starmath/source/mathmlattr.cxx
@@ -12,22 +12,8 @@
 #include <cassert>
 #include <unordered_map>
 
-namespace {
-
-sal_Int32 lcl_GetPowerOf10(sal_Int32 nPower)
+sal_Int32 ParseMathMLUnsignedNumber(const OUString &rStr, Fraction& rUN)
 {
-    assert(nPower > 0);
-    sal_Int32 nResult = 1;
-    while (nPower--)
-        nResult *= 10;
-    return nResult;
-}
-
-}
-
-sal_Int32 ParseMathMLUnsignedNumber(const OUString &rStr, Fraction *pUN)
-{
-    assert(pUN);
     auto nLen = rStr.getLength();
     sal_Int32 nDecimalPoint = -1;
     sal_Int32 nIdx;
@@ -44,113 +30,91 @@ sal_Int32 ParseMathMLUnsignedNumber(const OUString &rStr, Fraction *pUN)
         if (cD < u'0' || u'9' < cD)
             break;
     }
-    if (nIdx == 0 || ((nIdx == 1 || nIdx == 11) && nDecimalPoint == 0))
+    if (nIdx == 0 || (nIdx == 1 && nDecimalPoint == 0))
         return -1;
-    if (nDecimalPoint == -1)
-    {
-        assert(nIdx > 0);
-        *pUN = Fraction(rStr.copy(0, nIdx).toInt32(), 1);
-        return nIdx;
-    }
-    if (nDecimalPoint == 0)
-    {
-        assert(nIdx > 1);
-        *pUN = Fraction(rStr.copy(1, nIdx-1).toInt32(), lcl_GetPowerOf10(nIdx-1));
-        return nIdx;
-    }
-    assert(0 < nDecimalPoint);
-    assert(nDecimalPoint < nIdx);
-    *pUN = Fraction(rStr.copy(0, nDecimalPoint).toInt32(), 1);
-    if (++nDecimalPoint < nIdx)
-    {
-        const sal_Int32 nDigits = nIdx - nDecimalPoint;
-        if (nDigits > 9)
-            return -1;
-        *pUN += Fraction(rStr.copy(nDecimalPoint, nDigits).toInt32(), lcl_GetPowerOf10(nDigits));
-    }
+
+    rUN = Fraction(rStr.copy(0, nIdx).toDouble());
+
     return nIdx;
 }
 
-sal_Int32 ParseMathMLNumber(const OUString &rStr, Fraction *pN)
+sal_Int32 ParseMathMLNumber(const OUString &rStr, Fraction& rN)
 {
-    assert(pN);
     if (rStr.isEmpty())
         return -1;
     bool bNegative = (rStr[0] == '-');
     sal_Int32 nOffset = bNegative ? 1 : 0;
     Fraction aF;
-    auto nIdx = ParseMathMLUnsignedNumber(rStr.copy(nOffset), &aF);
+    auto nIdx = ParseMathMLUnsignedNumber(rStr.copy(nOffset), aF);
     if (nIdx <= 0)
         return -1;
     if (bNegative)
-        *pN = Fraction(aF.GetNumerator(), aF.GetDenominator());
+        rN = Fraction(aF.GetNumerator(), aF.GetDenominator());
     else
-        *pN = aF;
+        rN = aF;
     return nOffset + nIdx;
 }
 
-sal_Int32 ParseMathMLAttributeLengthValue(const OUString &rStr, MathMLAttributeLengthValue *pV)
+sal_Int32 ParseMathMLAttributeLengthValue(const OUString &rStr, MathMLAttributeLengthValue& rV)
 {
-    assert(pV);
-    auto nIdx = ParseMathMLNumber(rStr, &pV->aNumber);
+    auto nIdx = ParseMathMLNumber(rStr, rV.aNumber);
     if (nIdx <= 0)
         return -1;
     OUString sRest = rStr.copy(nIdx);
     if (sRest.isEmpty())
     {
-        pV->eUnit = MathMLLengthUnit::None;
+        rV.eUnit = MathMLLengthUnit::None;
         return nIdx;
     }
     if (sRest.startsWith("em"))
     {
-        pV->eUnit = MathMLLengthUnit::Em;
+        rV.eUnit = MathMLLengthUnit::Em;
         return nIdx + 2;
     }
     if (sRest.startsWith("ex"))
     {
-        pV->eUnit = MathMLLengthUnit::Ex;
+        rV.eUnit = MathMLLengthUnit::Ex;
         return nIdx + 2;
     }
     if (sRest.startsWith("px"))
     {
-        pV->eUnit = MathMLLengthUnit::Px;
+        rV.eUnit = MathMLLengthUnit::Px;
         return nIdx + 2;
     }
     if (sRest.startsWith("in"))
     {
-        pV->eUnit = MathMLLengthUnit::In;
+        rV.eUnit = MathMLLengthUnit::In;
         return nIdx + 2;
     }
     if (sRest.startsWith("cm"))
     {
-        pV->eUnit = MathMLLengthUnit::Cm;
+        rV.eUnit = MathMLLengthUnit::Cm;
         return nIdx + 2;
     }
     if (sRest.startsWith("mm"))
     {
-        pV->eUnit = MathMLLengthUnit::Mm;
+        rV.eUnit = MathMLLengthUnit::Mm;
         return nIdx + 2;
     }
     if (sRest.startsWith("pt"))
     {
-        pV->eUnit = MathMLLengthUnit::Pt;
+        rV.eUnit = MathMLLengthUnit::Pt;
         return nIdx + 2;
     }
     if (sRest.startsWith("pc"))
     {
-        pV->eUnit = MathMLLengthUnit::Pc;
+        rV.eUnit = MathMLLengthUnit::Pc;
         return nIdx + 2;
     }
     if (sRest[0] == u'%')
     {
-        pV->eUnit = MathMLLengthUnit::Percent;
+        rV.eUnit = MathMLLengthUnit::Percent;
         return nIdx + 2;
     }
     return nIdx;
 }
 
-
-bool GetMathMLMathvariantValue(const OUString &rStr, MathMLMathvariantValue *pV)
+bool GetMathMLMathvariantValue(const OUString &rStr, MathMLMathvariantValue& rV)
 {
     static const std::unordered_map<OUString, MathMLMathvariantValue> aMap{
         {"normal", MathMLMathvariantValue::Normal},
@@ -173,11 +137,10 @@ bool GetMathMLMathvariantValue(const OUString &rStr, MathMLMathvariantValue *pV)
         {"stretched", MathMLMathvariantValue::Stretched}
     };
 
-    assert(pV);
     auto it = aMap.find(rStr);
     if (it != aMap.end())
     {
-        *pV = it->second;
+        rV = it->second;
         return true;
     }
     return false;
diff --git a/starmath/source/mathmlattr.hxx b/starmath/source/mathmlattr.hxx
index f5402546e68e..42948f43ccdf 100644
--- a/starmath/source/mathmlattr.hxx
+++ b/starmath/source/mathmlattr.hxx
@@ -45,7 +45,7 @@ struct MathMLAttributeLengthValue
     MathMLLengthUnit eUnit;
 };
 
-sal_Int32 ParseMathMLAttributeLengthValue(const OUString &rStr, MathMLAttributeLengthValue *pV);
+sal_Int32 ParseMathMLAttributeLengthValue(const OUString &rStr, MathMLAttributeLengthValue& rV);
 
 
 // MathML 3: 3.2.2 Mathematics style attributes common to token elements
@@ -72,7 +72,7 @@ enum class MathMLMathvariantValue {
     Stretched
 };
 
-bool GetMathMLMathvariantValue(const OUString &rStr, MathMLMathvariantValue *pV);
+bool GetMathMLMathvariantValue(const OUString &rStr, MathMLMathvariantValue& rV);
 
 #endif
 
diff --git a/starmath/source/mathmlimport.cxx b/starmath/source/mathmlimport.cxx
index 59fa00467b42..c69f6b501ae7 100644
--- a/starmath/source/mathmlimport.cxx
+++ b/starmath/source/mathmlimport.cxx
@@ -791,7 +791,7 @@ void SmXMLTokenAttrHelper::RetrieveAttrs(const uno::Reference<xml::sax::XAttribu
         switch(rAttrTokenMap.Get(nPrefix, aLocalName))
         {
             case XML_TOK_MATHVARIANT:
-                if (!GetMathMLMathvariantValue(sValue, &meMv))
+                if (!GetMathMLMathvariantValue(sValue, meMv))
                     SAL_WARN("starmath", "failed to recognize mathvariant: " << sValue);
                 mbMvFound = true;
                 break;
@@ -1532,7 +1532,7 @@ void SmXMLSpaceContext_Impl::StartElement(
         switch (rAttrTokenMap.Get(nPrefix, aLocalName))
         {
             case XML_TOK_WIDTH:
-                if ( ParseMathMLAttributeLengthValue(sValue.trim(), &aLV) <= 0 ||
+                if ( ParseMathMLAttributeLengthValue(sValue.trim(), aLV) <= 0 ||
                      !lcl_CountBlanks(aLV, &nWide, &nNarrow) )
                     SAL_WARN("starmath", "ignore mspace's width: " << sValue);
                 break;


More information about the Libreoffice-commits mailing list