From: Francis De Brabandere francisdb@gmail.com
--- dlls/vbscript/global.c | 44 +++++++++++++++++------------------------- 1 file changed, 18 insertions(+), 26 deletions(-)
diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c index 10d5709e73c..f28a5aa965a 100644 --- a/dlls/vbscript/global.c +++ b/dlls/vbscript/global.c @@ -2583,13 +2583,14 @@ static HRESULT Global_Filter(BuiltinDisp *This, VARIANT *arg, unsigned args_cnt,
static HRESULT Global_Join(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, VARIANT *res) { - BSTR delimiter = NULL, output = NULL, str = NULL; - BOOL free_delimiter = FALSE; + const WCHAR *delimiter = L" "; + BSTR free_delimiter = NULL, output = NULL, str = NULL; SAFEARRAY *sa; HRESULT hres; LONG lbound, ubound; VARIANT *data; - UINT total_len = 0, delimiter_len = 0, str_len; + BSTR *str_array = NULL; + UINT total_len = 0, delimiter_len = 1, str_len; WCHAR *output_ptr; INT i;
@@ -2614,17 +2615,14 @@ static HRESULT Global_Join(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, if (V_VT(args + 1) == VT_NULL) return MAKE_VBSERROR(VBSE_ILLEGAL_NULL_USE); if (V_VT(args + 1) != VT_BSTR) { - hres = to_string(args + 1, &delimiter); + hres = to_string(args + 1, &free_delimiter); if (FAILED(hres)) return hres; + delimiter = free_delimiter; + delimiter_len = SysStringLen(free_delimiter); } else { delimiter = V_BSTR(args + 1); } - } else { - delimiter = SysAllocString(L" "); - if (!delimiter) - return E_OUTOFMEMORY; - free_delimiter = TRUE; }
if (SafeArrayGetDim(sa) != 1) { @@ -2644,7 +2642,11 @@ static HRESULT Global_Join(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, if (FAILED(hres)) goto cleanup;
- delimiter_len = SysStringLen(delimiter); + str_array = (BSTR *)malloc((ubound - lbound + 1) * sizeof(BSTR)); + if (!str_array) { + hres = E_OUTOFMEMORY; + goto cleanup_data; + }
for (i = lbound; i <= ubound; i++) { if (V_VT(&data[i]) != VT_BSTR) { @@ -2655,12 +2657,10 @@ static HRESULT Global_Join(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, str = V_BSTR(&data[i]); }
+ str_array[i - lbound] = str; total_len += SysStringLen(str); if (i > lbound) total_len += delimiter_len; - - if (V_VT(&data[i]) != VT_BSTR) - SysFreeString(str); }
output = SysAllocStringLen(NULL, total_len); @@ -2672,19 +2672,11 @@ static HRESULT Global_Join(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, output_ptr = output;
for (i = lbound; i <= ubound; i++) { - if (V_VT(&data[i]) != VT_BSTR) { - hres = to_string(&data[i], &str); - if (FAILED(hres)) - goto cleanup_output; - } else { - str = V_BSTR(&data[i]); - } - if (i > lbound) { memcpy(output_ptr, delimiter, delimiter_len * sizeof(WCHAR)); output_ptr += delimiter_len; } - + str = str_array[i - lbound]; str_len = SysStringLen(str); memcpy(output_ptr, str, str_len * sizeof(WCHAR)); output_ptr += str_len; @@ -2695,8 +2687,8 @@ static HRESULT Global_Join(BuiltinDisp *This, VARIANT *args, unsigned args_cnt,
*output_ptr = L'\0'; SafeArrayUnaccessData(sa); - if (free_delimiter) - SysFreeString(delimiter); + SysFreeString(free_delimiter); + free(str_array);
return return_bstr(res, output);
@@ -2705,8 +2697,8 @@ cleanup_output: cleanup_data: SafeArrayUnaccessData(sa); cleanup: - if (free_delimiter) - SysFreeString(delimiter); + SysFreeString(free_delimiter); + free(str_array); return hres; }