Module: wine Branch: master Commit: 77c3dc544b1b946caf4949375c0e508f5334a2b5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=77c3dc544b1b946caf4949375c...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Sep 24 15:41:34 2012 +0200
jscript: Added support for limit argument in String.split.
---
dlls/jscript/string.c | 19 +++++++++++++++---- dlls/jscript/tests/api.js | 17 +++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-)
diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c index 5d50b85..e7216df 100644 --- a/dlls/jscript/string.c +++ b/dlls/jscript/string.c @@ -25,6 +25,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(jscript);
+#define UINT32_MAX 0xffffffff + typedef struct { jsdisp_t dispex;
@@ -1082,6 +1084,7 @@ static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi match_result_t *match_result = NULL; DWORD length, match_cnt, i, match_len = 0; const WCHAR *str, *ptr, *ptr2; + unsigned limit = UINT32_MAX; BOOL use_regexp = FALSE; jsdisp_t *array; BSTR val_str, match_str = NULL, tmp_str; @@ -1089,8 +1092,8 @@ static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi
TRACE("\n");
- if(argc != 1) { - FIXME("unsupported args\n"); + if(argc != 1 && argc != 2) { + FIXME("unsupported argc %u\n", argc); return E_NOTIMPL; }
@@ -1098,6 +1101,14 @@ static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi if(FAILED(hres)) return hres;
+ if(argc > 1 && !is_undefined(argv[1])) { + hres = to_uint32(ctx, argv[1], &limit); + if(FAILED(hres)) { + SysFreeString(val_str); + return hres; + } + } + if(is_object_instance(argv[0])) { jsdisp_t *regexp;
@@ -1133,7 +1144,7 @@ static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi
if(SUCCEEDED(hres)) { ptr = str; - for(i=0;; i++) { + for(i=0; i<limit; i++) { if(use_regexp) { if(i == match_cnt) break; @@ -1168,7 +1179,7 @@ static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi } }
- if(SUCCEEDED(hres) && (match_str || use_regexp)) { + if(SUCCEEDED(hres) && (match_str || use_regexp) && i<limit) { DWORD len = (str+length) - ptr;
if(len || match_str) { diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index c998fa6..03d1a71 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -512,6 +512,23 @@ ok(r[0] === "1", "r[0] = " + r[0]); ok(r[1] === "2", "r[1] = " + r[1]); ok(r[2] === "", "r[2] = " + r[2]);
+r = "1,2,3".split(",", 2); +ok(typeof(r) === "object", "typeof(r) = " + typeof(r)); +ok(r.length === 2, "r.length = " + r.length); +ok(r[0] === "1", "r[0] = " + r[0]); +ok(r[1] === "2", "r[1] = " + r[1]); + +r = "1,2,3".split(",", 0); +ok(typeof(r) === "object", "typeof(r) = " + typeof(r)); +ok(r.length === 0, "r.length = " + r.length); + +r = "1,2,3".split(",", -1); +ok(typeof(r) === "object", "typeof(r) = " + typeof(r)); +ok(r.length === 3, "r.length = " + r.length); +ok(r[0] === "1", "r[0] = " + r[0]); +ok(r[1] === "2", "r[1] = " + r[1]); +ok(r[2] === "3", "r[1] = " + r[1]); + tmp = "abcd".indexOf("bc",0); ok(tmp === 1, "indexOf = " + tmp); tmp = "abcd".indexOf("bc",1);