Daniel Lehman : oleaut32: Treat years 0 to 29 as 2000 to 2029 in VARIANT_RollUdate.

Alexandre Julliard julliard at winehq.org
Thu Apr 19 13:27:52 CDT 2012


Module: wine
Branch: master
Commit: cc37abb6589a1aa9862624c77a45b32c9a36dca1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=cc37abb6589a1aa9862624c77a45b32c9a36dca1

Author: Daniel Lehman <dlehman at esri.com>
Date:   Wed Apr 18 13:01:56 2012 -0700

oleaut32: Treat years 0 to 29 as 2000 to 2029 in VARIANT_RollUdate.

---

 dlls/oleaut32/tests/vartest.c |    5 ++++-
 dlls/oleaut32/variant.c       |    7 +++++--
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/dlls/oleaut32/tests/vartest.c b/dlls/oleaut32/tests/vartest.c
index a79481a..770ea5f 100644
--- a/dlls/oleaut32/tests/vartest.c
+++ b/dlls/oleaut32/tests/vartest.c
@@ -1742,7 +1742,10 @@ static void test_SystemTimeToVariantTime(void)
   ST2DT(2,1,1980,0,0,0,0,TRUE,29222.0);
   ST2DT(0,1,1980,0,0,0,0,TRUE,29220.0);   /* Rolls back to 31 Dec 1899 */
   ST2DT(1,13,1980,0,0,0,0,FALSE,29587.0); /* Fails on invalid month */
-  ST2DT(31,12,90,0,0,0,0,TRUE,33238.0);   /* year < 100 is 1900+year! */
+  ST2DT(31,12,90,0,0,0,0,TRUE,33238.0);   /* 30 <= year < 100 is 1900+year */
+  ST2DT(1,1,30,0,0,0,0,TRUE,10959.0);     /* 30 <= year < 100 is 1900+year */
+  ST2DT(1,1,29,0,0,0,0,TRUE,47119.0);     /* 0 <= year < 30 is 2000+year */
+  ST2DT(1,1,0,0,0,0,0,TRUE,36526.0);      /* 0 <= year < 30 is 2000+year */
 }
 
 static void test_dt2st(int line, double dt, INT r, WORD d, WORD m, WORD y,
diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c
index 0d1f2cc..2d6e2ce 100644
--- a/dlls/oleaut32/variant.c
+++ b/dlls/oleaut32/variant.c
@@ -1143,8 +1143,11 @@ static HRESULT VARIANT_RollUdate(UDATE *lpUd)
 
   if (iYear > 9999 || iYear < -9999)
     return E_INVALIDARG; /* Invalid value */
-  /* Years < 100 are treated as 1900 + year */
-  if (iYear > 0 && iYear < 100)
+  /* Year 0 to 29 are treated as 2000 + year */
+  if (iYear >= 0 && iYear < 30)
+    iYear += 2000;
+  /* Remaining years < 100 are treated as 1900 + year */
+  else if (iYear >= 30 && iYear < 100)
     iYear += 1900;
 
   iMinute += iSecond / 60;




More information about the wine-cvs mailing list