Re: [PATCH] vbscript: Implement StrComp()
Hi Nikolay, The patch looks mostly good. On 04.11.2016 07:34, Nikolay Sivov wrote:
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> --- dlls/vbscript/global.c | 43 ++++++++++++++++++++++++++++++++++++++++--- dlls/vbscript/tests/api.vbs | 15 +++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-)
diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c index 129d6ce..a872838 100644 --- a/dlls/vbscript/global.c +++ b/dlls/vbscript/global.c @@ -1027,10 +1027,47 @@ static HRESULT Global_MidB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARI return E_NOTIMPL; }
-static HRESULT Global_StrComp(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res) +static HRESULT Global_StrComp(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res) { - FIXME("\n"); - return E_NOTIMPL; + BSTR left, right; + int mode, ret; + HRESULT hres; + + TRACE("(%s %s ...)\n", debugstr_variant(args), debugstr_variant(args+1)); + + assert(args_cnt == 2 || args_cnt == 3); + + if(V_VT(args) != VT_BSTR || V_VT(args+1) != VT_BSTR) { + FIXME("args[0] = %s, args[1] = %s\n", debugstr_variant(args), debugstr_variant(args+1)); + return E_NOTIMPL; + } + + if (args_cnt == 3) { + hres = to_int(args+2, &mode);
A test where mode arg is of other type would be nice. Something like "1" (passed as a string).
+ if(FAILED(hres)) + return hres; + + if (mode != 0 && mode != 1) { + FIXME("unknown compare mode = %d\n", mode); + return E_FAIL; + } + } + else + mode = 0; + + left = V_BSTR(args); + right = V_BSTR(args+1); + + V_VT(res) = VT_I2; + ret = mode ? strcmpiW(left, right) : strcmpW(left, right); + if (ret < 0) + V_I2(res) = -1; + else if (ret > 0) + V_I2(res) = 1; + else + V_I2(res) = 0;
Please use return_short() helper here. Thanks, Jacek
participants (1)
-
Jacek Caban