[PATCH v6 3/5] combase: Move length from hstring_private to hstring_header.

Bernhard Kölbl besentv at gmail.com
Mon Jan 24 09:09:21 CST 2022


Signed-off-by: Bernhard Kölbl <besentv at gmail.com>
---
 dlls/combase/string.c       | 46 ++++++++++++++++++-------------------
 dlls/combase/tests/string.c |  2 ++
 2 files changed, 25 insertions(+), 23 deletions(-)

diff --git a/dlls/combase/string.c b/dlls/combase/string.c
index 796fe607ad0..1e1e60db758 100644
--- a/dlls/combase/string.c
+++ b/dlls/combase/string.c
@@ -31,13 +31,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(winstring);
 struct hstring_header
 {
     UINT32 flags;
+    UINT32 length;
 };
 
 struct hstring_private
 {
     struct hstring_header header;
     LPWSTR buffer;
-    UINT32 length;
     LONG   refcount;
 };
 
@@ -69,7 +69,7 @@ static BOOL alloc_string(UINT32 len, HSTRING *out)
 
     priv->header.flags = 0;
     priv->buffer = (LPWSTR)(priv + 1);
-    priv->length = len;
+    priv->header.length = len;
     priv->refcount = 1;
     priv->buffer[len] = '\0';
 
@@ -126,7 +126,7 @@ HRESULT WINAPI WindowsCreateStringReference(LPCWSTR ptr, UINT32 len,
         return E_POINTER;
 
     priv->buffer = (LPWSTR)ptr;
-    priv->length = len;
+    priv->header.length = len;
     priv->header.flags = HSTRING_REFERENCE_FLAG;
 
     *out = (HSTRING)priv;
@@ -168,7 +168,7 @@ HRESULT WINAPI WindowsDuplicateString(HSTRING str, HSTRING *out)
         return S_OK;
     }
     if (priv->header.flags & HSTRING_REFERENCE_FLAG)
-        return WindowsCreateString(priv->buffer, priv->length, out);
+        return WindowsCreateString(priv->buffer, priv->header.length, out);
     InterlockedIncrement(&priv->refcount);
     *out = str;
     return S_OK;
@@ -233,7 +233,7 @@ HRESULT WINAPI WindowsPromoteStringBuffer(HSTRING_BUFFER buf, HSTRING *out)
         *out = NULL;
         return S_OK;
     }
-    if (priv->buffer[priv->length] != 0 || priv->header.flags & HSTRING_REFERENCE_FLAG || priv->refcount != 1)
+    if (priv->buffer[priv->header.length] != 0 || priv->header.flags & HSTRING_REFERENCE_FLAG || priv->refcount != 1)
         return E_INVALIDARG;
     *out = (HSTRING)priv;
     return S_OK;
@@ -250,7 +250,7 @@ UINT32 WINAPI WindowsGetStringLen(HSTRING str)
 
     if (str == NULL)
         return 0;
