Jacek Caban : jscript: Added parseInt implementation.
Alexandre Julliard
julliard at winehq.org
Mon Sep 22 07:04:23 CDT 2008
Module: wine
Branch: master
Commit: f8537b6eb976ea65136d8ba0b0190c422974c5db
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f8537b6eb976ea65136d8ba0b0190c422974c5db
Author: Jacek Caban <jacek at codeweavers.com>
Date: Sun Sep 21 15:42:48 2008 +0200
jscript: Added parseInt implementation.
---
dlls/jscript/global.c | 75 ++++++++++++++++++++++++++++++++++++++++++++-
dlls/jscript/tests/api.js | 21 ++++++++++++-
2 files changed, 94 insertions(+), 2 deletions(-)
diff --git a/dlls/jscript/global.c b/dlls/jscript/global.c
index 4404bff..adee371 100644
--- a/dlls/jscript/global.c
+++ b/dlls/jscript/global.c
@@ -228,10 +228,83 @@ static HRESULT JSGlobal_isFinite(DispatchEx *dispex, LCID lcid, WORD flags, DISP
return E_NOTIMPL;
}
+static INT char_to_int(WCHAR c)
+{
+ if('0' <= c && c <= '9')
+ return c - '0';
+ if('a' <= c && c <= 'z')
+ return c - 'a' + 10;
+ if('A' <= c && c <= 'Z')
+ return c - 'A' + 10;
+ return 100;
+}
+
static HRESULT JSGlobal_parseInt(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- return E_NOTIMPL;
+ DOUBLE ret = 0.0;
+ INT radix=10, i;
+ WCHAR *ptr;
+ BOOL neg = FALSE;
+ BSTR str;
+ HRESULT hres;
+
+ if(!arg_cnt(dp)) {
+ FIXME("NAN\n");
+ return E_NOTIMPL;
+ }
+
+ if(arg_cnt(dp) >= 2) {
+ hres = to_int32(dispex->ctx, get_arg(dp, 1), ei, &radix);
+ if(FAILED(hres))
+ return hres;
+
+ if(!radix) {
+ radix = 10;
+ }else if(radix < 2 || radix > 36) {
+ WARN("radix %d out of range\n", radix);
+ return E_FAIL;
+ }
+ }
+
+ hres = to_string(dispex->ctx, get_arg(dp, 0), ei, &str);
+ if(FAILED(hres))
+ return hres;
+
+ for(ptr = str; isspaceW(*ptr); ptr++);
+
+ switch(*ptr) {
+ case '+':
+ ptr++;
+ break;
+ case '-':
+ neg = TRUE;
+ ptr++;
+ break;
+ case '0':
+ ptr++;
+ if(*ptr == 'x' || *ptr == 'X') {
+ radix = 16;
+ ptr++;
+ }
+ }
+
+ while(*ptr) {
+ i = char_to_int(*ptr++);
+ if(i > radix)
+ break;
+
+ ret = ret*radix + i;
+ }
+
+ SysFreeString(str);
+
+ if(neg)
+ ret = -ret;
+
+ if(retv)
+ num_set_val(retv, ret);
+ return S_OK;
}
static HRESULT JSGlobal_parseFloat(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index f8b6607..8237ddb 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -16,7 +16,26 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-var tmp;
+var tmp, i;
+
+i = parseInt("0");
+ok(i === 0, "parseInt('0') = " + i);
+i = parseInt("123");
+ok(i === 123, "parseInt('123') = " + i);
+i = parseInt("-123");
+ok(i === -123, "parseInt('-123') = " + i);
+i = parseInt("0xff");
+ok(i === 0xff, "parseInt('0xff') = " + i);
+i = parseInt("11", 8);
+ok(i === 9, "parseInt('11', 8) = " + i);
+i = parseInt("1j", 22);
+ok(i === 41, "parseInt('1j', 32) = " + i);
+i = parseInt("123", 0);
+ok(i === 123, "parseInt('123', 0) = " + i);
+i = parseInt("123", 10, "test");
+ok(i === 123, "parseInt('123', 10, 'test') = " + i);
+i = parseInt("11", "8");
+ok(i === 9, "parseInt('11', '8') = " + i);
tmp = "" + new Object();
ok(tmp === "[object Object]", "'' + new Object() = " + tmp);
More information about the wine-cvs
mailing list