Jacek Caban : oleaut32: Simplify VarCat implementation.

Alexandre Julliard julliard at winehq.org
Thu Jun 15 15:34:20 CDT 2017


Module: wine
Branch: master
Commit: 840ab7cd1c797f4a05866dd0eae15bb627b1b637
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=840ab7cd1c797f4a05866dd0eae15bb627b1b637

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jun 15 15:03:52 2017 +0200

oleaut32: Simplify VarCat implementation.

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

---

 dlls/oleaut32/variant.c | 123 +++++++++++++++++++++---------------------------
 1 file changed, 53 insertions(+), 70 deletions(-)

diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c
index ee203d7..a760a65 100644
--- a/dlls/oleaut32/variant.c
+++ b/dlls/oleaut32/variant.c
@@ -2517,14 +2517,15 @@ VarNumFromParseNum_DecOverflow:
  */
 HRESULT WINAPI VarCat(LPVARIANT left, LPVARIANT right, LPVARIANT out)
 {
-    VARTYPE leftvt,rightvt,resultvt;
+    BSTR left_str = NULL, right_str = NULL;
+    VARTYPE leftvt, rightvt;
     HRESULT hres;
 
+    TRACE("%s,%s,%p)\n", debugstr_variant(left), debugstr_variant(right), out);
+
     leftvt = V_VT(left);
     rightvt = V_VT(right);
 
-    TRACE("%s,%s,%p)\n", debugstr_variant(left), debugstr_variant(right), out);
-
     /* when both left and right are NULL the result is NULL */
     if (leftvt == VT_NULL && rightvt == VT_NULL)
     {
@@ -2532,9 +2533,6 @@ HRESULT WINAPI VarCat(LPVARIANT left, LPVARIANT right, LPVARIANT out)
         return S_OK;
     }
 
-    hres = S_OK;
-    resultvt = VT_EMPTY;
-
     /* There are many special case for errors and return types */
     if (leftvt == VT_VARIANT && (rightvt == VT_ERROR ||
         rightvt == VT_DATE || rightvt == VT_DECIMAL))
@@ -2560,7 +2558,7 @@ HRESULT WINAPI VarCat(LPVARIANT left, LPVARIANT right, LPVARIANT out)
         rightvt == VT_UINT || rightvt == VT_EMPTY ||
         rightvt == VT_NULL || rightvt == VT_DATE ||
         rightvt == VT_DECIMAL || rightvt == VT_DISPATCH))
