[PATCH v2] wininet: Support more internet time format.

Ziqing Hui zhui at codeweavers.com
Sun Feb 20 21:00:36 CST 2022


Signed-off-by: Ziqing Hui <zhui at codeweavers.com>
---

v2: * Introduce is_time_digit().
    * Use wcstol() for converting wDayOfWeek.

 dlls/wininet/internet.c       | 59 ++++++++++++++++++++++++-----------
 dlls/wininet/tests/internet.c | 16 +++++-----
 2 files changed, 49 insertions(+), 26 deletions(-)

diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index 59fae2fbc95..b41994f5b22 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -3302,6 +3302,11 @@ static const WCHAR WININET_month[12][4] =
       L"May", L"Jun", L"Jul", L"Aug",
       L"Sep", L"Oct", L"Nov", L"Dec"};
 
+static inline BOOL is_time_digit(const WCHAR c)
+{
+    return c >= '0' && c <= '9';
+}
+
 /***********************************************************************
  *           InternetTimeFromSystemTimeA (WININET.@)
  */
@@ -3400,54 +3405,72 @@ BOOL WINAPI InternetTimeToSystemTimeW( LPCWSTR string, SYSTEMTIME* time, DWORD r
      *  a SYSTEMTIME structure.
      */
 
-    while (*s && !iswalpha( *s )) s++;
-    if (s[0] == '\0' || s[1] == '\0' || s[2] == '\0') return TRUE;
+    while (*s && !iswalpha(*s) && !is_time_digit(*s)) s++;
+    if (*s == '\0') return TRUE;
     time->wDayOfWeek = 7;
 
-    for (i = 0; i < 7; i++)
+    if (iswalpha(*s))
     {
-        if (!wcsnicmp( WININET_wkday[i], s, 3 ))
+        if (s[1] == '\0' || s[2] == '\0') return TRUE;
+        for (i = 0; i < 7; i++)
         {
-            time->wDayOfWeek = i;
-            break;
+            if (!wcsnicmp(WININET_wkday[i], s, 3))
+            {
+                time->wDayOfWeek = i;
+                break;
+            }
         }
     }
-
+    else if (is_time_digit(*s))
+    {
+        time->wDayOfWeek = wcstol(s, &end, 10);
+        s = end;
+    }
     if (time->wDayOfWeek > 6) return TRUE;
-    while (*s && !iswdigit( *s )) s++;
+
+    while (*s && !is_time_digit(*s)) s++;
     time->wDay = wcstol( s, &end, 10 );
     s = end;
 
-    while (*s && !iswalpha( *s )) s++;
-    if (s[0] == '\0' || s[1] == '\0' || s[2] == '\0') return TRUE;
+    while (*s && !iswalpha(*s) && !is_time_digit(*s)) s++;
+    if (*s == '\0') return TRUE;
     time->wMonth = 0;
 
-    for (i = 0; i < 12; i++)
+    if (iswalpha(*s))
     {
-        if (!wcsnicmp( WININET_month[i], s, 3 ))
+        if (s[1] == '\0' || s[2] == '\0') return TRUE;
+        for (i = 0; i < 12; i++)
         {
-            time->wMonth = i + 1;
-            break;
+            if (!wcsnicmp(WININET_month[i], s, 3))
+            {
+                time->wMonth = i + 1;
+                break;
+            }
         }
     }
+    else if (is_time_digit(*s))
+    {
+        time->wMonth = wcstol(s, &end, 10);
+        s = end;
+    }
     if (time->wMonth == 0) return TRUE;
 
-    while (*s && !iswdigit( *s )) s++;
+    while (*s && !is_time_digit(*s)) s++;
     if (*s == '\0') return TRUE;
     time->wYear = wcstol( s, &end, 10 );
     s = end;
 
-    while (*s && !iswdigit( *s )) s++;
+    while (*s && !is_time_digit(*s)) s++;
     if (*s == '\0') return TRUE;
     time->wHour = wcstol( s, &end, 10 );
     s = end;
 
-    while (*s && !iswdigit( *s )) s++;
+    while (*s && !is_time_digit(*s)) s++;
     if (*s == '\0') return TRUE;
     time->wMinute = wcstol( s, &end, 10 );
     s = end;
 
-    while (*s && !iswdigit( *s )) s++;
+    while (*s && !is_time_digit(*s)) s++;
     if (*s == '\0') return TRUE;
     time->wSecond = wcstol( s, &end, 10 );
     s = end;
diff --git a/dlls/wininet/tests/internet.c b/dlls/wininet/tests/internet.c
index 8fc72be8431..19d6ae7e639 100644
--- a/dlls/wininet/tests/internet.c
+++ b/dlls/wininet/tests/internet.c
@@ -917,14 +917,14 @@ static void test_InternetTimeToSystemTime(void)
     {
         { "Fri, 07 Jan 2005 12:06:35 GMT", &expect1, TRUE },
         { " fri, 7 jan 2005 12 06 35",     &expect1, TRUE },
-        { "Fri, 07-01-2005 12:06:35",      &expect1, TRUE, TRUE },
-        { "5, 07-01-2005 12:06:35 GMT",    &expect1, TRUE, TRUE },
-        { "5, 07-01-2005 12:06:35 GMT;",   &expect1, TRUE, TRUE },
-        { "5, 07-01-2005 12:06:35 GMT123", &expect1, TRUE, TRUE },
-        { "2, 11 01 2022 11 13 05",        &expect2, TRUE, TRUE },
-        { "2, 11-01-2022 11#13^05",        &expect2, TRUE, TRUE },
-        { "2, 11*01/2022 11+13=05",        &expect2, TRUE, TRUE },
-        { "2, 11-Jan-2022 11:13:05",       &expect2, TRUE, TRUE },
+        { "Fri, 07-01-2005 12:06:35",      &expect1, TRUE },
+        { "5, 07-01-2005 12:06:35 GMT",    &expect1, TRUE },
+        { "5, 07-01-2005 12:06:35 GMT;",   &expect1, TRUE },
+        { "5, 07-01-2005 12:06:35 GMT123", &expect1, TRUE },
+        { "2, 11 01 2022 11 13 05",        &expect2, TRUE },
+        { "2, 11-01-2022 11#13^05",        &expect2, TRUE },
+        { "2, 11*01/2022 11+13=05",        &expect2, TRUE },
+        { "2, 11-Jan-2022 11:13:05",       &expect2, TRUE },
         { "Fr",                            NULL,     FALSE },
     };
 
-- 
2.25.1




More information about the wine-devel mailing list