Jacek Caban : jscript: Added support for limit argument in String.split.

Alexandre Julliard julliard at winehq.org
Mon Sep 24 16:04:28 CDT 2012


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

Author: Jacek Caban <jacek at 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);




More information about the wine-cvs mailing list