-        resultvt = VT_BSTR;
+        hres = S_OK;
     else if (rightvt == VT_ERROR && leftvt < VT_VOID)
         hres = DISP_E_TYPEMISMATCH;
     else if (leftvt == VT_ERROR && (rightvt == VT_DATE ||
@@ -2590,87 +2588,72 @@ HRESULT WINAPI VarCat(LPVARIANT left, LPVARIANT right, LPVARIANT out)
     /* if result type is not S_OK, then no need to go further */
     if (hres != S_OK)
     {
-        V_VT(out) = resultvt;
+        V_VT(out) = VT_EMPTY;
         return hres;
     }
-    /* Else proceed with formatting inputs to strings */
+
+    if (leftvt == VT_BSTR)
+        left_str = V_BSTR(left);
     else
     {
-        VARIANT bstrvar_left, bstrvar_right;
-        VARIANT *tmp;
-        VARIANT fetched;
+        VARIANT converted, *tmp = left;
 
-        V_VT(out) = VT_BSTR;
+        VariantInit(&converted);
+        if(leftvt == VT_DISPATCH)
+        {
+            hres = VARIANT_FetchDispatchValue(left, &converted);
+            if(FAILED(hres))
+                goto failed;
 
-        VariantInit(&bstrvar_left);
-        VariantInit(&bstrvar_right);
-        VariantInit(&fetched);
+            tmp = &converted;
+        }
 
-        /* Convert left side variant to string */
-        if (leftvt != VT_BSTR)
+        hres = VariantChangeTypeEx(&converted, tmp, 0, VARIANT_ALPHABOOL|VARIANT_LOCALBOOL, VT_BSTR);
+        if (SUCCEEDED(hres))
+            left_str = V_BSTR(&converted);
+        else if (hres != DISP_E_TYPEMISMATCH)
         {
-            tmp = left;
-
-            if(leftvt == VT_DISPATCH)
-            {
-                hres = VARIANT_FetchDispatchValue(left, &fetched);
-                if(FAILED(hres))
-                    goto failed;
+            VariantClear(&converted);
+            goto failed;
+        }
+    }
 
-                tmp = &fetched;
-            }
+    if (rightvt == VT_BSTR)
+        right_str = V_BSTR(right);
+    else
+    {
+        VARIANT converted, *tmp = right;
 
-            hres = VariantChangeTypeEx(&bstrvar_left,tmp,0,VARIANT_ALPHABOOL|VARIANT_LOCALBOOL,VT_BSTR);
-            VariantClear(&fetched);
-            if (hres == DISP_E_TYPEMISMATCH)
-            {
-                V_VT(&bstrvar_left) = VT_BSTR;
-                V_BSTR(&bstrvar_left) = SysAllocStringLen(NULL, 0);
-            }
-            else if(hres != S_OK)
+        VariantInit(&converted);
+        if(rightvt == VT_DISPATCH)
+        {
+            hres = VARIANT_FetchDispatchValue(right, &converted);
+            if(FAILED(hres))
                 goto failed;
+
+            tmp = &converted;
         }
 
-        /* convert right side variant to string */
-        if (rightvt != VT_BSTR)
+        hres = VariantChangeTypeEx(&converted, tmp, 0, VARIANT_ALPHABOOL|VARIANT_LOCALBOOL, VT_BSTR);
+        if (SUCCEEDED(hres))
+            right_str = V_BSTR(&converted);
+        else if (hres != DISP_E_TYPEMISMATCH)
         {
-            tmp = right;
-
-            if(rightvt == VT_DISPATCH)
-            {
-                hres = VARIANT_FetchDispatchValue(right, &fetched);
-                if(FAILED(hres))
-                    goto failed;
-
-                tmp = &fetched;
-            }
-
-            hres = VariantChangeTypeEx(&bstrvar_right,tmp,0,VARIANT_ALPHABOOL|VARIANT_LOCALBOOL,VT_BSTR);
-            VariantClear(&fetched);
-            if (hres == DISP_E_TYPEMISMATCH)
-            {
-                V_VT(&bstrvar_right) = VT_BSTR;
-                V_BSTR(&bstrvar_right) = SysAllocStringLen(NULL, 0);
-            }
-            else if(hres != S_OK)
-                goto failed;
+            VariantClear(&converted);
+            goto failed;
         }
+    }
 
-        /* Concat the resulting strings together */
-        if (leftvt == VT_BSTR && rightvt == VT_BSTR)
-            hres = VarBstrCat (V_BSTR(left), V_BSTR(right), &V_BSTR(out));
-        else if (leftvt != VT_BSTR && rightvt != VT_BSTR)
-            hres = VarBstrCat (V_BSTR(&bstrvar_left), V_BSTR(&bstrvar_right), &V_BSTR(out));
-        else if (leftvt != VT_BSTR && rightvt == VT_BSTR)
-            hres = VarBstrCat (V_BSTR(&bstrvar_left), V_BSTR(right), &V_BSTR(out));
-        else if (leftvt == VT_BSTR && rightvt != VT_BSTR)
-            hres = VarBstrCat (V_BSTR(left), V_BSTR(&bstrvar_right), &V_BSTR(out));
+
+    V_VT(out) = VT_BSTR;
+    hres = VarBstrCat(left_str, right_str, &V_BSTR(out));
 
 failed:
-        VariantClear(&bstrvar_left);
-        VariantClear(&bstrvar_right);
-        return hres;
-    }
+    if(V_VT(left) != VT_BSTR)
+        SysFreeString(left_str);
+    if(V_VT(right) != VT_BSTR)
+        SysFreeString(right_str);
+    return hres;
 }
 
 




More information about the wine-cvs mailing list