Jacek Caban : jscript: Added String.replace implementation.

Alexandre Julliard julliard at winehq.org
Mon Jan 25 11:21:04 CST 2010


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sat Jan 23 23:57:20 2010 +0100

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 63c0fe8..31e73a0 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, &regexp);
+        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 7f5f907..52a94ad 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();




More information about the wine-cvs mailing list