[PATCH] ucrtbase: Implement %g format for strftime.

Vijay Kiran Kamuju infyquest at gmail.com
Tue Oct 29 08:43:52 CDT 2019


Signed-off-by: Vijay Kiran Kamuju <infyquest at gmail.com>
---
 dlls/msvcrt/time.c         | 11 +++++++++--
 dlls/ucrtbase/tests/misc.c | 15 +++++++++++++++
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcrt/time.c b/dlls/msvcrt/time.c
index 8f4d64b3618c..9787d18e3f4e 100644
--- a/dlls/msvcrt/time.c
+++ b/dlls/msvcrt/time.c
@@ -1196,14 +1196,21 @@ static MSVCRT_size_t strftime_helper(char *str, MSVCRT_size_t max, const char *f
             if(!strftime_int(str, &ret, max, mstm->tm_mday, alternate ? 0 : 2, 0, 31))
                 return 0;
             break;
+        case 'g':
         case 'G':
             tmp = 1900 + mstm->tm_year;
             if (mstm->tm_yday - (mstm->tm_wday ? mstm->tm_wday : 7) + 4 < 0)
                 tmp--;
             else if(mstm->tm_yday - (mstm->tm_wday ? mstm->tm_wday : 7) + 5 > 365 + IsLeapYear(tmp))
                 tmp++;
-            if (!strftime_int(str, &ret, max, tmp, 4, 0, 9999))
-                return 0;
+            if(*format == 'G')
+            {
+                if (!strftime_int(str, &ret, max, tmp, 4, 0, 9999))
+                     return 0;
+            } else {
+                if (!strftime_int(str, &ret, max, tmp%100, 2, 0, 99))
+                     return 0;
+            }
             break;
 #endif
         case 'H':
diff --git a/dlls/ucrtbase/tests/misc.c b/dlls/ucrtbase/tests/misc.c
index 9cfe532560d8..8a6fb7b8e11b 100644
--- a/dlls/ucrtbase/tests/misc.c
+++ b/dlls/ucrtbase/tests/misc.c
@@ -968,6 +968,14 @@ static void test_strftime(void)
     ok(retA == 1, "expected 1, got %d\n", (int)retA);
     ok(!strcmp(bufA, "\t"), "got %s\n", bufA);
 
+    retA = p_strftime(bufA, sizeof(bufA), "%g", &epoch);
+    ok(retA == 2, "expected 2, got %d\n", (int)retA);
+    ok(!strcmp(bufA, "70"), "got %s\n", bufA);
+
+    retA = p_strftime(bufA, sizeof(bufA), "%g", &tm1);
+    ok(retA == 2, "expected 2, got %d\n", (int)retA);
+    ok(!strcmp(bufA, "16"), "got %s\n", bufA);
+
     retA = p_strftime(bufA, sizeof(bufA), "%G", &epoch);
     ok(retA == 4, "expected 4, got %d\n", (int)retA);
     ok(!strcmp(bufA, "1970"), "got %s\n", bufA);
@@ -981,6 +989,13 @@ static void test_strftime(void)
         __time32_t t = (365*2 + i - 7) * 24 * 60 * 60;
         struct tm tm = *p__gmtime32(&t);
 
+        retA = p_strftime(bufA, sizeof(bufA), "%g", &tm);
+        ok(retA == 2, "%d) retA = %d\n", i, (int)retA);
+        if (i <= 8)
+            ok(!strcmp(bufA, "71"), "%d) got %s, expected 71\n", i, bufA);
+        else
+            ok(!strcmp(bufA, "72"), "%d) got %s, expected 72\n", i, bufA);
+
         retA = p_strftime(bufA, sizeof(bufA), "%G", &tm);
         ok(retA == 4, "%d) retA = %d\n", i, (int)retA);
         if (i <= 8)
-- 
2.21.0




More information about the wine-devel mailing list