Module: wine Branch: master Commit: 64b2ce4bcbe898834768b020f2d005846bc525c1 URL: https://source.winehq.org/git/wine.git/?a=commit;h=64b2ce4bcbe898834768b020f...
Author: Ziqing Hui zhui@codeweavers.com Date: Mon Feb 21 11:00:36 2022 +0800
wininet: Support more internet time format.
Signed-off-by: Ziqing Hui zhui@codeweavers.com Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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 c17916bb2bd..4d512e4ef39 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 }, };