Akihiro Sagawa : shlwapi: Fix wnsprintfW/wvnsprintfW %S conversion.
Alexandre Julliard
julliard at winehq.org
Mon Feb 10 16:32:46 CST 2020
Module: wine
Branch: master
Commit: 6f8ae18cd78f4779dc459664fe53777e63391363
URL: https://source.winehq.org/git/wine.git/?a=commit;h=6f8ae18cd78f4779dc459664fe53777e63391363
Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date: Sun Feb 9 20:51:38 2020 +0900
shlwapi: Fix wnsprintfW/wvnsprintfW %S conversion.
Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/shlwapi/wsprintf.c | 27 ++++++++++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/dlls/shlwapi/wsprintf.c b/dlls/shlwapi/wsprintf.c
index 9d4088cc25..f2e5f0ace1 100644
--- a/dlls/shlwapi/wsprintf.c
+++ b/dlls/shlwapi/wsprintf.c
@@ -258,8 +258,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:
@@ -506,7 +520,14 @@ INT WINAPI wvnsprintfW( LPWSTR buffer, INT maxlen, LPCWSTR spec, __ms_va_list ar
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