From 4b00511c644345bd8ebd6da40455a51c8541a9bb Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 29 Mar 2012 12:06:11 +0200 Subject: [PATCH] vbscript: Added Mid function implementation. --- dlls/vbscript/global.c | 73 +++++++++++++++++++++++++++++++++++-- dlls/vbscript/tests/api.vbs | 21 +++++++++++ 2 files changed, 91 insertions(+), 3 deletions(-) diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c index d0f113008da..2e45d8f7e08 100644 --- a/dlls/vbscript/global.c +++ b/dlls/vbscript/global.c @@ -105,6 +105,23 @@ static inline HRESULT return_null(VARIANT *res) return S_OK; } +static HRESULT to_int(VARIANT *v, int *ret) +{ + switch(V_VT(v)) { + case VT_I2: + *ret = V_I2(v); + break; + case VT_I4: + *ret = V_I4(v); + break; + default: + FIXME("not supported %s\n", debugstr_variant(v)); + return E_NOTIMPL; + } + + return S_OK; +} + static IUnknown *create_object(script_ctx_t *ctx, const WCHAR *progid) { IInternetHostSecurityManager *secmgr = NULL; @@ -471,10 +488,60 @@ static HRESULT Global_RightB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VA return E_NOTIMPL; } -static HRESULT Global_Mid(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res) +static HRESULT Global_Mid(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res) { - FIXME("\n"); - return E_NOTIMPL; + int len = -1, start, str_len; + BSTR str; + HRESULT hres; + + TRACE("\n"); + + switch(args_cnt) { + case 3: + hres = to_int(args, &len); + if(FAILED(hres)) + return hres; + + if(len < 0) { + FIXME("len = %d\n", len); + return E_FAIL; + } + /* fallthrough */ + case 2: + hres = to_int(args+args_cnt-2, &start); + if(FAILED(hres)) + return hres; + + if(V_VT(args+args_cnt-1) != VT_BSTR) { + FIXME("args[0] = %s\n", debugstr_variant(args+args_cnt-1)); + return E_NOTIMPL; + } + + str = V_BSTR(args+args_cnt-1); + break; + default: + assert(0); + } + + + str_len = SysStringLen(str); + start--; + if(start > str_len) + start = str_len; + + if(len == -1) + len = str_len-start; + else if(len > str_len-start) + len = str_len-start; + + if(res) { + V_VT(res) = VT_BSTR; + V_BSTR(res) = SysAllocStringLen(str+start, len); + if(!V_BSTR(res)) + return E_OUTOFMEMORY; + } + + return S_OK; } static HRESULT Global_MidB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res) diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs index 1c22791d9f4..67c365d1a04 100644 --- a/dlls/vbscript/tests/api.vbs +++ b/dlls/vbscript/tests/api.vbs @@ -124,4 +124,25 @@ Call ok(isNull(x), "InStr returned " & x) x = InStr(2, null, "abcd") Call ok(isNull(x), "InStr returned " & x) +Sub TestMid(str, start, len, ex) + x = Mid(str, start, len) + Call ok(x = ex, "Mid(" & str & ", " & start & ", " & len & ") = " & x & " expected " & ex) +End Sub + +Sub TestMid2(str, start, ex) + x = Mid(str, start) + Call ok(x = ex, "Mid(" & str & ", " & start & ") = " & x & " expected " & ex) +End Sub + +TestMid "test", 2, 2, "es" +TestMid "test", 2, 4, "est" +TestMid "test", 1, 2, "te" +TestMid "test", 1, 0, "" +TestMid "test", 1, 0, "" +TestMid "test", 5, 2, "" +TestMid2 "test", 1, "test" +TestMid2 "test", 2, "est" +TestMid2 "test", 4, "t" +TestMid2 "test", 5, "" + Call reportSuccess()