Jacek Caban : vbscript: Added InStr implementation.

Alexandre Julliard julliard at winehq.org
Tue Jan 3 12:52:52 CST 2012


Module: wine
Branch: master
Commit: d23ecdfc64bd3f36f422466417e6d2474765904c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d23ecdfc64bd3f36f422466417e6d2474765904c

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Dec 30 17:00:12 2011 +0100

vbscript: Added InStr implementation.

---

 dlls/vbscript/global.c |   96 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 92 insertions(+), 4 deletions(-)

diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c
index e3c7161..d0f1130 100644
--- a/dlls/vbscript/global.c
+++ b/dlls/vbscript/global.c
@@ -85,6 +85,26 @@ static HRESULT return_short(VARIANT *res, short val)
     return S_OK;
 }
 
+static HRESULT return_int(VARIANT *res, int val)
+{
+    if((short)val == val)
+        return return_short(res, val);
+
+    if(res) {
+        V_VT(res) = VT_I4;
+        V_I4(res) = val;
+    }
+
+    return S_OK;
+}
+
+static inline HRESULT return_null(VARIANT *res)
+{
+    if(res)
+        V_VT(res) = VT_NULL;
+    return S_OK;
+}
+
 static IUnknown *create_object(script_ctx_t *ctx, const WCHAR *progid)
 {
     IInternetHostSecurityManager *secmgr = NULL;
@@ -511,10 +531,78 @@ static HRESULT Global_String(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VA
     return E_NOTIMPL;
 }
 
-static HRESULT Global_InStr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
+static HRESULT Global_InStr(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    VARIANT *startv, *str1v, *str2v;
+    BSTR str1, str2;
+    int start, ret;
+
+    TRACE("\n");
+
+    switch(args_cnt) {
+    case 2:
+        startv = NULL;
+        str1v = args+1;
+        str2v = args;
+        break;
+    case 3:
+        startv = args+2;
+        str1v = args+1;
+        str2v = args;
+        break;
+    case 4:
+        FIXME("unsupported compare argument %s\n", debugstr_variant(args));
+        return E_NOTIMPL;
+    default:
+        assert(0);
+    }
+
+    if(startv) {
+        /* FIXME: Move to helper */
+        switch(V_VT(startv)) {
+        case VT_I2:
+            start = V_I2(startv);
+            break;
+        case VT_I4:
+            start = V_I4(startv);
+            break;
+        default:
+            FIXME("unsupported start %s\n", debugstr_variant(startv));
+            return E_NOTIMPL;
+        }
+        if(--start < 0) {
+            FIXME("start %d\n", start);
+            return E_FAIL;
+        }
+    }else {
+        start = 0;
+    }
+
+    if(V_VT(str1v) == VT_NULL || V_VT(str2v) == VT_NULL)
+        return return_null(res);
+
+    if(V_VT(str1v) != VT_BSTR) {
+        FIXME("Unsupported str1 type %s\n", debugstr_variant(str1v));
+        return E_NOTIMPL;
+    }
+    str1 = V_BSTR(str1v);
+
+    if(V_VT(str2v) != VT_BSTR) {
+        FIXME("Unsupported str2 type %s\n", debugstr_variant(str2v));
+        return E_NOTIMPL;
+    }
+    str2 = V_BSTR(str2v);
+
+    if(start < SysStringLen(str1)) {
+        WCHAR *ptr;
+
+        ptr = strstrW(str1+start, str2);
+        ret = ptr ? ptr-str1+1 : 0;
+    }else {
+        ret = 0;
+    }
+
+    return return_int(res, ret);
 }
 
 static HRESULT Global_InStrB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
@@ -1532,7 +1620,7 @@ static const builtin_prop_t global_props[] = {
     {DISPID_GLOBAL_TRIM,                      Global_Trim, 0, 1},
     {DISPID_GLOBAL_SPACE,                     Global_Space, 0, 1},
     {DISPID_GLOBAL_STRING,                    Global_String, 0, 0, 2},
-    {DISPID_GLOBAL_INSTR,                     Global_InStr, 0, 3, 4},
+    {DISPID_GLOBAL_INSTR,                     Global_InStr, 0, 2, 4},
     {DISPID_GLOBAL_INSTRB,                    Global_InStrB, 0, 3, 4},
     {DISPID_GLOBAL_ASCB,                      Global_AscB, 0, 1},
     {DISPID_GLOBAL_CHRB,                      Global_ChrB, 0, 1},




More information about the wine-cvs mailing list