Akihiro Sagawa : user32: Fix wsprintfW %S conversion.

Alexandre Julliard julliard at winehq.org
Mon Feb 10 16:32:45 CST 2020


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

Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date:   Sun Feb  9 20:51:37 2020 +0900

user32: Fix wsprintfW %S conversion.

Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/tests/wsprintf.c |  3 +--
 dlls/user32/wsprintf.c       | 27 ++++++++++++++++++++++++---
 2 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/dlls/user32/tests/wsprintf.c b/dlls/user32/tests/wsprintf.c
index e5317bdef0..c7be43a08f 100644
--- a/dlls/user32/tests/wsprintf.c
+++ b/dlls/user32/tests/wsprintf.c
@@ -188,12 +188,11 @@ static void wsprintfWTest(void)
         memset(buf, 0x11, sizeof(buf));
         rc = wsprintfW(buf, testcase[i].fmt, testcase[i].input);
 
-        todo_wine_if (i == 2)
         ok(rc == testcase[i].rc,
            "%u: expected %d, got %d\n",
            i, testcase[i].rc, rc);
 
-        todo_wine ok(!memcmp(buf, testcase[i].str, (testcase[i].rc + 1) * sizeof(WCHAR)),
+        ok(!memcmp(buf, testcase[i].str, (testcase[i].rc + 1) * sizeof(WCHAR)),
            "%u: expected %s, got %s\n", i,
            wine_dbgstr_wn(testcase[i].str, testcase[i].rc + 1),
            wine_dbgstr_wn(buf, rc + 1));
diff --git a/dlls/user32/wsprintf.c b/dlls/user32/wsprintf.c
index 478583d926..e5e6c10dbb 100644
--- a/dlls/user32/wsprintf.c
+++ b/dlls/user32/wsprintf.c
@@ -259,8 +259,22 @@ static UINT WPRINTF_GetLen( WPRINTF_FORMAT *format, WPRINTF_DATA *arg,
         return (format->precision = 1);
     case WPR_STRING:
         if (!arg->lpcstr_view) arg->lpcstr_view = null_stringA;
-        for (len = 0; !format->precision || (len < format->precision); len++)
-            if (!*(arg->lpcstr_view + len)) break;
+        if (dst_is_wide)
+        {
+            LPCSTR p = arg->lpcstr_view;
+            for (len = 0; (!format->precision || len < format->precision) && *p; p++)
+            {
+                /* This isn't applicable for UTF-8 and UTF-7 */
+                if (IsDBCSLeadByte( *p )) p++;
+                len++;
+                if (!*p) break;
+            }
+        }
+        else
+        {
+            for (len = 0; !format->precision || (len < format->precision); len++)
+                if (!*(arg->lpcstr_view + len)) break;
+        }
         if (len > maxlen) len = maxlen;
         return (format->precision = len);
     case WPR_WSTRING:
@@ -494,7 +508,14 @@ static INT wvsnprintfW( LPWSTR buffer, UINT maxlen, LPCWSTR spec, __ms_va_list a
         case WPR_STRING:
             {
                 LPCSTR ptr = argData.lpcstr_view;
-                for (i = 0; i < len; i++) *p++ = (BYTE)*ptr++;
+                for (i = 0; i < len; i++)
+                {
+                    WCHAR buf[2]; /* for LeadByte + NUL case, we need 2 WCHARs. */
+                    int ret, mb_len = IsDBCSLeadByte( *ptr ) ? 2 : 1;
+                    ret = MultiByteToWideChar( CP_ACP, 0, ptr, mb_len, buf, ARRAY_SIZE( buf ));
+                    *p++ = buf[ret - 1];
+                    ptr += mb_len;
+                }
             }
             break;
         case WPR_WSTRING:




More information about the wine-cvs mailing list