Author: atsushi
Date: 2005-05-25 04:29:39 -0400 (Wed, 25 May 2005)
New Revision: 44981

Modified:
   trunk/mcs/class/corlib/System/ChangeLog
   trunk/mcs/class/corlib/System/DateTime.cs
   trunk/mcs/class/corlib/Test/System/ChangeLog
   trunk/mcs/class/corlib/Test/System/DateTimeTest.cs
Log:
2005-05-25  Atsushi Enomoto  <[EMAIL PROTECTED]>

        * DateTime.cs : Added minimum digit parameter to ParseNumber() to
          reject 2 digit years for "yyyy".
          Use GetAllDateTimePatterns() instead of constant string.
          Fixed bug #72788.

        * DateTimeTest.cs : added testcase for #72788. Test that assures we
          reject 2 digit years for "yyyy".



Modified: trunk/mcs/class/corlib/System/ChangeLog
===================================================================
--- trunk/mcs/class/corlib/System/ChangeLog     2005-05-25 08:21:36 UTC (rev 
44980)
+++ trunk/mcs/class/corlib/System/ChangeLog     2005-05-25 08:29:39 UTC (rev 
44981)
@@ -1,5 +1,12 @@
 2005-05-25  Atsushi Enomoto  <[EMAIL PROTECTED]>
 
+       * DateTime.cs : Added minimum digit parameter to ParseNumber() to
+         reject 2 digit years for "yyyy".
+         Use GetAllDateTimePatterns() instead of constant string.
+         Fixed bug #72788.
+
+2005-05-25  Atsushi Enomoto  <[EMAIL PROTECTED]>
+
        * DateTime.cs : next_not_digit prevented some valid parse.
          Just remove it, since now we pass max length to ParseNumber() and
          thus it is not needed anymore. Fixed bug 63137.

Modified: trunk/mcs/class/corlib/System/DateTime.cs
===================================================================
--- trunk/mcs/class/corlib/System/DateTime.cs   2005-05-25 08:21:36 UTC (rev 
44980)
+++ trunk/mcs/class/corlib/System/DateTime.cs   2005-05-25 08:29:39 UTC (rev 
44981)
@@ -702,18 +702,17 @@
                        DateTimeFormatInfo dfi = DateTimeFormatInfo.GetInstance 
(fp);
 
                        bool longYear = false;
-                       // Try common formats.
-                       if (ParseExact (s, commonFormats, dfi, styles, out 
result, false, ref longYear))
-                               return result;
 
-                       // Try common formats, also with invariant culture
-                       if (ParseExact (s, commonFormats, 
DateTimeFormatInfo.InvariantInfo, styles, out result, false, ref longYear))
+                       // Try all the patterns
+                       if (ParseExact (s, dfi.GetAllDateTimePatterns (), dfi, 
styles, out result, false, ref longYear))
                                return result;
 
-                       // Next, try all the patterns
-                       string [] patterns = new string [] {"d", "D", "g", "G", 
"f", "F", "m", "M", "r", "R", "s", "t", "T", "u", "U", "y", "Y"};
+                       // Try common formats.
+//                     if (ParseExact (s, commonFormats, dfi, styles, out 
result, false, ref longYear))
+//                             return result;
 
-                       if (ParseExact (s, patterns, dfi, styles, out result, 
false, ref longYear))
+                       // Try common formats with invariant culture
+                       if (ParseExact (s, commonFormats, 
DateTimeFormatInfo.InvariantInfo, styles, out result, false, ref longYear))
                                return result;
 
                        if (longYear) {
@@ -730,6 +729,7 @@
                }
 
                internal static int _ParseNumber (string s, int valuePos,
+                                                 int min_digits,
                                                  int digits,
                                                  bool leadingzero,
                                                  bool sloppy_parsing,
@@ -751,6 +751,10 @@
 
                                digits = real_digits;
                        }