-    return priv->length;
+    return priv->header.length;
 }
 
 /***********************************************************************
@@ -269,7 +269,7 @@ LPCWSTR WINAPI WindowsGetStringRawBuffer(HSTRING str, UINT32 *len)
         return empty;
     }
     if (len)
-        *len = priv->length;
+        *len = priv->header.length;
     return priv->buffer;
 }
 
@@ -290,7 +290,7 @@ HRESULT WINAPI WindowsStringHasEmbeddedNull(HSTRING str, BOOL *out)
         *out = FALSE;
         return S_OK;
     }
-    for (i = 0; i < priv->length; i++)
+    for (i = 0; i < priv->header.length; i++)
     {
         if (priv->buffer[i] == '\0')
         {
@@ -363,16 +363,16 @@ HRESULT WINAPI WindowsConcatString(HSTRING str1, HSTRING str2, HSTRING *out)
         return WindowsDuplicateString(str2, out);
     if (str2 == NULL)
         return WindowsDuplicateString(str1, out);
-    if (!priv1->length && !priv2->length)
+    if (!priv1->header.length && !priv2->header.length)
     {
         *out = NULL;
         return S_OK;
     }
-    if (!alloc_string(priv1->length + priv2->length, out))
+    if (!alloc_string(priv1->header.length + priv2->header.length, out))
         return E_OUTOFMEMORY;
     priv = impl_from_HSTRING(*out);
-    memcpy(priv->buffer, priv1->buffer, priv1->length * sizeof(*priv1->buffer));
-    memcpy(priv->buffer + priv1->length, priv2->buffer, priv2->length * sizeof(*priv2->buffer));
+    memcpy(priv->buffer, priv1->buffer, priv1->header.length * sizeof(*priv1->buffer));
+    memcpy(priv->buffer + priv1->header.length, priv2->buffer, priv2->header.length * sizeof(*priv2->buffer));
     return S_OK;
 }
 
@@ -387,7 +387,7 @@ BOOL WINAPI WindowsIsStringEmpty(HSTRING str)
 
     if (str == NULL)
         return TRUE;
-    return priv->length == 0;
+    return priv->header.length == 0;
 }
 
 /***********************************************************************
@@ -412,12 +412,12 @@ HRESULT WINAPI WindowsCompareStringOrdinal(HSTRING str1, HSTRING str2, INT32 *re
     if (str1)
     {
         buf1 = priv1->buffer;
-        len1 = priv1->length;
+        len1 = priv1->header.length;
     }
     if (str2)
     {
         buf2 = priv2->buffer;
-        len2 = priv2->length;
+        len2 = priv2->header.length;
     }
     *res = CompareStringOrdinal(buf1, len1, buf2, len2, FALSE) - CSTR_EQUAL;
     return S_OK;
@@ -434,19 +434,19 @@ HRESULT WINAPI WindowsTrimStringStart(HSTRING str1, HSTRING str2, HSTRING *out)
 
     TRACE("(%p, %p, %p)\n", str1, str2, out);
 
-    if (!out || !str2 || !priv2->length)
+    if (!out || !str2 || !priv2->header.length)
         return E_INVALIDARG;
     if (!str1)
     {
         *out = NULL;
         return S_OK;
     }
-    for (start = 0; start < priv1->length; start++)
+    for (start = 0; start < priv1->header.length; start++)
     {
-        if (!wmemchr(priv2->buffer, priv1->buffer[start], priv2->length))
+        if (!wmemchr(priv2->buffer, priv1->buffer[start], priv2->header.length))
             break;
     }
-    return start ? WindowsCreateString(&priv1->buffer[start], priv1->length - start, out) :
+    return start ? WindowsCreateString(&priv1->buffer[start], priv1->header.length - start, out) :
                    WindowsDuplicateString(str1, out);
 }
 
@@ -461,18 +461,18 @@ HRESULT WINAPI WindowsTrimStringEnd(HSTRING str1, HSTRING str2, HSTRING *out)
 
     TRACE("(%p, %p, %p)\n", str1, str2, out);
 
-    if (!out || !str2 || !priv2->length)
+    if (!out || !str2 || !priv2->header.length)
         return E_INVALIDARG;
     if (!str1)
     {
         *out = NULL;
         return S_OK;
     }
-    for (len = priv1->length; len > 0; len--)
+    for (len = priv1->header.length; len > 0; len--)
     {
-        if (!wmemchr(priv2->buffer, priv1->buffer[len - 1], priv2->length))
+        if (!wmemchr(priv2->buffer, priv1->buffer[len - 1], priv2->header.length))
             break;
     }
-    return (len < priv1->length) ? WindowsCreateString(priv1->buffer, len, out) :
+    return (len < priv1->header.length) ? WindowsCreateString(priv1->buffer, len, out) :
                                    WindowsDuplicateString(str1, out);
 }
diff --git a/dlls/combase/tests/string.c b/dlls/combase/tests/string.c
index ea3285f6008..9e4c6281866 100644
--- a/dlls/combase/tests/string.c
+++ b/dlls/combase/tests/string.c
@@ -512,6 +512,7 @@ static void test_hstring_struct(void)
     prv = CONTAINING_RECORD(str, struct hstring_private, header);
 
     ok(prv->header.flags == 0, "Expected 0 in flags field, got %#x.\n", prv->header.flags);
+    ok(prv->header.length == 6, "Expected 6 in length field, got %u.\n", prv->header.length);
     todo_wine
     ok(prv->header.str == prv->buffer, "Expected str to point at buffer, instead pointing at %p.\n", prv->header.str);
     todo_wine
@@ -546,6 +547,7 @@ static void test_hstring_struct(void)
 
     ok(prv == prv2, "Pointers not identical.\n");
     ok(prv2->header.flags == 1, "Expected HSTRING_REFERENCE_FLAG to be set, got %#x.\n", prv2->header.flags);
+    ok(prv2->header.length == 6, "Expected 6 in length field, got %u.\n", prv2->header.length);
     todo_wine
     ok(prv2->header.str == input_string, "Expected str to point at input_string, instead pointing at %p.\n", prv2->header.str);
 
-- 
2.34.1




More information about the wine-devel mailing list