Jeff Smith : ucrtbase: Strftime returns 4-digit timezone for %z.

Alexandre Julliard julliard at winehq.org
Wed Nov 13 16:01:13 CST 2019


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

Author: Jeff Smith <whydoubt at gmail.com>
Date:   Wed Nov 13 22:07:42 2019 +0100

ucrtbase: Strftime returns 4-digit timezone for %z.

Signed-off-by: Jeff Smith <whydoubt at gmail.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcrt/time.c         | 30 ++++++++++++++++++++++++++++++
 dlls/ucrtbase/tests/misc.c |  6 ++++++
 2 files changed, 36 insertions(+)

diff --git a/dlls/msvcrt/time.c b/dlls/msvcrt/time.c
index 9787d18e3f..faff48221e 100644
--- a/dlls/msvcrt/time.c
+++ b/dlls/msvcrt/time.c
@@ -1033,6 +1033,30 @@ static inline BOOL strftime_time(char *str, MSVCRT_size_t *pos, MSVCRT_size_t ma
     return TRUE;
 }
 
+static inline BOOL strftime_tzdiff(char *str, MSVCRT_size_t *pos, MSVCRT_size_t max, BOOL is_dst)
+{
+    MSVCRT_long tz = MSVCRT___timezone + (is_dst ? MSVCRT__dstbias : 0);
+    MSVCRT_size_t len;
+    char sign;
+
+    if(tz < 0) {
+        sign = '+';
+        tz = -tz;
+    }else {
+        sign = '-';
+    }
+
+    len = MSVCRT__snprintf(str+*pos, max-*pos, "%c%02u%02u", sign, tz/60/60, tz/60%60);
+    if(len == -1) {
+        *str = 0;
+        *MSVCRT__errno() = MSVCRT_ERANGE;
+        return FALSE;
+    }
+
+    *pos += len;
+    return TRUE;
+}
+
 static inline BOOL strftime_str(char *str, MSVCRT_size_t *pos, MSVCRT_size_t max, char *src)
 {
     MSVCRT_size_t len = strlen(src);
@@ -1300,6 +1324,12 @@ static MSVCRT_size_t strftime_helper(char *str, MSVCRT_size_t max, const char *f
                 return 0;
             break;
         case 'z':
+#if _MSVCR_VER>=140
+            MSVCRT__tzset();
+            if(!strftime_tzdiff(str, &ret, max, mstm->tm_isdst))
+                return 0;
+            break;
+#endif
         case 'Z':
             MSVCRT__tzset();
             if(MSVCRT__get_tzname(&tmp, str+ret, max-ret, mstm->tm_isdst ? 1 : 0))
diff --git a/dlls/ucrtbase/tests/misc.c b/dlls/ucrtbase/tests/misc.c
index fb81cf220e..cee37fc426 100644
--- a/dlls/ucrtbase/tests/misc.c
+++ b/dlls/ucrtbase/tests/misc.c
@@ -1001,6 +1001,12 @@ static void test_strftime(void)
     todo_wine ok(retA == 2, "expected 2, got %d\n", (int)retA);
     todo_wine ok(!strcmp(bufA, "53"), "got %s\n", bufA);
 
+    retA = p_strftime(bufA, sizeof(bufA), "%z", &tm2);
+    ok(retA == 5, "expected 5, got %d\n", (int)retA);
+    ok((bufA[0] == '+' || bufA[0] == '-') &&
+        isdigit(bufA[1]) && isdigit(bufA[2]) &&
+        isdigit(bufA[3]) && isdigit(bufA[4]), "got %s\n", bufA);
+
     for(i=0; i<14; i++)
     {
         __time32_t t = (365*2 + i - 7) * 24 * 60 * 60;




More information about the wine-cvs mailing list