[Libreoffice-commits] core.git: Branch 'libreoffice-4-0' - sal/qa sal/rtl

Eike Rathke erack at redhat.com
Tue Oct 15 09:01:13 PDT 2013


 sal/qa/rtl/math/test-rtl-math.cxx |   12 ++++++++++++
 sal/rtl/source/math.cxx           |    6 ++++++
 2 files changed, 18 insertions(+)

New commits:
commit 2afaef576d0567e7137a439fc98804960cd7c17c
Author: Eike Rathke <erack at redhat.com>
Date:   Mon Oct 14 14:55:23 2013 +0200

    resolved fdo#70319 exponent must be followed by at least one digit
    
    Change-Id: Icdd22fa0f1efcdd18cfea7cb48e1cbf2cf8d3533
    (cherry picked from commit f20feba4c43c34fd2ee05b4658b0de0248c08eb9)
    Reviewed-on: https://gerrit.libreoffice.org/6242
    Reviewed-by: Michael Stahl <mstahl at redhat.com>
    Tested-by: Michael Stahl <mstahl at redhat.com>

diff --git a/sal/qa/rtl/math/test-rtl-math.cxx b/sal/qa/rtl/math/test-rtl-math.cxx
index 70e8107..8f6578c 100644
--- a/sal/qa/rtl/math/test-rtl-math.cxx
+++ b/sal/qa/rtl/math/test-rtl-math.cxx
@@ -72,9 +72,21 @@ public:
         CPPUNIT_ASSERT_EQUAL(0.0, res);
     }
 
+    void test_stringToDouble_exponent_without_digit() {
+        rtl_math_ConversionStatus status;
+        sal_Int32 end;
+        double res = rtl::math::stringToDouble(
+            rtl::OUString("1e"),
+            sal_Unicode('.'), sal_Unicode(','), &status, &end);
+        CPPUNIT_ASSERT_EQUAL(rtl_math_ConversionStatus_Ok, status);
+        CPPUNIT_ASSERT_EQUAL(sal_Int32(RTL_CONSTASCII_LENGTH("1")), end);
+        CPPUNIT_ASSERT_EQUAL(1.0, res);
+    }
+
     CPPUNIT_TEST_SUITE(Test);
     CPPUNIT_TEST(test_stringToDouble_good);
     CPPUNIT_TEST(test_stringToDouble_bad);
+    CPPUNIT_TEST(test_stringToDouble_exponent_without_digit);
     CPPUNIT_TEST_SUITE_END();
 };
 
diff --git a/sal/rtl/source/math.cxx b/sal/rtl/source/math.cxx
index c0d93b6..e5c44d5 100644
--- a/sal/rtl/source/math.cxx
+++ b/sal/rtl/source/math.cxx
@@ -805,6 +805,7 @@ inline double stringToDouble(CharT const * pBegin, CharT const * pEnd,
         // Exponent
         if (p != p0 && p != pEnd && (*p == CharT('E') || *p == CharT('e')))
         {
+            CharT const * const pExponent = p;
             ++p;
             bool bExpSign;
             if (p != pEnd && *p == CharT('-'))
@@ -818,6 +819,7 @@ inline double stringToDouble(CharT const * pBegin, CharT const * pEnd,
                 if (p != pEnd && *p == CharT('+'))
                     ++p;
             }
+            CharT const * const pFirstExpDigit = p;
             if ( fVal == 0.0 )
             {   // no matter what follows, zero stays zero, but carry on the
                 // offset
@@ -863,6 +865,10 @@ inline double stringToDouble(CharT const * pBegin, CharT const * pEnd,
                     else
                         fVal = rtl::math::pow10Exp( fVal, nExp );  // normal
                 }
+                else if (p == pFirstExpDigit)
+                {   // no digits in exponent, reset end of scan
+                    p = pExponent;
+                }
             }
         }
         else if (p - p0 == 2 && p != pEnd && p[0] == CharT('#')


More information about the Libreoffice-commits mailing list