From: Shuai Meng Subject: [PATCH] vbscript: Implemented String Message-Id: <54F8734F.4080905@gmail.com> Date: Thu, 05 Mar 2015 23:16:31 +0800 --- dlls/vbscript/global.c | 60 +++++++++++++++++++++++++++++++++++++++++++-- dlls/vbscript/tests/api.vbs | 44 +++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 2 deletions(-) diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c index 448b886..46bafe8 100644 --- a/dlls/vbscript/global.c +++ b/dlls/vbscript/global.c @@ -1177,8 +1177,64 @@ static HRESULT Global_Space(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VAR static HRESULT Global_String(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res) { - FIXME("\n"); - return E_NOTIMPL; + HRESULT hres; + int len, i, tmp; + WCHAR str; + BOOL bl; + BSTR ret, bstr; + + TRACE("%s\n", debugstr_variant(arg)); + assert(args_cnt == 2); + + switch(V_VT(arg + 1)) { + case VT_NULL: + return MAKE_VBSERROR(VBSE_ILLEGAL_NULL_USE); + case VT_EMPTY: + str = 0; + break; + case VT_DATE: + return MAKE_VBSERROR(VBSE_OVERFLOW); + break; + case VT_BOOL: + bl = V_BOOL(arg + 1); + if(bl == 0) + str = 0; + else + str = -1; + break; + case VT_BSTR: + bstr = V_BSTR(arg + 1); + str = bstr[0]; + if(str == 0) + return MAKE_VBSERROR(VBSE_ILLEGAL_FUNC_CALL); + break; + default: + hres = to_int(arg + 1, &tmp); + if(SUCCEEDED(hres)) { + if(tmp < 256) + str = tmp; + else if(tmp < 32768) + str = tmp % 256; + else + return MAKE_VBSERROR(VBSE_OVERFLOW); + }else + return E_NOTIMPL; + } + + if(V_VT(arg) == VT_NULL) + return MAKE_VBSERROR(VBSE_ILLEGAL_NULL_USE); + + hres = to_int(arg, &len); + if(FAILED(hres)) + return hres; + + if(len < 0) + return MAKE_VBSERROR(VBSE_ILLEGAL_FUNC_CALL); + + ret = SysAllocStringLen(NULL, len); + for(i = 0; i < len; i++) + ret[i] = str; + return return_bstr(res, ret); } static HRESULT Global_InStr(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res) diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs index 8c92cf5..fbf4810 100644 --- a/dlls/vbscript/tests/api.vbs +++ b/dlls/vbscript/tests/api.vbs @@ -1324,4 +1324,48 @@ Call testRGBError(&h4d&, -2, &h2f&, 5) Call ok(getVT(Timer) = "VT_R4", "getVT(Timer) = " & getVT(Timer)) +Sub testStringError(arg1, arg2, error_num) + on error resume next + Call Err.clear() + Call String(arg1, arg2) + Call ok(Err.number = error_num, "Err.number = " & Err.number) +End Sub + +Call ok(String(0, 65) = "", "String(0, 65) = " & String(0, 65)) +Call ok(getVT(String(0, 65)) = "VT_BSTR", "getVT(String(0, 65)) = " & getVT(String(0, 65))) +Call ok(String(1, Empty) = String(1, 0), "String(1, Empty) = " & String(1, Empty)) +Call ok(getVT(String(1, Empty)) = "VT_BSTR", "getVT(String(1, Empty)) = " & getVT(String(1, Empty))) +Call ok(String(1, CByte(65)) = "A", "String(1, CByte(65)) = " & String(1, CByte(65))) +Call ok(getVT(String(1, CByte(65))) = "VT_BSTR", "getVT(String(1, CByte(65))) = " & getVT(String(1, CByte(65)))) +Call ok(String(1, 65) = "A", "String(1, 65) = " & String(1, 65)) +Call ok(getVT(String(1, 65)) = "VT_BSTR", "getVT(String(1, 65)) = " & getVT(String(1, 65))) +Call ok(String(1, CLng(65)) = "A", "String(1, CLng(65)) = " & String(1, CLng(65))) +Call ok(getVT(String(1, CLng(65))) = "VT_BSTR", "getVT(String(1, CLng(65))) = " & getVT(String(1, CLng(65)))) +Call ok(String(3, CSng(70.67)) = "GGG", "String(3, CSng(70.67)) = " & String(3, CSng(70.67))) +Call ok(getVT(String(3, CSng(70.67))) = "VT_BSTR", "getVT(String(3, CSng(70.67))) = " & getVT(String(3, CSng(70.67)))) +Call ok(String(1, 70.67) = "G", "String(1, 70.67) = " & String(1, 70.67)) +Call ok(getVT(String(1, 70.67)) = "VT_BSTR", "getVT(String(1, 70.67)) = " & getVT(String(1, 70.67))) +Call ok(String(1, CCur(70.67)) = "G", "String(1, CCur(70.67)) = " & String(1, CCur(70.67))) +Call ok(getVT(String(1, CCur(70.67))) = "VT_BSTR", "getVT(String(1, CCur(70.67))) = " & getVT(String(1, CCur(70.67)))) +If isEnglishLang Then +Call ok(String(1, 257) = String(1, 1), "String(1, 257) = " & String(1, 257)) +Call ok(getVT(String(1, 257)) = "VT_BSTR", "getVT(String(1, 257)) = " & getVT(String(1, 257))) +Call ok(String(1, 322) = "B", "String(1, 322) = " & String(1, 322)) +Call ok(getVT(String(1, 322)) = "VT_BSTR", "getVT(String(1, 322)) = " & getVT(String(1, 322))) +End If +Call ok(String(2, "abcd") = "aa", "String(2, ""abcd"") = " & String(2, "abcd")) +Call ok(getVT(String(2, "abcd")) = "VT_BSTR", "getVT(String(2, ""abcd"")) = " & getVT(String(2, "abcd"))) +Call ok(String(1, True) = String(1, -1), "String(1, True) = " & String(1, True)) +Call ok(getVT(String(1, True)) = "VT_BSTR", "getVT(String(1, True)) = " & getVT(String(1, True))) +Call ok(String(1, False) = String(1, 0), "String(1, False) = " & String(1, False)) +Call ok(getVT(String(1, False)) = "VT_BSTR", "getVT(String(1, False)) = " & getVT(String(1, False))) +newObject.myval = 66 +Call ok(String(1, newObject) = "B", "String(1, newObject) = " & String(1, newObject)) +Call ok(getVT(String(1, newObject)) = "VT_BSTR", "getVT(String(1, newObject)) = " & getVT(String(1, newObject))) +Call testStringError(-2, "f", 5) +Call testStringError(2, "", 5) +Call testStringError(1, 32767.5, 6) +Call testStringError(2, Null, 94) +Call testStringError(Null, "f", 94) + Call reportSuccess()