svl/source/numbers/zforfind.cxx |   42 ++++++++++++++++++++++++++++++++--------
 svl/source/numbers/zforfind.hxx |    2 -
 2 files changed, 35 insertions(+), 9 deletions(-)

New commits:
commit 91ccd9fda9c953dbe88b99673491aabeb64ff330
Author:     Eike Rathke <er...@redhat.com>
AuthorDate: Fri Jul 3 19:09:33 2020 +0200
Commit:     Eike Rathke <er...@redhat.com>
CommitDate: Mon Jul 6 13:10:43 2020 +0200

    Resolves: tdf#131562 decimal separator may not be surrounded by blanks
    
    1 .
    1 .2
    1 . 2
    1. 2
     . 2
    . 2
    are not numbers. But
     .2
    is.
    
    Change-Id: Ie2e0775852e13eee733d0fed3399cbd3d065d9fe
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97895
    Tested-by: Jenkins
    Reviewed-by: Eike Rathke <er...@redhat.com>
    (cherry picked from commit 7186541219599e1b51ad35601c2cd015a329f360)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/98074

diff --git a/svl/source/numbers/zforfind.cxx b/svl/source/numbers/zforfind.cxx
index 88ef3584c46a..42ffbd325bac 100644
--- a/svl/source/numbers/zforfind.cxx
+++ b/svl/source/numbers/zforfind.cxx
@@ -499,9 +499,10 @@ inline bool ImpSvNumberInputScan::SkipChar( sal_Unicode c, 
const OUString& rStri
 /**
  * Skips blanks
  */
-inline void ImpSvNumberInputScan::SkipBlanks( const OUString& rString,
+inline bool ImpSvNumberInputScan::SkipBlanks( const OUString& rString,
                                               sal_Int32& nPos )
 {
+    sal_Int32 nHere = nPos;
     if ( nPos < rString.getLength() )
     {
         const sal_Unicode* p = rString.getStr() + nPos;
@@ -511,6 +512,7 @@ inline void ImpSvNumberInputScan::SkipBlanks( const 
OUString& rString,
             p++;
         }
     }
+    return nHere < nPos;
 }
 
 
@@ -2271,10 +2273,13 @@ bool ImpSvNumberInputScan::ScanStartString( const 
OUString& rString )
     if (nSign && nPos == rString.getLength())
         return true;
 
+    const sal_Int32 nStartBlanks = nPos;
     if ( GetDecSep(rString, nPos) )                 // decimal separator in 
start string
     {
-        nDecPos = 1;
-        SkipBlanks(rString, nPos);
+        if (SkipBlanks(rString, nPos))
+            nPos = nStartBlanks;                    // `. 2` not a decimal 
separator
+        else
+            nDecPos = 1;                            // leading decimal 
separator
     }
     else if ( GetCurrency(rString, nPos) )          // currency (DM 1)?
     {
@@ -2290,8 +2295,13 @@ bool ImpSvNumberInputScan::ScanStartString( const 
OUString& rString )
         }
         if ( GetDecSep(rString, nPos) )             // decimal separator 
follows currency
         {
-            nDecPos = 1;
-            SkipBlanks(rString, nPos);
+            if (SkipBlanks(rString, nPos))
+            {
+                nPos = nStartBlanks;                // `DM . 2` not a decimal 
separator
+                eScannedType = SvNumFormatType::UNDEFINED;  // !!! it is NOT 
currency !!!
+            }
+            else
+                nDecPos = 1;                        // leading decimal 
separator
         }
     }
     else
@@ -2442,7 +2452,8 @@ bool ImpSvNumberInputScan::ScanMidString( const OUString& 
rString, sal_uInt16 nS
         }
     }
 
-    SkipBlanks(rString, nPos);
+    const sal_Int32 nStartBlanks = nPos;
+    const bool bBlanks = SkipBlanks(rString, nPos);
     if (GetDecSep(rString, nPos))                   // decimal separator?
     {
         if (nDecPos == 1 || nDecPos == 3)           // .12.4 or 1.E2.1
@@ -2472,10 +2483,19 @@ bool ImpSvNumberInputScan::ScanMidString( const 
OUString& rString, sal_uInt16 nS
                 return MatchedReturn();
             }
         }
+        else if (bBlanks)
+        {
+            // `1 .2` or `1 . 2` not a decimal separator, reset
+            nPos = nStartBlanks;
+        }
+        else if (SkipBlanks(rString, nPos))
+        {
+            // `1. 2` not a decimal separator, reset
+            nPos = nStartBlanks;
+        }
         else
         {
             nDecPos = 2;                            // . in mid string
-            SkipBlanks(rString, nPos);
         }
     }
     else if ( (eScannedType & SvNumFormatType::TIME) &&
@@ -2798,7 +2818,8 @@ bool ImpSvNumberInputScan::ScanEndString( const OUString& 
rString )
         }
     }
 
-    SkipBlanks(rString, nPos);
+    const sal_Int32 nStartBlanks = nPos;
+    const bool bBlanks = SkipBlanks(rString, nPos);
     if (GetDecSep(rString, nPos))                   // decimal separator?
     {
         if (nDecPos == 1 || nDecPos == 3)           // .12.4 or 12.E4.
@@ -2828,6 +2849,11 @@ bool ImpSvNumberInputScan::ScanEndString( const 
OUString& rString )
                 return MatchedReturn();
             }
         }
+        else if (bBlanks)
+        {
+            // not a decimal separator, reset
+            nPos = nStartBlanks;
+        }
         else
         {
             nDecPos = 3;                            // . in end string
diff --git a/svl/source/numbers/zforfind.hxx b/svl/source/numbers/zforfind.hxx
index 332f0ef6ef94..0c66cb46f770 100644
--- a/svl/source/numbers/zforfind.hxx
+++ b/svl/source/numbers/zforfind.hxx
@@ -264,7 +264,7 @@ private:
                                  sal_Int32& nPos );
 
     // Skip blank
-    static inline void SkipBlanks( const OUString& rString,
+    static inline bool SkipBlanks( const OUString& rString,
                                    sal_Int32& nPos );
 
     // Jump over rWhat in rString at nPos
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to