[PATCH v2 7/8] winex11: Move Unicode conversion out of string_from_unicode_text.

Jacek Caban wine at gitlab.winehq.org
Thu Apr 28 07:31:13 CDT 2022


From: Jacek Caban <jacek at codeweavers.com>

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
---
 dlls/winex11.drv/clipboard.c | 68 +++++++++++++++++++-----------------
 1 file changed, 36 insertions(+), 32 deletions(-)

diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c
index ce936f9012e..1dcd5362c8c 100644
--- a/dlls/winex11.drv/clipboard.c
+++ b/dlls/winex11.drv/clipboard.c
@@ -729,9 +729,11 @@ static void *import_utf8_string( Atom type, const void *data, size_t size, size_
     DWORD str_size;
     WCHAR *ret;
 
-    if (!(ret = malloc( (size * 2 + 1) * sizeof(WCHAR) ))) return NULL;
-    RtlUTF8ToUnicodeN( ret + size, size * sizeof(WCHAR), &str_size, data, size );
-    return unicode_text_from_string( ret, ret + size, str_size / sizeof(WCHAR), ret_size );
+    RtlUTF8ToUnicodeN( NULL, 0, &str_size, data, size );
+    if (!(ret = malloc( str_size * 2 + sizeof(WCHAR) ))) return NULL;
+    RtlUTF8ToUnicodeN( ret + str_size / sizeof(WCHAR), str_size, &str_size, data, size );
+    return unicode_text_from_string( ret, ret + str_size / sizeof(WCHAR),
+                                     str_size / sizeof(WCHAR), ret_size );
 }
 
 
@@ -1198,31 +1200,19 @@ static BOOL export_data( Display *display, Window win, Atom prop, Atom target, v
  *
  * Convert CF_UNICODETEXT data to a string in the specified codepage.
  */
-static char *string_from_unicode_text( UINT codepage, const WCHAR *string, size_t string_size, size_t *size )
+static void string_from_unicode_text( char *str, size_t len, DWORD *size )
 {
-    UINT i, j;
-    char *str;
-    UINT lenW = string_size / sizeof(WCHAR);
-    DWORD len;
-
-    if (!string_size) return NULL;
+    DWORD i, j;
 
-    len = WideCharToMultiByte( codepage, 0, string, lenW, NULL, 0, NULL, NULL );
-    if ((str = malloc( len )))
+    /* remove carriage returns */
+    for (i = j = 0; i < len; i++)
     {
-        WideCharToMultiByte( codepage, 0, string, lenW, str, len, NULL, NULL);
-
-        /* remove carriage returns */
-        for (i = j = 0; i < len; i++)
-        {
-            if (str[i] == '\r' && (i == len - 1 || str[i + 1] == '\n')) continue;
-            str[j++] = str[i];
-        }
-        while (j && !str[j - 1]) j--;  /* remove trailing nulls */
-        *size = j;
-        TRACE( "returning %s\n", debugstr_an( str, j ));
+        if (str[i] == '\r' && (i == len - 1 || str[i + 1] == '\n')) continue;
+        str[j++] = str[i];
     }
-    return str;
+    while (j && !str[j - 1]) j--;  /* remove trailing nulls */
+    TRACE( "returning %s\n", debugstr_an( str, j ));
+    *size = j;
 }
 
 
@@ -1233,10 +1223,14 @@ static char *string_from_unicode_text( UINT codepage, const WCHAR *string, size_
  */
 static BOOL export_string( Display *display, Window win, Atom prop, Atom target, void *data, size_t size )
 {
-    char *text = string_from_unicode_text( 28591, data, size, &size );
+    DWORD len;
+    char *text;
+
+    if (!(text = malloc( size ))) return FALSE;
+    len = WideCharToMultiByte( 28591, 0, data, size / sizeof(WCHAR), text, size, NULL, NULL );
+    string_from_unicode_text( text, len, &len );
 
-    if (!text) return FALSE;
-    put_property( display, win, prop, target, 8, text, size );
+    put_property( display, win, prop, target, 8, text, len );
     free( text );
     return TRUE;
 }
@@ -1250,10 +1244,14 @@ static BOOL export_string( Display *display, Window win, Atom prop, Atom target,
 static BOOL export_utf8_string( Display *display, Window win, Atom prop, Atom target,
                                 void *data, size_t size )
 {
-    char *text = string_from_unicode_text( CP_UTF8, data, size, &size );
+    DWORD len;
+    char *text;
+
+    if (!(text = malloc( size / sizeof(WCHAR) * 3 ))) return FALSE;
+    RtlUnicodeToUTF8N( text, size / sizeof(WCHAR) * 3, &len, data, size );
+    string_from_unicode_text( text, len, &len );
 
-    if (!text) return FALSE;
-    put_property( display, win, prop, target, 8, text, size );
+    put_property( display, win, prop, target, 8, text, len );
     free( text );
     return TRUE;
 }
@@ -1280,9 +1278,15 @@ static BOOL export_compound_text( Display *display, Window win, Atom prop, Atom
 {
     XTextProperty textprop;
     XICCEncodingStyle style;
-    char *text = string_from_unicode_text( CP_UNIXCP, data, size, &size );
+    DWORD len;
+    char *text;
+
+
+    if (!(text = malloc( size / sizeof(WCHAR) * 3 ))) return FALSE;
+    len = WideCharToMultiByte( CP_UNIXCP, 0, data, size / sizeof(WCHAR),
+                               text, size / sizeof(WCHAR) * 3, NULL, NULL );
+    string_from_unicode_text( text, len, &len );
 
-    if (!text) return FALSE;
     if (target == x11drv_atom(COMPOUND_TEXT))
         style = XCompoundTextStyle;
     else
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/11



More information about the wine-devel mailing list