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