Nikolay Sivov : dwrite: Use array allocation helper for strings object.

Alexandre Julliard julliard at winehq.org
Tue May 14 15:43:02 CDT 2019


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue May 14 13:27:27 2019 +0300

dwrite: Use array allocation helper for strings object.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dwrite/main.c | 146 ++++++++++++++++++++++++++---------------------------
 1 file changed, 72 insertions(+), 74 deletions(-)

diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index 1816fbc..3fe2b7e 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -241,13 +241,14 @@ struct localizedpair {
     WCHAR *string;
 };
 
-struct localizedstrings {
+struct localizedstrings
+{
     IDWriteLocalizedStrings IDWriteLocalizedStrings_iface;
-    LONG ref;
+    LONG refcount;
 
     struct localizedpair *data;
-    UINT32 count;
-    UINT32 alloc;
+    size_t size;
+    size_t count;
 };
 
 static inline struct localizedstrings *impl_from_IDWriteLocalizedStrings(IDWriteLocalizedStrings *iface)
@@ -275,54 +276,61 @@ static HRESULT WINAPI localizedstrings_QueryInterface(IDWriteLocalizedStrings *i
 
 static ULONG WINAPI localizedstrings_AddRef(IDWriteLocalizedStrings *iface)
 {
-    struct localizedstrings *This = impl_from_IDWriteLocalizedStrings(iface);
-    ULONG ref = InterlockedIncrement(&This->ref);
-    TRACE("(%p)->(%d)\n", This, ref);
-    return ref;
+    struct localizedstrings *strings = impl_from_IDWriteLocalizedStrings(iface);
+    ULONG refcount = InterlockedIncrement(&strings->refcount);
+
+    TRACE("%p, refcount %d.\n", iface, refcount);
+
+    return refcount;
 }
 
 static ULONG WINAPI localizedstrings_Release(IDWriteLocalizedStrings *iface)
 {
-    struct localizedstrings *This = impl_from_IDWriteLocalizedStrings(iface);
-    ULONG ref = InterlockedDecrement(&This->ref);
-
-    TRACE("(%p)->(%d)\n", This, ref);
+    struct localizedstrings *strings = impl_from_IDWriteLocalizedStrings(iface);
+    ULONG refcount = InterlockedDecrement(&strings->refcount);
+    size_t i;
 
-    if (!ref) {
-        unsigned int i;
+    TRACE("%p, refcount %d.\n", iface, refcount);
 
-        for (i = 0; i < This->count; i++) {
-            heap_free(This->data[i].locale);
-            heap_free(This->data[i].string);
+    if (!refcount)
+    {
+        for (i = 0; i < strings->count; ++i)
+        {
+            heap_free(strings->data[i].locale);
+            heap_free(strings->data[i].string);
         }
 
-        heap_free(This->data);
-        heap_free(This);
+        heap_free(strings->data);
+        heap_free(strings);
     }
 
-    return ref;
+    return refcount;
 }
 
 static UINT32 WINAPI localizedstrings_GetCount(IDWriteLocalizedStrings *iface)
 {
-    struct localizedstrings *This = impl_from_IDWriteLocalizedStrings(iface);
-    TRACE("(%p)\n", This);
-    return This->count;
+    struct localizedstrings *strings = impl_from_IDWriteLocalizedStrings(iface);
+
+    TRACE("%p.\n", iface);
+
+    return strings->count;
 }
 
 static HRESULT WINAPI localizedstrings_FindLocaleName(IDWriteLocalizedStrings *iface,
     WCHAR const *locale_name, UINT32 *index, BOOL *exists)
 {
-    struct localizedstrings *This = impl_from_IDWriteLocalizedStrings(iface);
-    UINT32 i;
+    struct localizedstrings *strings = impl_from_IDWriteLocalizedStrings(iface);
+    size_t i;
 
-    TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(locale_name), index, exists);
+    TRACE("%p, %s, %p, %p.\n", iface, debugstr_w(locale_name), index, exists);
 
     *exists = FALSE;
     *index = ~0;
 
-    for (i = 0; i < This->count; i++) {
-        if (!strcmpiW(This->data[i].locale, locale_name)) {
+    for (i = 0; i < strings->count; ++i)
+    {
+        if (!strcmpiW(strings->data[i].locale, locale_name))
+        {
             *exists = TRUE;
             *index = i;
             break;
@@ -334,16 +342,17 @@ static HRESULT WINAPI localizedstrings_FindLocaleName(IDWriteLocalizedStrings *i
 
 static HRESULT WINAPI localizedstrings_GetLocaleNameLength(IDWriteLocalizedStrings *iface, UINT32 index, UINT32 *length)
 {
-    struct localizedstrings *This = impl_from_IDWriteLocalizedStrings(iface);
+    struct localizedstrings *strings = impl_from_IDWriteLocalizedStrings(iface);
 
-    TRACE("(%p)->(%u %p)\n", This, index, length);
+    TRACE("%p, %u, %p.\n", iface, index, length);
 
-    if (index >= This->count) {
+    if (index >= strings->count)
+    {
         *length = (UINT32)-1;
         return E_FAIL;
     }
 
-    *length = strlenW(This->data[index].locale);
+    *length = strlenW(strings->data[index].locale);
     return S_OK;
 }
 
@@ -416,58 +425,45 @@ static const IDWriteLocalizedStringsVtbl localizedstringsvtbl = {
 
 HRESULT create_localizedstrings(IDWriteLocalizedStrings **strings)
 {
-    struct localizedstrings *This;
+    struct localizedstrings *object;
 
     *strings = NULL;
 
-    This = heap_alloc(sizeof(struct localizedstrings));
-    if (!This) return E_OUTOFMEMORY;
-
-    This->IDWriteLocalizedStrings_iface.lpVtbl = &localizedstringsvtbl;
-    This->ref = 1;
-    This->count = 0;
-    This->data = heap_alloc_zero(sizeof(struct localizedpair));
-    if (!This->data) {
-        heap_free(This);
+    object = heap_alloc_zero(sizeof(*object));
+    if (!object)
         return E_OUTOFMEMORY;
-    }
-    This->alloc = 1;
 
-    *strings = &This->IDWriteLocalizedStrings_iface;
+    object->IDWriteLocalizedStrings_iface.lpVtbl = &localizedstringsvtbl;
+    object->refcount = 1;
+
+    *strings = &object->IDWriteLocalizedStrings_iface;
 
     return S_OK;
 }
 
 HRESULT add_localizedstring(IDWriteLocalizedStrings *iface, const WCHAR *locale, const WCHAR *string)
 {
-    struct localizedstrings *This = impl_from_IDWriteLocalizedStrings(iface);
-    UINT32 i;
+    struct localizedstrings *strings = impl_from_IDWriteLocalizedStrings(iface);
+    size_t i, count = strings->count;
 
     /* make sure there's no duplicates */
-    for (i = 0; i < This->count; i++)
-        if (!strcmpW(This->data[i].locale, locale))
+    for (i = 0; i < count; i++)
+        if (!strcmpW(strings->data[i].locale, locale))
             return S_OK;
 
-    if (This->count == This->alloc) {
-        void *ptr;
-
-        ptr = heap_realloc(This->data, 2*This->alloc*sizeof(struct localizedpair));
-        if (!ptr)
-            return E_OUTOFMEMORY;
-
-        This->alloc *= 2;
-        This->data = ptr;
-    }
+    if (!dwrite_array_reserve((void **)&strings->data, &strings->size, strings->count + 1, sizeof(*strings->data)))
+        return E_OUTOFMEMORY;
 
-    This->data[This->count].locale = heap_strdupW(locale);
-    This->data[This->count].string = heap_strdupW(string);
-    if (!This->data[This->count].locale || !This->data[This->count].string) {
-        heap_free(This->data[This->count].locale);
-        heap_free(This->data[This->count].string);
+    strings->data[count].locale = heap_strdupW(locale);
+    strings->data[count].string = heap_strdupW(string);
+    if (!strings->data[count].locale || !strings->data[count].string)
+    {
+        heap_free(strings->data[count].locale);
+        heap_free(strings->data[count].string);
         return E_OUTOFMEMORY;
     }
 
-    This->count++;
+    strings->count++;
 
     return S_OK;
 }
@@ -475,7 +471,7 @@ HRESULT add_localizedstring(IDWriteLocalizedStrings *iface, const WCHAR *locale,
 HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedStrings **ret)
 {
     struct localizedstrings *strings, *strings_clone;
-    int i;
+    size_t i;
 
     *ret = NULL;
 
@@ -483,24 +479,26 @@ HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedSt
         return S_FALSE;
 
     strings = impl_from_IDWriteLocalizedStrings(iface);
-    strings_clone = heap_alloc(sizeof(*strings_clone));
+    strings_clone = heap_alloc_zero(sizeof(*strings_clone));
     if (!strings_clone)
         return E_OUTOFMEMORY;
 
-    strings_clone->IDWriteLocalizedStrings_iface.lpVtbl = &localizedstringsvtbl;
-    strings_clone->ref = 1;
-    strings_clone->count = strings->count;
-    strings_clone->data = heap_calloc(strings_clone->count, sizeof(*strings_clone->data));
-    if (!strings_clone->data) {
+    if (!dwrite_array_reserve((void **)&strings_clone->data, &strings_clone->size, strings->count,
+            sizeof(*strings_clone->data)))
+    {
         heap_free(strings_clone);
         return E_OUTOFMEMORY;
     }
-    for (i = 0; i < strings_clone->count; i++)
+
+    strings_clone->IDWriteLocalizedStrings_iface.lpVtbl = &localizedstringsvtbl;
+    strings_clone->refcount = 1;
+    strings_clone->count = strings->count;
+
+    for (i = 0; i < strings_clone->count; ++i)
     {
         strings_clone->data[i].locale = heap_strdupW(strings->data[i].locale);
         strings_clone->data[i].string = heap_strdupW(strings->data[i].string);
     }
-    strings_clone->alloc = strings_clone->count;
 
     *ret = &strings_clone->IDWriteLocalizedStrings_iface;
 




More information about the wine-cvs mailing list