vbscript: Added InStr implementation.
This commit is contained in:
parent
fc8756ac7c
commit
d23ecdfc64
|
@ -85,6 +85,26 @@ static HRESULT return_short(VARIANT *res, short val)
|
||||||
return S_OK;
|
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)
|
static IUnknown *create_object(script_ctx_t *ctx, const WCHAR *progid)
|
||||||
{
|
{
|
||||||
IInternetHostSecurityManager *secmgr = NULL;
|
IInternetHostSecurityManager *secmgr = NULL;
|
||||||
|
@ -511,10 +531,78 @@ static HRESULT Global_String(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VA
|
||||||
return E_NOTIMPL;
|
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");
|
VARIANT *startv, *str1v, *str2v;
|
||||||
return E_NOTIMPL;
|
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)
|
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_TRIM, Global_Trim, 0, 1},
|
||||||
{DISPID_GLOBAL_SPACE, Global_Space, 0, 1},
|
{DISPID_GLOBAL_SPACE, Global_Space, 0, 1},
|
||||||
{DISPID_GLOBAL_STRING, Global_String, 0, 0, 2},
|
{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_INSTRB, Global_InStrB, 0, 3, 4},
|
||||||
{DISPID_GLOBAL_ASCB, Global_AscB, 0, 1},
|
{DISPID_GLOBAL_ASCB, Global_AscB, 0, 1},
|
||||||
{DISPID_GLOBAL_CHRB, Global_ChrB, 0, 1},
|
{DISPID_GLOBAL_CHRB, Global_ChrB, 0, 1},
|
||||||
|
|
Loading…
Reference in New Issue