+                       if (digits < min_digits) {
+                               num_parsed = -1;
+                               return 0;
+                       }
 
                        if (s.Length - valuePos < digits) {
                                num_parsed = -1;
@@ -951,9 +955,9 @@
                                        if (day != -1)
                                                return false;
                                        if (num == 0)
-                                               day = _ParseNumber (s, 
valuePos, 2, false, sloppy_parsing, out num_parsed);
+                                               day = _ParseNumber (s, 
valuePos,0, 2, false, sloppy_parsing, out num_parsed);
                                        else if (num == 1)
-                                               day = _ParseNumber (s, 
valuePos, 2, true, sloppy_parsing, out num_parsed);
+                                               day = _ParseNumber (s, 
valuePos,0, 2, true, sloppy_parsing, out num_parsed);
                                        else if (num == 2)
                                                dayofweek = _ParseEnum (s, 
valuePos, dfi.AbbreviatedDayNames, out num_parsed);
                                        else
@@ -966,9 +970,9 @@
                                        if (month != -1)
                                                return false;
                                        if (num == 0)
-                                               month = _ParseNumber (s, 
valuePos, 2, false, sloppy_parsing, out num_parsed);
+                                               month = _ParseNumber (s, 
valuePos, 0, 2, false, sloppy_parsing, out num_parsed);
                                        else if (num == 1)
-                                               month = _ParseNumber (s, 
valuePos, 2, true, sloppy_parsing, out num_parsed);
+                                               month = _ParseNumber (s, 
valuePos, 0, 2, true, sloppy_parsing, out num_parsed);
                                        else if (num == 2)
                                                month = _ParseEnum (s, 
valuePos, dfi.AbbreviatedMonthNames , out num_parsed) + 1;
                                        else
@@ -982,14 +986,14 @@
                                                return false;
 
                                        if (num == 0) {
-                                               year = _ParseNumber (s, 
valuePos, 2, false, sloppy_parsing, out num_parsed);
+                                               year = _ParseNumber (s, 
valuePos,0, 2, false, sloppy_parsing, out num_parsed);
                                        } else if (num < 3) {
-                                               year = _ParseNumber (s, 
valuePos, 2, true, sloppy_parsing, out num_parsed);
+                                               year = _ParseNumber (s, 
valuePos,0, 2, true, sloppy_parsing, out num_parsed);
                                        } else {
-                                               year = _ParseNumber (s, 
valuePos, 4, false, sloppy_parsing, out num_parsed);
+                                               year = _ParseNumber (s, 
valuePos,4, 4, false, sloppy_parsing, out num_parsed);
                                                if ((year >= 1000) && 
(num_parsed == 4) && (!longYear) && (s.Length > 4 + valuePos)) {
                                                        int np = 0;
-                                                       int ly = _ParseNumber 
(s, valuePos, 5, false, sloppy_parsing, out np);
+                                                       int ly = _ParseNumber 
(s, valuePos, 5, 5, false, sloppy_parsing, out np);
                                                        longYear = (ly > 9999);
                                                }
                                                num = 3;
@@ -1003,10 +1007,10 @@
                                        if (hour != -1)
                                                return false;
                                        if (num == 0)
-                                               hour = _ParseNumber (s, 
valuePos, 2, false, sloppy_parsing, out num_parsed);
+                                               hour = _ParseNumber (s, 
valuePos,0, 2, false, sloppy_parsing, out num_parsed);
                                        else
                                        {
-                                               hour = _ParseNumber (s, 
valuePos, 2, true, sloppy_parsing, out num_parsed);
+                                               hour = _ParseNumber (s, 
valuePos,0, 2, true, sloppy_parsing, out num_parsed);
                                                num = 1;
                                        }
 
@@ -1020,10 +1024,10 @@
                                        if ((hour != -1) || (ampm >= 0))
                                                return false;
                                        if (num == 0)
-                                               hour = _ParseNumber (s, 
valuePos, 2, false, sloppy_parsing, out num_parsed);
+                                               hour = _ParseNumber (s, 
valuePos,0, 2, false, sloppy_parsing, out num_parsed);
                                        else
                                        {
-                                               hour = _ParseNumber (s, 
valuePos, 2, true, sloppy_parsing, out num_parsed);
+                                               hour = _ParseNumber (s, 
valuePos,0, 2, true, sloppy_parsing, out num_parsed);
                                                num = 1;
                                        }
                                        if (hour >= 24)
@@ -1035,10 +1039,10 @@
                                        if (minute != -1)
                                                return false;
                                        if (num == 0)
-                                               minute = _ParseNumber (s, 
valuePos, 2, false, sloppy_parsing, out num_parsed);
+                                               minute = _ParseNumber (s, 
valuePos, 0, 2, false, sloppy_parsing, out num_parsed);
                                        else
                                        {
-                                               minute = _ParseNumber (s, 
valuePos, 2, true, sloppy_parsing, out num_parsed);
+                                               minute = _ParseNumber (s, 
valuePos, 0, 2, true, sloppy_parsing, out num_parsed);
                                                num = 1;
                                        }
                                        if (minute >= 60)
@@ -1049,10 +1053,10 @@
                                        if (second != -1)
                                                return false;
                                        if (num == 0)
-                                               second = _ParseNumber (s, 
valuePos, 2, false, sloppy_parsing, out num_parsed);
+                                               second = _ParseNumber (s, 
valuePos, 0, 2, false, sloppy_parsing, out num_parsed);
                                        else
                                        {
-                                               second = _ParseNumber (s, 
valuePos, 2, true, sloppy_parsing, out num_parsed);
+                                               second = _ParseNumber (s, 
valuePos, 0, 2, true, sloppy_parsing, out num_parsed);
                                                num = 1;
                                        }
                                        if (second >= 60)
@@ -1063,7 +1067,7 @@
                                        if (fractionalSeconds != -1)
                                                return false;
                                        num = Math.Min (num, 6);
-                                       double decimalNumber = (double) 
_ParseNumber (s, valuePos, num+1, true, sloppy_parsing, out num_parsed);
+                                       double decimalNumber = (double) 
_ParseNumber (s, valuePos, 0, num+1, true, sloppy_parsing, out num_parsed);
                                        if (num_parsed == -1)
                                                return false;
 
@@ -1104,12 +1108,12 @@
                                                return false;
                                        valuePos++;
                                        if (num == 0)
-                                               tzoffset = _ParseNumber (s, 
valuePos, 2, false, sloppy_parsing, out num_parsed);
+                                               tzoffset = _ParseNumber (s, 
valuePos, 0, 2, false, sloppy_parsing, out num_parsed);
                                        else if (num == 1)
-                                               tzoffset = _ParseNumber (s, 
valuePos, 2, true, sloppy_parsing, out num_parsed);
+                                               tzoffset = _ParseNumber (s, 
valuePos, 0, 2, true, sloppy_parsing, out num_parsed);
                                        else
                                        {
-                                               tzoffset = _ParseNumber (s, 
valuePos, 2, true, sloppy_parsing, out num_parsed);
+                                               tzoffset = _ParseNumber (s, 
valuePos, 0, 2, true, sloppy_parsing, out num_parsed);
                                                if (num_parsed < 0)
                                                        return false;
                                                valuePos += num_parsed;
@@ -1118,7 +1122,7 @@
                                                else if (!_ParseString (s, 
valuePos, 0, dfi.TimeSeparator, out num_parsed))
                                                        return false;
                                                valuePos += num_parsed;
-                                               tzoffmin = _ParseNumber (s, 
valuePos, 2, true, sloppy_parsing, out num_parsed);
+                                               tzoffmin = _ParseNumber (s, 
valuePos, 0, 2, true, sloppy_parsing, out num_parsed);
                                                if (num_parsed < 0)
                                                        return false;
                                                num = 2;

Modified: trunk/mcs/class/corlib/Test/System/ChangeLog
===================================================================
--- trunk/mcs/class/corlib/Test/System/ChangeLog        2005-05-25 08:21:36 UTC 
(rev 44980)
+++ trunk/mcs/class/corlib/Test/System/ChangeLog        2005-05-25 08:29:39 UTC 
(rev 44981)
@@ -1,5 +1,10 @@
 2005-05-25  Atsushi Enomoto  <[EMAIL PROTECTED]>
 
+       * DateTimeTest.cs : added testcase for #72788. Test that assures we
+         reject 2 digit years for "yyyy".
+
+2005-05-25  Atsushi Enomoto  <[EMAIL PROTECTED]>
+
        * DateTimeTest.cs : removed some NotWorking (they are working).
          Added testcase for #63137.
 

Modified: trunk/mcs/class/corlib/Test/System/DateTimeTest.cs
===================================================================
--- trunk/mcs/class/corlib/Test/System/DateTimeTest.cs  2005-05-25 08:21:36 UTC 
(rev 44980)
+++ trunk/mcs/class/corlib/Test/System/DateTimeTest.cs  2005-05-25 08:29:39 UTC 
(rev 44981)
@@ -730,9 +730,9 @@
        }
 
        [Test]
-       // bug #71289
        public void TestParse5 ()
        {
+               // bug #71289
                DateTime.Parse ("Sat,,,,,, 01 Oct 1994 03:00:00",
                        CultureInfo.InvariantCulture);
                // more example...
@@ -747,6 +747,19 @@
                } catch (FormatException) {
                }
 #endif
+
+               // bug #72788
+               DateTime dt = DateTime.Parse ("21/02/05", new CultureInfo 
("fr-FR"));
+               AssertEquals (2005, dt.Year);
+               AssertEquals (02, dt.Month);
+               AssertEquals (21, dt.Day);
+
+               // don't allow 2 digit years where we require 4.
+               try {
+                       DateTime.ParseExact ("05", "yyyy", 
CultureInfo.InvariantCulture);
+                       Fail ("Reject 2 digit years for yyyy");
+               } catch (FormatException) {
+               }
        }
 
        [Test]

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to