oleaut32: be more explicit with locale dependent parsing of dates (try 2)

André Hentschel nerv at dawncrow.de
Wed Apr 14 13:51:05 CDT 2010


more generic version
---
 dlls/oleaut32/tests/vartype.c |    4 ++++
 dlls/oleaut32/vartype.c       |    8 ++++++--
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/dlls/oleaut32/tests/vartype.c b/dlls/oleaut32/tests/vartype.c
index d785a59..5732b80 100644
--- a/dlls/oleaut32/tests/vartype.c
+++ b/dlls/oleaut32/tests/vartype.c
@@ -3436,10 +3436,14 @@ static void test_VarDateFromStr(void)
   /* Native fails "1999 January 3, 9AM". I consider that a bug in native */
 
   /* test a non-english data string */
+  DFS("02.01.1970"); EXPECT_MISMATCH;
   DFS("02.01.1970 00:00:00"); EXPECT_MISMATCH;
   lcid = MAKELCID(MAKELANGID(LANG_GERMAN,SUBLANG_GERMAN),SORT_DEFAULT);
   DFS("02.01.1970"); EXPECT_DBL(25570.0);
   DFS("02.01.1970 00:00:00"); EXPECT_DBL(25570.0);
+  lcid = MAKELCID(MAKELANGID(LANG_SPANISH,SUBLANG_SPANISH),SORT_DEFAULT);
+  DFS("02.01.1970"); EXPECT_MISMATCH;
+  DFS("02.01.1970 00:00:00"); EXPECT_MISMATCH;
 }
 
 static void test_VarDateCopy(void)
diff --git a/dlls/oleaut32/vartype.c b/dlls/oleaut32/vartype.c
index cfd5e8f..29382b3 100644
--- a/dlls/oleaut32/vartype.c
+++ b/dlls/oleaut32/vartype.c
@@ -7437,6 +7437,7 @@ HRESULT WINAPI VarDateFromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, DATE* pd
   BSTR tokens[sizeof(ParseDateTokens)/sizeof(ParseDateTokens[0])];
   DATEPARSE dp;
   DWORD dwDateSeps = 0, iDate = 0;
+  CHAR ShortDate[16];
   HRESULT hRet = S_OK;
 
   if ((dwFlags & (VAR_TIMEVALUEONLY|VAR_DATEVALUEONLY)) ==
@@ -7455,6 +7456,9 @@ HRESULT WINAPI VarDateFromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, DATE* pd
   GetLocaleInfoW(lcid, LOCALE_IDATE|LOCALE_RETURN_NUMBER|(dwFlags & LOCALE_NOUSEROVERRIDE),
                  (LPWSTR)&iDate, sizeof(iDate)/sizeof(WCHAR));
   TRACE("iDate is %d\n", iDate);
+  GetLocaleInfoA(lcid, LOCALE_SSHORTDATE|(dwFlags & LOCALE_NOUSEROVERRIDE),
+                 (LPSTR)&ShortDate, sizeof(ShortDate)/sizeof(CHAR));
+  TRACE("ShortDate is %s\n", ShortDate);
 
   /* Get the month/day/am/pm tokens for this locale */
   for (i = 0; i < sizeof(tokens)/sizeof(tokens[0]); i++)
@@ -7607,7 +7611,7 @@ HRESULT WINAPI VarDateFromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, DATE* pd
       break;
 
     case 0x3: /* TTT TTTDD TTTDDD */
-      if (iDate && dp.dwCount == 3)
+      if (dp.dwCount == 3 && !strncmp(ShortDate,"dd.MM.yy",8))
         {
           /* DDD */
           if ((dp.dwFlags[0] & (DP_AM|DP_PM)) || (dp.dwFlags[1] & (DP_AM|DP_PM)) ||
@@ -7708,7 +7712,7 @@ HRESULT WINAPI VarDateFromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, DATE* pd
       break;
 
     case 0x1B: /* localized DDDTTT */
-      if (!iDate)
+      if (strncmp(ShortDate,"dd.MM.yy",8))
         {
           hRet = DISP_E_TYPEMISMATCH;
           break;
-- 

Best Regards, André Hentschel



More information about the wine-patches mailing list