From 43bc4af02d93af3f72e76662afd2c5c06a9b7c25 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Sat, 23 Jan 2010 23:57:20 +0100 Subject: [PATCH] jscript: Added String.replace implementation. --- dlls/jscript/string.c | 54 ++++++++++++++++++++++++++++++++++++++++++-- dlls/jscript/tests/regexp.js | 45 +++++++++++++++++++++++++++++++++++- 2 files changed, 96 insertions(+), 3 deletions(-) diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c index 63c0fe8133e..31e73a0fbec 100644 --- a/dlls/jscript/string.c +++ b/dlls/jscript/string.c @@ -1032,8 +1032,58 @@ static HRESULT String_replace(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DI static HRESULT String_search(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + DispatchEx *regexp = NULL; + const WCHAR *str, *cp; + match_result_t match; + VARIANT *arg; + DWORD length; + BSTR val_str; + HRESULT hres; + + TRACE("\n"); + + hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str); + if(FAILED(hres)) + return hres; + + if(!arg_cnt(dp)) { + if(retv) + V_VT(retv) = VT_NULL; + SysFreeString(val_str); + return S_OK; + } + + arg = get_arg(dp,0); + if(V_VT(arg) == VT_DISPATCH) { + regexp = iface_to_jsdisp((IUnknown*)V_DISPATCH(arg)); + if(regexp) { + if(!is_class(regexp, JSCLASS_REGEXP)) { + jsdisp_release(regexp); + regexp = NULL; + } + } + } + + if(!regexp) { + hres = create_regexp_var(ctx, arg, NULL, ®exp); + if(FAILED(hres)) { + SysFreeString(val_str); + return hres; + } + } + + cp = str; + hres = regexp_match_next(ctx, regexp, FALSE, str, length, &cp, NULL, NULL, NULL, &match); + SysFreeString(val_str); + jsdisp_release(regexp); + if(FAILED(hres)) + return hres; + + if(retv) { + V_VT(retv) = VT_I4; + V_I4(retv) = hres == S_OK ? match.str-str : -1; + } + return S_OK; } /* ECMA-262 3rd Edition 15.5.4.13 */ diff --git a/dlls/jscript/tests/regexp.js b/dlls/jscript/tests/regexp.js index 7f5f907b068..52a94ad0b20 100644 --- a/dlls/jscript/tests/regexp.js +++ b/dlls/jscript/tests/regexp.js @@ -17,7 +17,7 @@ */ -var m, re, b; +var m, re, b, i, obj; re = /a+/; ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex); @@ -409,4 +409,47 @@ m = re.exec(" "); ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0"); ok(m === null, "m = " + m + " expected null"); +re = /aa/g; +i = 'baacd'.search(re); +ok(i === 1, "'baacd'.search(re) = " + i); +ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex); + +re.lastIndex = 2; +i = 'baacdaa'.search(re); +ok(i === 1, "'baacd'.search(re) = " + i); +ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex); + +re = /aa/; +i = 'baacd'.search(re); +ok(i === 1, "'baacd'.search(re) = " + i); +ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex); + +re.lastIndex = 2; +i = 'baacdaa'.search(re); +ok(i === 1, "'baacd'.search(re) = " + i); +ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex); + +re = /d/g; +re.lastIndex = 1; +i = 'abc'.search(re); +ok(i === -1, "'abc'.search(/d/g) = " + i); + +i = 'abcdde'.search(/[df]/); +ok(i === 3, "'abc'.search(/[df]/) = " + i); + +i = 'abcdde'.search(/[df]/, "a"); +ok(i === 3, "'abc'.search(/[df]/) = " + i); + +i = 'abcdde'.search("[df]"); +ok(i === 3, "'abc'.search(/d*/) = " + i); + +obj = { + toString: function() { return "abc"; } +}; +i = String.prototype.search.call(obj, "b"); +ok(i === 1, "String.prototype.seatch.apply(obj, 'b') = " + i); + +i = " undefined ".search(); +ok(i === null, "' undefined '.search() = " + i); + reportSuccess(); -- 2.11.4.GIT