Jacek Caban : vbscript: Added Mid function implementation.
Alexandre Julliard
julliard at winehq.org
Thu Mar 29 15:48:58 CDT 2012
Module: wine
Branch: master
Commit: 4b00511c644345bd8ebd6da40455a51c8541a9bb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4b00511c644345bd8ebd6da40455a51c8541a9bb
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Mar 29 12:06:11 2012 +0200
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 d0f1130..2e45d8f 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 1c22791..67c365d 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()
More information about the wine-cvs
mailing list