Francois Gouget : kernel32: Fix NLS_GetDateTimeFormatA() Unicode to ANSI conversion.

Alexandre Julliard julliard at winehq.org
Thu Aug 26 15:22:32 CDT 2021


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

Author: Francois Gouget <fgouget at codeweavers.com>
Date:   Thu Aug 26 18:26:36 2021 +0200

kernel32: Fix NLS_GetDateTimeFormatA() Unicode to ANSI conversion.

Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/lcformat.c     | 25 ++++++++-----------------
 dlls/kernel32/tests/locale.c | 16 ++--------------
 2 files changed, 10 insertions(+), 31 deletions(-)

diff --git a/dlls/kernel32/lcformat.c b/dlls/kernel32/lcformat.c
index a9dfbf09be2..5711d05b76f 100644
--- a/dlls/kernel32/lcformat.c
+++ b/dlls/kernel32/lcformat.c
@@ -737,7 +737,7 @@ invalid_flags:
 /******************************************************************************
  * NLS_GetDateTimeFormatA <internal>
  *
- * ASCII wrapper for GetDateFormatA/GetTimeFormatA.
+ * ANSI wrapper for GetDateFormatA/GetTimeFormatA.
  */
 static INT NLS_GetDateTimeFormatA(LCID lcid, DWORD dwFlags,
                                   const SYSTEMTIME* lpTime,
@@ -745,12 +745,12 @@ static INT NLS_GetDateTimeFormatA(LCID lcid, DWORD dwFlags,
 {
   DWORD cp = CP_ACP;
   WCHAR szFormat[128], szOut[128];
-  INT iRet;
+  INT iRet, cchOutW;
 
   TRACE("(0x%04x,0x%08x,%p,%s,%p,%d)\n", lcid, dwFlags, lpTime,
         debugstr_a(lpFormat), lpStr, cchOut);
 
-  if (NLS_IsUnicodeOnlyLcid(lcid))
+  if ((cchOut && !lpStr) || NLS_IsUnicodeOnlyLcid(lcid))
   {
     SetLastError(ERROR_INVALID_PARAMETER);
     return 0;
@@ -771,21 +771,12 @@ static INT NLS_GetDateTimeFormatA(LCID lcid, DWORD dwFlags,
   if (lpFormat)
     MultiByteToWideChar(cp, 0, lpFormat, -1, szFormat, ARRAY_SIZE(szFormat));
 
-  if (cchOut > (int) ARRAY_SIZE(szOut))
-    cchOut = ARRAY_SIZE(szOut);
-
-  szOut[0] = '\0';
-
+  /* If cchOut == 0 we need the full string to get the accurate ANSI size */
+  cchOutW = (cchOut && cchOut <= ARRAY_SIZE(szOut)) ? cchOut : ARRAY_SIZE(szOut);
   iRet = NLS_GetDateTimeFormatW(lcid, dwFlags, lpTime, lpFormat ? szFormat : NULL,
-                                lpStr ? szOut : NULL, cchOut);
-
-  if (lpStr)
-  {
-    if (szOut[0])
-      WideCharToMultiByte(cp, 0, szOut, iRet ? -1 : cchOut, lpStr, cchOut, 0, 0);
-    else if (cchOut && iRet)
-      *lpStr = '\0';
-  }
+                                szOut, cchOutW);
+  if (iRet)
+      iRet = WideCharToMultiByte(cp, 0, szOut, -1, lpStr, cchOut, NULL, NULL);
   return iRet;
 }
 
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 43dcf2a7dbf..fa0ec374d34 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -639,25 +639,18 @@ static void test_GetTimeFormatA(void)
   lcid = MAKELCID(MAKELANGID(LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN), SORT_DEFAULT);
 
   ret = GetTimeFormatA(lcid, 0, &curtime, "h\x93\xfa", buffer, 5);
-  if (broken(1)) /* FIXME Remove once Wine is less broken */
   expect_str(ret, buffer, "12\x93\xfa"); /* only 3+1 WCHARs */
-  todo_wine ok(ret == strlen("12\x93\xfa") + 1, "Expected ret %d, got %d\n", strlen("12\x93\xfa") + 1, ret);
-  ok(strcmp(buffer, "12\x93\xfa") == 0, "Expected '12\x93\xfa', got '%s'\n", buffer);
 
   ret = GetTimeFormatA(lcid, 0, &curtime, "h\x93\xfa", buffer, 4);
-  todo_wine expect_err(ret, NULL, ERROR_INSUFFICIENT_BUFFER);
+  expect_err(ret, NULL, ERROR_INSUFFICIENT_BUFFER);
   SetLastError(0xdeadbeef);
 
   ret = GetTimeFormatA(lcid, 0, &curtime, "h\x93\xfa", NULL, 0);
-  if (broken(1)) /* FIXME Remove once Wine is less broken */
   expect_str(ret, NULL, "12\x93\xfa");
-  todo_wine ok(ret == strlen("12\x93\xfa") + 1, "Expected ret %d, got %d\n", strlen("12\x93\xfa") + 1, ret);
 
   strcpy(buffer, "pristine"); /* clear previous identical result */
   ret = GetTimeFormatA(lcid, 0, &curtime, "h\x93\xfa", buffer, 0);
-  if (broken(1)) /* FIXME Remove once Wine is less broken */
   expect_str(ret, NULL, "12\x93\xfa");
-  todo_wine ok(ret == strlen("12\x93\xfa") + 1, "Expected ret %d, got %d\n", strlen("12\x93\xfa") + 1, ret);
   ok(strcmp(buffer, "pristine") == 0, "Expected a pristine buffer, got '%s'\n", buffer);
 }
 
@@ -967,20 +960,15 @@ static void test_GetDateFormatA(void)
    */
 
   ret = GetDateFormatA(lcid_ja, 0, &curtime, "d\x93\xfa", buffer, 4);
-  if (broken(1)) /* FIXME Remove once Wine is less broken */
   expect_str(ret, buffer, "4\x93\xfa"); /* only 2+1 WCHARs */
-  todo_wine ok(ret == strlen("4\x93\xfa") + 1, "Expected ret %d, got %d\n", strlen("4\x93\xfa") + 1, ret);
-  ok(strcmp(buffer, "4\x93\xfa") == 0, "Expected '4\x93\xfa', got '%s'\n", buffer);
 
   ret = GetDateFormatA(lcid_ja, 0, &curtime, "d\x93\xfa", buffer, 3);
-  todo_wine expect_err(ret, NULL, ERROR_INSUFFICIENT_BUFFER);
+  expect_err(ret, NULL, ERROR_INSUFFICIENT_BUFFER);
   SetLastError(0xdeadbeef);
 
   strcpy(buffer, "pristine"); /* clear previous identical result */
   ret = GetDateFormatA(lcid_ja, 0, &curtime, "d\x93\xfa", NULL, 0);
-  if (broken(1)) /* FIXME Remove once Wine is less broken */
   expect_str(ret, NULL, "4\x93\xfa");
-  todo_wine ok(ret == strlen("4\x93\xfa") + 1, "Expected ret %d, got %d\n", strlen("4\x93\xfa") + 1, ret);
 }
 
 static void test_GetDateFormatEx(void)




More information about the wine-cvs mailing list