Jacek Caban : win32u: Improve string duplication helpers.

Alexandre Julliard julliard at winehq.org
Thu Apr 7 16:19:08 CDT 2022


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Apr  7 15:24:25 2022 +0200

win32u: Improve string duplication helpers.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/win32u/font.c           | 37 ++++++++++++++++++++++---------------
 dlls/win32u/freetype.c       | 22 ++--------------------
 dlls/win32u/win32u_private.h | 28 +++++++++++++++++++++++-----
 3 files changed, 47 insertions(+), 40 deletions(-)

diff --git a/dlls/win32u/font.c b/dlls/win32u/font.c
index 87ef75f04af..2bf68141d6d 100644
--- a/dlls/win32u/font.c
+++ b/dlls/win32u/font.c
@@ -277,15 +277,6 @@ static inline INT INTERNAL_YWSTODS(DC *dc, INT height)
     return pt[1].y - pt[0].y;
 }
 
-static inline WCHAR *strdupW( const WCHAR *p )
-{
-    WCHAR *ret;
-    DWORD len = (lstrlenW(p) + 1) * sizeof(WCHAR);
-    ret = malloc( len );
-    memcpy(ret, p, len);
-    return ret;
-}
-
 static INT FONT_GetObjectW( HGDIOBJ handle, INT count, LPVOID buffer );
 static BOOL FONT_DeleteObject( HGDIOBJ handle );
 
@@ -1201,8 +1192,8 @@ static struct gdi_font_face *create_face( struct gdi_font_family *family, const
     struct gdi_font_face *face = calloc( 1, sizeof(*face) );
 
     face->refcount   = 1;
-    face->style_name = strdupW( style );
-    face->full_name  = strdupW( fullname );
+    face->style_name = wcsdup( style );
+    face->full_name  = wcsdup( fullname );
     face->face_index = index;
     face->fs         = fs;
     face->ntmFlags   = ntmflags;
@@ -1210,7 +1201,7 @@ static struct gdi_font_face *create_face( struct gdi_font_family *family, const
     face->flags      = flags;
     face->data_ptr   = data_ptr;
     face->data_size  = data_size;
-    if (file) face->file = strdupW( file );
+    if (file) face->file = wcsdup( file );
     if (size) face->size = *size;
     else face->scalable = TRUE;
     if (insert_face_in_family_list( face, family )) return face;
@@ -2075,9 +2066,9 @@ static struct gdi_font *create_gdi_font( const struct gdi_font_face *face, const
     font->ntmFlags = face->ntmFlags;
     font->aa_flags = HIWORD( face->flags );
     if (!family_name) family_name = face->family->family_name;
-    font->otm.otmpFamilyName = (char *)strdupW( family_name );
-    font->otm.otmpStyleName = (char *)strdupW( face->style_name );
-    font->otm.otmpFaceName = (char *)strdupW( face->full_name );
+    font->otm.otmpFamilyName = (char *)wcsdup( family_name );
+    font->otm.otmpStyleName = (char *)wcsdup( face->style_name );
+    font->otm.otmpFaceName = (char *)wcsdup( face->full_name );
     return font;
 }
 
@@ -3311,6 +3302,22 @@ DWORD win32u_mbtowc( CPTABLEINFO *info, WCHAR *dst, DWORD dstlen, const char *sr
 
     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)
     {
diff --git a/dlls/win32u/freetype.c b/dlls/win32u/freetype.c
index b6063a14570..0703d32740e 100644
--- a/dlls/win32u/freetype.c
+++ b/dlls/win32u/freetype.c
@@ -584,24 +584,6 @@ static BOOL is_subpixel_rendering_enabled( void )
 }
 
 
-static LPWSTR strdupW(LPCWSTR p)
-{
-    LPWSTR ret;
-    DWORD len = (lstrlenW(p) + 1) * sizeof(WCHAR);
-    ret = malloc( len );
-    memcpy(ret, p, len);
-    return ret;
-}
-
-static WCHAR *towstr(const char *str)
-{
-    DWORD len = strlen(str) + 1;
-    WCHAR *wstr = malloc( len * sizeof(WCHAR) );
-    win32u_mbtowc( NULL, wstr, len * sizeof(WCHAR), str, len );
-    return wstr;
-}
-
-
 static const LANGID mac_langid_table[] =
 {
     MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT),                /* TT_MAC_LANGID_ENGLISH */
@@ -1168,7 +1150,7 @@ static WCHAR *decode_opentype_name( struct opentype_name *name )
     if (len == ARRAY_SIZE(buffer)) WARN("Truncated font name %s -> %s\n", debugstr_an(name->bytes, name->length), debugstr_w(buffer));
     else buffer[len] = 0;
 
-    return strdupW( buffer );
+    return wcsdup( buffer );
 }
 
 struct unix_face
@@ -3687,7 +3669,7 @@ static BOOL freetype_set_outline_text_metrics( struct gdi_font *font )
     {
         static const WCHAR fake_nameW[] = {'f','a','k','e',' ','n','a','m','e', 0};
         FIXME("failed to read full_nameW for font %s!\n", wine_dbgstr_w((WCHAR *)font->otm.otmpFamilyName));
-        font->otm.otmpFullName = (char *)strdupW(fake_nameW);
+        font->otm.otmpFullName = (char *)wcsdup( fake_nameW );
     }
     needed = sizeof(font->otm) + (lstrlenW( (WCHAR *)font->otm.otmpFamilyName ) + 1 +
                                   lstrlenW( (WCHAR *)font->otm.otmpStyleName ) + 1 +
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h
index 874cc92f4d4..3af6a9409d6 100644
--- a/dlls/win32u/win32u_private.h
+++ b/dlls/win32u/win32u_private.h
@@ -571,7 +571,30 @@ static inline ULONG win32u_wcstoul( const WCHAR *s, WCHAR **end, int base )
     return negative ? -ret : ret;
 }
 
+DWORD win32u_mbtowc( CPTABLEINFO *info, WCHAR *dst, DWORD dstlen, const char *src,
+                     DWORD srclen ) DECLSPEC_HIDDEN;
+DWORD win32u_wctomb( CPTABLEINFO *info, char *dst, DWORD dstlen, const WCHAR *src,
+                     DWORD srclen ) DECLSPEC_HIDDEN;
+
+static inline WCHAR *win32u_wcsdup( const WCHAR *str )
+{
+    DWORD size = (lstrlenW( str ) + 1) * sizeof(WCHAR);
+    WCHAR *ret = malloc( size );
+    if (ret) memcpy( ret, str, size );
+    return ret;
+}
+
+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 );
+    return ret;
+}
+
 #define towupper(c)     win32u_towupper(c)
+#define wcsdup(s)       win32u_wcsdup(s)
 #define wcstol(s,e,b)   win32u_wcstol(s,e,b)
 #define wcstoul(s,e,b)  win32u_wcstoul(s,e,b)
 
@@ -587,11 +610,6 @@ static inline UINT asciiz_to_unicode( WCHAR *dst, const char *src )
     return (p - dst) * sizeof(WCHAR);
 }
 
-DWORD win32u_mbtowc( CPTABLEINFO *info, WCHAR *dst, DWORD dstlen, const char *src,
-                     DWORD srclen ) DECLSPEC_HIDDEN;
-DWORD win32u_wctomb( CPTABLEINFO *info, char *dst, DWORD dstlen, const WCHAR *src,
-                     DWORD srclen ) DECLSPEC_HIDDEN;
-
 static inline BOOL is_win9x(void)
 {
     return NtCurrentTeb()->Peb->OSPlatformId == VER_PLATFORM_WIN32s;




More information about the wine-cvs mailing list