Alexandre Julliard : kernelbase: Support UTF-8 as default Ansi codepage in MultiByteToWideChar().

Alexandre Julliard julliard at winehq.org
Mon Apr 11 15:54:59 CDT 2022


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Apr 11 17:26:46 2022 +0200

kernelbase: Support UTF-8 as default Ansi codepage in MultiByteToWideChar().

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernelbase/locale.c | 43 ++++++++++++++++---------------------------
 1 file changed, 16 insertions(+), 27 deletions(-)

diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c
index c0cd0307447..c807b1e0124 100644
--- a/dlls/kernelbase/locale.c
+++ b/dlls/kernelbase/locale.c
@@ -2283,11 +2283,6 @@ static int mbstowcs_utf8( DWORD flags, const char *src, int srclen, WCHAR *dst,
     DWORD reslen;
     NTSTATUS status;
 
-    if (flags & ~(MB_PRECOMPOSED | MB_COMPOSITE | MB_USEGLYPHCHARS | MB_ERR_INVALID_CHARS))
-    {
-        SetLastError( ERROR_INVALID_FLAGS );
-        return 0;
-    }
     if (!dstlen) dst = NULL;
     status = RtlUTF8ToUnicodeN( dst, dstlen * sizeof(WCHAR), &reslen, src, srclen );
     if (status == STATUS_SOME_NOT_MAPPED)
@@ -2528,24 +2523,12 @@ static int mbstowcs_dbcs( const CPTABLEINFO *info, const unsigned char *src, int
 }
 
 
-static int mbstowcs_codepage( UINT codepage, DWORD flags, const char *src, int srclen,
+static int mbstowcs_codepage( const CPTABLEINFO *info, DWORD flags, const char *src, int srclen,
                               WCHAR *dst, int dstlen )
 {
     CPTABLEINFO local_info;
-    const CPTABLEINFO *info = get_codepage_table( codepage );
     const unsigned char *str = (const unsigned char *)src;
 
-    if (!info)
-    {
-        SetLastError( ERROR_INVALID_PARAMETER );
-        return 0;
-    }
-    if (flags & ~(MB_PRECOMPOSED | MB_COMPOSITE | MB_USEGLYPHCHARS | MB_ERR_INVALID_CHARS))
-    {
-        SetLastError( ERROR_INVALID_FLAGS );
-        return 0;
-    }
-
     if ((flags & MB_USEGLYPHCHARS) && info->MultiByteTable[256] == 256)
     {
         local_info = *info;
@@ -6161,6 +6144,7 @@ LCID WINAPI DECLSPEC_HOTPATCH LocaleNameToLCID( const WCHAR *name, DWORD flags )
 INT WINAPI DECLSPEC_HOTPATCH MultiByteToWideChar( UINT codepage, DWORD flags, const char *src, INT srclen,
                                                   WCHAR *dst, INT dstlen )
 {
+    const CPTABLEINFO *info;
     int ret;
 
     if (!src || !srclen || (!dst && dstlen) || dstlen < 0)
@@ -6178,19 +6162,24 @@ INT WINAPI DECLSPEC_HOTPATCH MultiByteToWideChar( UINT codepage, DWORD flags, co
     case CP_UTF7:
         ret = mbstowcs_utf7( flags, src, srclen, dst, dstlen );
         break;
-    case CP_UTF8:
-        ret = mbstowcs_utf8( flags, src, srclen, dst, dstlen );
-        break;
     case CP_UNIXCP:
-        if (unix_cp == CP_UTF8)
-        {
-            ret = mbstowcs_utf8( flags, src, srclen, dst, dstlen );
-            break;
-        }
         codepage = unix_cp;
         /* fall through */
     default:
-        ret = mbstowcs_codepage( codepage, flags, src, srclen, dst, dstlen );
+        if (!(info = get_codepage_table( codepage )))
+        {
+            SetLastError( ERROR_INVALID_PARAMETER );
+            return 0;
+        }
+        if (flags & ~(MB_PRECOMPOSED | MB_COMPOSITE | MB_USEGLYPHCHARS | MB_ERR_INVALID_CHARS))
+        {
+            SetLastError( ERROR_INVALID_FLAGS );
+            return 0;
+        }
+        if (info->CodePage == CP_UTF8)
+            ret = mbstowcs_utf8( flags, src, srclen, dst, dstlen );
+        else
+            ret = mbstowcs_codepage( info, flags, src, srclen, dst, dstlen );
         break;
     }
     TRACE( "cp %d %s -> %s, ret = %d\n", codepage, debugstr_an(src, srclen), debugstr_wn(dst, ret), ret );




More information about the wine-cvs mailing list