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

Eike Rathke erack at redhat.com
Thu Aug 6 09:32:49 PDT 2015


 svl/source/numbers/zforfind.cxx |   57 +++++++++++++++++++++++++++++++++++-----
 svl/source/numbers/zforfind.hxx |    1 
 2 files changed, 52 insertions(+), 6 deletions(-)

New commits:
commit c7d66949beecab92dc8f1380c54751710aa0b7a2
Author: Eike Rathke <erack at redhat.com>
Date:   Thu Aug 6 18:22:16 2015 +0200

    Resolves: tdf#93080 short day name and month name may interfere
    
    Change-Id: I088633e4cff278e1add8eeea8828f9ba9c9fb140

diff --git a/svl/source/numbers/zforfind.cxx b/svl/source/numbers/zforfind.cxx
index 77832ea..a8d849f 100644
--- a/svl/source/numbers/zforfind.cxx
+++ b/svl/source/numbers/zforfind.cxx
@@ -110,6 +110,7 @@ void ImpSvNumberInputScan::Reset()
 {
     nMonth       = 0;
     nMonthPos    = 0;
+    nDayOfWeek   = 0;
     nTimePos     = 0;
     nSign        = 0;
     nESign       = 0;
@@ -2100,6 +2101,33 @@ bool ImpSvNumberInputScan::ScanStartString( const OUString& rString,
     {
         const sal_Int32 nMonthStart = nPos;
         short nTempMonth = GetMonth(rString, nPos);
+        if (nTempMonth < 0)
+        {
+            // Short month and day names may be identical in some locales, e.g.
+            // "mar" for "martes" or "marzo" in Spanish.
+            // Do not let a month name immediately take precedence if a day
+            // name was meant instead. Assume that both could be valid, until
+            // encountered differently or the final evaluation in
+            // IsNumberFormat() checks, but continue with weighing the month
+            // name higher unless we have both day of week and month name here.
+            sal_Int32 nTempPos = nMonthStart;
+            nDayOfWeek = GetDayOfWeek( rString, nTempPos);
+            if (nDayOfWeek < 0)
+            {
+                SkipChar( '.', rString, nTempPos ); // abbreviated
+                SkipString( pFormatter->GetLocaleData()->getLongDateDayOfWeekSep(), rString, nTempPos );
+                SkipBlanks( rString, nTempPos);
+                short nTempTempMonth = GetMonth( rString, nTempPos);
+                if (nTempTempMonth)
+                {
+                    // Fall into the else branch below that handles both.
+                    nTempMonth = 0;
+                    nPos = nMonthStart;
+                    nDayOfWeek = 0;
+                    // Do not set nDayOfWeek hereafter, anywhere.
+                }
+            }
+        }
         if ( nTempMonth )    // month (Jan 1)?
         {
             // Jan1 without separator is not a date, unless it is followed by a
@@ -2122,14 +2150,14 @@ bool ImpSvNumberInputScan::ScanStartString( const OUString& rString,
         }
         else
         {
-            int nDayOfWeek = GetDayOfWeek( rString, nPos );
-            if ( nDayOfWeek )
+            int nTempDayOfWeek = GetDayOfWeek( rString, nPos );
+            if ( nTempDayOfWeek )
             {
                 // day of week is just parsed away
                 eScannedType = css::util::NumberFormat::DATE;       // !!! it IS a date !!!
                 if ( nPos < rString.getLength() )
                 {
-                    if ( nDayOfWeek < 0 )
+                    if ( nTempDayOfWeek < 0 )
                     {
                         // abbreviated
                         if ( rString[ nPos ] == (sal_Unicode)'.' )
@@ -2805,12 +2833,12 @@ bool ImpSvNumberInputScan::ScanEndString( const OUString& rString,
             nPos = nPos + rSep.getLength();
             SkipBlanks(rString, nPos);
         }
-        int nDayOfWeek = GetDayOfWeek( rString, nPos );
-        if ( nDayOfWeek )
+        int nTempDayOfWeek = GetDayOfWeek( rString, nPos );
+        if ( nTempDayOfWeek )
         {
             if ( nPos < rString.getLength() )
             {
-                if ( nDayOfWeek < 0 )
+                if ( nTempDayOfWeek < 0 )
                 {   // short
                     if ( rString[ nPos ] == (sal_Unicode)'.' )
                     {
@@ -3518,6 +3546,14 @@ bool ImpSvNumberInputScan::IsNumberFormat( const OUString& rString,         // s
                 break;
 
             case css::util::NumberFormat::DATE:
+                if (nMonth < 0 && nDayOfWeek < 0 && nAnzNums == 3)
+                {
+                    // If both, short month name and day of week name were
+                    // detected, and also numbers for full date, assume that we
+                    // have a day of week instead of month name.
+                    nMonth = 0;
+                    nMonthPos = 0;
+                }
                 if (nMonth)
                 {                               // month name and numbers
                     if (nAnzNums > 2)
@@ -3564,6 +3600,15 @@ bool ImpSvNumberInputScan::IsNumberFormat( const OUString& rString,         // s
                 break;
 
             case css::util::NumberFormat::DATETIME:
+                if (nMonth < 0 && nDayOfWeek < 0 && nAnzNums >= 5)
+                {
+                    // If both, abbreviated month name and day of week name
+                    // were detected, and also at least numbers for full date
+                    // plus time including minutes, assume that we have a day
+                    // of week instead of month name.
+                    nMonth = 0;
+                    nMonthPos = 0;
+                }
                 if (nMonth)
                 {                               // month name and numbers
                     if (nDecPos)
diff --git a/svl/source/numbers/zforfind.hxx b/svl/source/numbers/zforfind.hxx
index a66e332..40db649 100644
--- a/svl/source/numbers/zforfind.hxx
+++ b/svl/source/numbers/zforfind.hxx
@@ -108,6 +108,7 @@ private:
                                                 // negative => short format
     short  nMonthPos;                           // 1 = front, 2 = middle
                                                 // 3 = end
+    int    nDayOfWeek;                          // Temporary (!) day of week (1..7,-1..-7) if date
     sal_uInt16 nTimePos;                        // Index of first time separator (+1)
     short  nDecPos;                             // Index of substring containing "," (+1)
     short  nNegCheck;                           // '( )' for negative


More information about the Libreoffice-commits mailing list