Alexandre Julliard : win32u: Use the ntdll functions for codepage conversions.

Alexandre Julliard julliard at winehq.org
Tue Apr 12 15:35:15 CDT 2022


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Apr 12 10:10:17 2022 +0200

win32u: Use the ntdll functions for codepage conversions.

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

---

 dlls/win32u/font.c           | 99 ++++----------------------------------------
 dlls/win32u/win32u_private.h |  5 +--
 2 files changed, 9 insertions(+), 95 deletions(-)

diff --git a/dlls/win32u/font.c b/dlls/win32u/font.c
index 2bf68141d6d..82daf9ad2ba 100644
--- a/dlls/win32u/font.c
+++ b/dlls/win32u/font.c
@@ -3221,7 +3221,6 @@ static UINT get_glyph_index_symbol( struct gdi_font *font, UINT glyph )
 CPTABLEINFO *get_cptable( WORD cp )
 {
     static CPTABLEINFO tables[100];
-    CPTABLEINFO *info;
     unsigned int i;
     USHORT *ptr;
     SIZE_T size;
@@ -3234,112 +3233,28 @@ CPTABLEINFO *get_cptable( WORD cp )
         ERR( "too many code pages\n" );
         return NULL;
     }
-
-    info = &tables[i];
-    info->CodePage             = ptr[1];
-    info->MaximumCharacterSize = ptr[2];
-    info->DefaultChar          = ptr[3];
-    info->UniDefaultChar       = ptr[4];
-    info->TransDefaultChar     = ptr[5];
-    info->TransUniDefaultChar  = ptr[6];
-    memcpy( info->LeadByte, ptr + 7, sizeof(info->LeadByte) );
-    ptr += ptr[0];
-
-    info->WideCharTable = ptr + ptr[0] + 1;
-    info->MultiByteTable = ++ptr;
-    ptr += 256;
-    if (*ptr++) ptr += 256;  /* glyph table */
-    info->DBCSRanges = ptr;
-    if (*ptr)  /* dbcs ranges */
-    {
-        info->DBCSCodePage = 1;
-        info->DBCSOffsets  = ptr + 1;
-    }
-    else
-    {
-        info->DBCSCodePage = 0;
-        info->DBCSOffsets  = NULL;
-    }
-
-    return info;
+    RtlInitCodePageTable( ptr, &tables[i] );
+    return &tables[i];
 }
 
 DWORD win32u_wctomb( CPTABLEINFO *info, char *dst, DWORD dstlen, const WCHAR *src, DWORD srclen )
 {
-    DWORD i, ret;
+    DWORD ret;
 
     if (!info && !(info = get_cptable( get_acp() ))) return 0;
 
-    srclen /= sizeof(WCHAR);
-    if (info->DBCSCodePage)
-    {
-        WCHAR *uni2cp = info->WideCharTable;
-
-        for (i = dstlen; srclen && i; i--, srclen--, src++)
-        {
-            if (uni2cp[*src] & 0xff00)
-            {
-                if (i == 1) break;  /* do not output a partial char */
-                i--;
-                *dst++ = uni2cp[*src] >> 8;
-            }
-            *dst++ = (char)uni2cp[*src];
-        }
-        ret = dstlen - i;
-    }
-    else
-    {
-        char *uni2cp = info->WideCharTable;
-        ret = min( srclen, dstlen );
-        for (i = 0; i < ret; i++) dst[i] = uni2cp[src[i]];
-    }
+    RtlUnicodeToCustomCPN( info, dst, dstlen, &ret, src, srclen );
     return ret;
 }
 
 DWORD win32u_mbtowc( CPTABLEINFO *info, WCHAR *dst, DWORD dstlen, const char *src, DWORD srclen )
 {
-    DWORD i, ret;
+    DWORD ret;
 
     if (!info && !(info = get_cptable( get_acp() ))) return 0;
 
-    if (!dst)
-    {
-        /* only compute length */
-        if (info->DBCSOffsets)
-        {
-            for (ret = 0; srclen--; src++, ret++)
-            {
-                if (!info->DBCSOffsets[(unsigned char)*src]) continue;
-                if (!srclen--) break;
-                src++;
-            }
-        }
-        else ret = srclen;
-        return ret * sizeof(WCHAR);
-    }
-
-    dstlen /= sizeof(WCHAR);
-    if (info->DBCSOffsets)
-    {
-        for (i = dstlen; srclen && i; i--, srclen--, src++, dst++)
-        {
-            USHORT off = info->DBCSOffsets[(unsigned char)*src];
-            if (off && srclen > 1)
-            {
-                src++;
-                srclen--;
-                *dst = info->DBCSOffsets[off + (unsigned char)*src];
-            }
-            else *dst = info->MultiByteTable[(unsigned char)*src];
-        }
-        ret = dstlen - i;
-    }
-    else
-    {
-        ret = min( srclen, dstlen );
-        for (i = 0; i < ret; i++) dst[i] = info->MultiByteTable[(unsigned char)src[i]];
-    }
-    return ret * sizeof(WCHAR);
+    RtlCustomCPToUnicodeN( info, dst, dstlen, &ret, src, srclen );
+    return ret;
 }
 
 static BOOL wc_to_index( UINT cp, WCHAR wc, unsigned char *dst, BOOL allow_default )
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h
index d552850e303..f570bde39fe 100644
--- a/dlls/win32u/win32u_private.h
+++ b/dlls/win32u/win32u_private.h
@@ -592,9 +592,8 @@ static inline WCHAR *win32u_wcsdup( const WCHAR *str )
 static inline WCHAR *towstr( const char *str )
 {
     DWORD len = strlen( str ) + 1;
-    DWORD size = win32u_mbtowc( NULL, NULL, 0, str, len );
-    WCHAR *ret = malloc( size );
-    if (ret) win32u_mbtowc( NULL, ret, size, str, len );
+    WCHAR *ret = malloc( len * sizeof(WCHAR) );
+    if (ret) win32u_mbtowc( NULL, ret, len * sizeof(WCHAR), str, len );
     return ret;
 }
 




More information about the wine-cvs mailing list