[Libreoffice-commits] core.git: Branch 'libreoffice-4-2' - sax/source

Stephan Bergmann sbergman at redhat.com
Tue Dec 17 08:37:56 PST 2013


 sax/source/tools/converter.cxx |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

New commits:
commit 5bffe4dffd7496057c1fd70e46af800396f5b346
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Tue Dec 17 16:46:17 2013 +0100

    Avoid inaccurate floating-point computations
    
    ...otherwise at least my --disable-dbgutil --disable-debug Linux x86_64 build
    failed the CppunitTest_sax_cpputest with 8999999 vs. 9000000 nanoseconds.
    
    (cherry picked from commit 695671eb18674ea58103093b9cf31a31afe8d2fd,
    incorporating follow-up fixes 71448690d7c5904df45bf98243c5bb05a99245e5
    "readUnsignedNumberMaxDigits can read more than maxDigits chars" and
    b9bcc9c5c10841dcdfa9ff5814344ce667678df3 "...and nDigits > 9 is harmless in
    following for loop and need not be capped")
    
    Change-Id: I05e0febf413f9f9e01227a0cc4e0f46a5243fe61

diff --git a/sax/source/tools/converter.cxx b/sax/source/tools/converter.cxx
index 8823965..02131ed 100644
--- a/sax/source/tools/converter.cxx
+++ b/sax/source/tools/converter.cxx
@@ -1122,9 +1122,13 @@ bool Converter::convertDuration(util::Duration& rDuration,
                     {
                         if (-1 != nTemp)
                         {
-                            const sal_Int32 nDigits = std::min<sal_Int32>(nPos - nStart, 9);
-                            OSL_ENSURE(nDigits > 0, "bad code monkey: negative digits");
-                            nNanoSeconds=static_cast<double>(nTemp)*(1000000000.0/pow(10.0,nDigits));
+                            nNanoSeconds = nTemp;
+                            sal_Int32 nDigits = nPos - nStart;
+                            assert(nDigits >= 0);
+                            for (; nDigits < 9; ++nDigits)
+                            {
+                                nNanoSeconds *= 10;
+                            }
                             nTemp=-1;
                             if ('S' == string[nPos])
                             {


More information about the Libreoffice-commits mailing list