jscript: Implement multiple Math functions.

Patrick Rudolph patrick1804 at web.de
Wed Dec 10 09:51:19 CST 2008


	modified:   math.c
	modified:   tests/api.js
---
 dlls/jscript/math.c       |  293 +++++++++++++++++++++++++++++++++++++++-=
-----
 dlls/jscript/tests/api.js |   32 +++++
 2 files changed, 287 insertions(+), 38 deletions(-)

diff --git a/dlls/jscript/math.c b/dlls/jscript/math.c
index e6b7202..56ba9cf 100644
--- a/dlls/jscript/math.c
+++ b/dlls/jscript/math.c
@@ -20,6 +20,7 @@
 #include "wine/port.h"
=20
 #include <math.h>
+#include <sys/time.h>
=20
 #include "jscript.h"
=20
@@ -57,57 +58,105 @@ static const WCHAR tanW[] =3D {'t','a','n',0};
 static HRESULT Math=5FE(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA=
MS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    if(arg=5Fcnt(dp) > 0) {
+        FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+        return E=5FNOTIMPL;
+    }
+
+    if(retv)
+    num=5Fset=5Fval(retv, exp(1));
+    return S=5FOK;
 }
=20
 static HRESULT Math=5FLOG2E(DispatchEx *dispex, LCID lcid, WORD flags, DISP=
PARAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    if(arg=5Fcnt(dp) > 0) {
+        FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+        return E=5FNOTIMPL;
+    }
+
+    if(retv)
+    num=5Fset=5Fval(retv, log(exp(1))/log(2));
+    return S=5FOK;
 }
=20
 static HRESULT Math=5FLOG10E(DispatchEx *dispex, LCID lcid, WORD flags, DIS=
PPARAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    if(arg=5Fcnt(dp) > 0) {
+        FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+        return E=5FNOTIMPL;
+    }
+
+    if(retv)
+    num=5Fset=5Fval(retv, log10(exp(1)));
+    return S=5FOK;
 }
=20
 static HRESULT Math=5FLN2(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA=
RAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    if(arg=5Fcnt(dp) > 0) {
+        FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+        return E=5FNOTIMPL;
+    }
+
+    if(retv)
+    num=5Fset=5Fval(retv, log(2));
+    return S=5FOK;
 }
=20
 static HRESULT Math=5FLN10(DispatchEx *dispex, LCID lcid, WORD flags, DISPP=
ARAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    if(arg=5Fcnt(dp) > 0) {
+        FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+        return E=5FNOTIMPL;
+    }
+
+   if(retv)
+   num=5Fset=5Fval(retv, log(10));
+   return S=5FOK;
 }
=20
 static HRESULT Math=5FPI(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR=
AMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    if(arg=5Fcnt(dp) > 0) {
+        FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+        return E=5FNOTIMPL;
+    }
+
+    if(retv)
+    num=5Fset=5Fval(retv, atan(1)*4);
+    return S=5FOK;
 }
=20
 static HRESULT Math=5FSQRT2(DispatchEx *dispex, LCID lcid, WORD flags, DISP=
PARAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    if(arg=5Fcnt(dp) > 0) {
+        FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+        return E=5FNOTIMPL;
+    }
+
+    if(retv)
+        num=5Fset=5Fval(retv, sqrt(2));
+    return S=5FOK;
 }
=20
 static HRESULT Math=5FSQRT1=5F2(DispatchEx *dispex, LCID lcid, WORD flags, DI=
SPPARAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    if(arg=5Fcnt(dp) > 0) {
+        FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+        return E=5FNOTIMPL;
+    }
+
+    if(retv)
+        num=5Fset=5Fval(retv, 1/sqrt(2));
+    return S=5FOK;
 }
=20
 /* ECMA-262 3rd Edition    15.8.2.12 */
@@ -139,29 +188,96 @@ static HRESULT Math=5Fabs(DispatchEx *dispex, LCID lci=
d, WORD flags, DISPPARAMS *d
 static HRESULT Math=5Facos(DispatchEx *dispex, LCID lcid, WORD flags, DISPP=
ARAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    VARIANT v;
+    HRESULT hres;
+
+    TRACE("\n");
+
+    if(!arg=5Fcnt(dp)) {
+        if(retv)
+            num=5Fset=5Fnan(retv);
+        return S=5FOK;
+    }
+
+    hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+    if(FAILED(hres))
+        return hres;
+
+    if(retv)
+        num=5Fset=5Fval(retv, acos(num=5Fval(&v)));
+    return S=5FOK;
 }
=20
 static HRESULT Math=5Fasin(DispatchEx *dispex, LCID lcid, WORD flags, DISPP=
ARAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    VARIANT v;
+    HRESULT hres;
+
+    TRACE("\n");
+
+    if(!arg=5Fcnt(dp)) {
+        if(retv)
+            num=5Fset=5Fnan(retv);
+        return S=5FOK;
+    }
+
+    hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+    if(FAILED(hres))
+        return hres;
+
+    if(retv)
+        num=5Fset=5Fval(retv, asin(num=5Fval(&v)));
+    return S=5FOK;
 }
=20
 static HRESULT Math=5Fatan(DispatchEx *dispex, LCID lcid, WORD flags, DISPP=
ARAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    VARIANT v;
+    HRESULT hres;
+
+    TRACE("\n");
+
+    if(!arg=5Fcnt(dp)) {
+        if(retv)
+            num=5Fset=5Fnan(retv);
+        return S=5FOK;
+    }
+
+    hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+    if(FAILED(hres))
+        return hres;
+
+    if(retv)
+        num=5Fset=5Fval(retv, atan(num=5Fval(&v)));
+    return S=5FOK;
 }
=20
 static HRESULT Math=5Fatan2(DispatchEx *dispex, LCID lcid, WORD flags, DISP=
PARAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    VARIANT x, y;
+    HRESULT hres;
+
+    TRACE("\n");
+
+    if(arg=5Fcnt(dp) < 2) {
+        FIXME("unimplemented arg=5Fcnt %d\n", arg=5Fcnt(dp));
+        return E=5FNOTIMPL;
+    }
+
+    hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &x);
+    if(FAILED(hres))
+        return hres;
+
+    hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 1), ei, &y);
+    if(FAILED(hres))
+        return hres;
+
+    if(retv)
+        num=5Fset=5Fval(retv, atan2(num=5Fval(&x),num=5Fval(&y)) );
+    return S=5FOK;
 }
=20
 /* ECMA-262 3rd Edition    15.8.2.6 */
@@ -191,15 +307,45 @@ static HRESULT Math=5Fceil(DispatchEx *dispex, LCID lc=
id, WORD flags, DISPPARAMS *
 static HRESULT Math=5Fcos(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA=
RAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    VARIANT v;
+    HRESULT hres;
+
+    TRACE("\n");
+
+    if(!arg=5Fcnt(dp)) {
+        FIXME("arg=5Fcnt =3D 0\n");
+        return E=5FNOTIMPL;
+    }
+
+    hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+    if(FAILED(hres))
+        return hres;
+
+    if(retv)
+        num=5Fset=5Fval(retv, cos(num=5Fval(&v)));
+    return S=5FOK;
 }
=20
 static HRESULT Math=5Fexp(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA=
RAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    VARIANT v;
+    HRESULT hres;
+
+    TRACE("\n");
+
+    if(!arg=5Fcnt(dp)) {
+        FIXME("arg=5Fcnt =3D 0\n");
+        return E=5FNOTIMPL;
+    }
+
+    hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+    if(FAILED(hres))
+        return hres;
+
+    if(retv)
+        num=5Fset=5Fval(retv, exp(num=5Fval(&v)));
+    return S=5FOK;
 }
=20
 static HRESULT Math=5Ffloor(DispatchEx *dispex, LCID lcid, WORD flags, DISP=
PARAMS *dp,
@@ -228,8 +374,23 @@ static HRESULT Math=5Ffloor(DispatchEx *dispex, LCID lc=
id, WORD flags, DISPPARAMS
 static HRESULT Math=5Flog(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA=
RAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    VARIANT v;
+    HRESULT hres;
+
+    TRACE("\n");
+
+    if(!arg=5Fcnt(dp)) {
+        FIXME("arg=5Fcnt =3D 0\n");
+        return E=5FNOTIMPL;
+    }
+
+    hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+    if(FAILED(hres))
+        return hres;
+
+    if(retv)
+        num=5Fset=5Fval(retv, log(num=5Fval(&v)));
+    return S=5FOK;
 }
=20
 /* ECMA-262 3rd Edition    15.8.2.11 */
@@ -333,11 +494,17 @@ static HRESULT Math=5Fpow(DispatchEx *dispex, LCID lci=
d, WORD flags, DISPPARAMS *d
     return S=5FOK;
 }
=20
+/*returns a random value between 0...1*/
 static HRESULT Math=5Frandom(DispatchEx *dispex, LCID lcid, WORD flags, DIS=
PPARAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    if(arg=5Fcnt(dp) > 0) {
+        FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+        return E=5FNOTIMPL;
+    }
+    if(retv)
+        num=5Fset=5Fval(retv, ((double)rand()/(double)RAND=5FMAX));
+    return S=5FOK;
 }
=20
 /* ECMA-262 3rd Edition    15.8.2.15 */
@@ -366,22 +533,68 @@ static HRESULT Math=5Fround(DispatchEx *dispex, LCID l=
cid, WORD flags, DISPPARAMS
 static HRESULT Math=5Fsin(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA=
RAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    VARIANT v;
+    HRESULT hres;
+
+    TRACE("\n");
+
+    if(!arg=5Fcnt(dp)) {
+        FIXME("arg=5Fcnt =3D 0\n");
+        return E=5FNOTIMPL;
+    }
+
+    hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+    if(FAILED(hres))
+        return hres;
+
+    if(retv)
+        num=5Fset=5Fval(retv, sin(num=5Fval(&v)));
+    return S=5FOK;
 }
=20
 static HRESULT Math=5Fsqrt(DispatchEx *dispex, LCID lcid, WORD flags, DISPP=
ARAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    VARIANT v;
+    HRESULT hres;
+
+    TRACE("\n");
+
+    if(!arg=5Fcnt(dp)) {
+        FIXME("arg=5Fcnt =3D 0\n");
+        return E=5FNOTIMPL;
+    }
+
+    hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+    if(FAILED(hres))
+        return hres;
+
+    if(retv)
+        num=5Fset=5Fval(retv, sqrt(num=5Fval(&v)));
+    return S=5FOK;
+
 }
=20
 static HRESULT Math=5Ftan(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA=
RAMS *dp,
         VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E=5FNOTIMPL;
+    VARIANT v;
+    HRESULT hres;
+
+    TRACE("\n");
+
+    if(!arg=5Fcnt(dp)) {
+        FIXME("arg=5Fcnt =3D 0\n");
+        return E=5FNOTIMPL;
+    }
+
+    hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+    if(FAILED(hres))
+        return hres;
+
+    if(retv)
+        num=5Fset=5Fval(retv, tan(num=5Fval(&v)));
+    return S=5FOK;
 }
=20
 static const builtin=5Fprop=5Ft Math=5Fprops[] =3D {
@@ -424,5 +637,9 @@ static const builtin=5Finfo=5Ft Math=5Finfo =3D {
=20
 HRESULT create=5Fmath(script=5Fctx=5Ft *ctx, DispatchEx **ret)
 {
+    /*randomize srand() function */
+    struct timeval tv;
+    gettimeofday(&tv,NULL);
+    srand(tv.tv=5Fsec *1000+(tv.tv=5Fusec/1000));     =20
     return create=5Fdispex(ctx, &Math=5Finfo, NULL, ret);
 }
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index 2868c0f..6430397 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -585,6 +585,38 @@ ok(tmp =3D=3D=3D 2, "Math.pow(2, 2) =3D " + tmp);
 tmp =3D Math.pow(2, 2, 3);
 ok(tmp =3D=3D=3D 4, "Math.pow(2, 2, 3) =3D " + tmp);
=20
+tmp =3D Math.PI();
+
+i =3D Math.sin(0);
+ok(i =3D=3D=3D 0, "Math.sin(0) =3D " + i);
+
+i =3D Math.cos(0);
+ok(i =3D=3D=3D 1, "Math.cos(0) =3D " + i);
+
+i =3D Math.tan(0);
+ok(i =3D=3D=3D 0, "Math.tan(0) =3D " + i);
+
+i =3D Math.log(1);
+ok(i =3D=3D=3D 0 , "Math.log() =3D " + i);
+
+i =3D Math.random();
+ok(i !=3D=3D 0 , "Math.random() =3D " + i);
+
+i =3D Math.random();
+ok(i !=3D=3D 1 , "Math.random() =3D " + i);
+
+i =3D Math.atan2(0,1);
+ok(i =3D=3D=3D 0 , "Math.atan2(0,1) =3D " + i);
+
+i =3D Math.atan(0);
+ok(i =3D=3D=3D 0 , "Math.atan2(0) =3D " + i);
+
+i =3D Math.asin(1);
+ok(i =3D=3D=3D tmp/2 , "Math.asin(1) =3D " + i);
+
+i =3D Math.acos(-1);
+ok(i =3D=3D=3D tmp , "Math.acos(-1) =3D " + i);
+
 var func =3D function  (a) {
         var a =3D 1;
         if(a) return;
--=20
1.5.6.3


=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F
Sensationsangebot verl=E4ngert: WEB.DE FreeDSL - Telefonanschluss + DSL
f=FCr nur 16,37 Euro/mtl.!* http://dsl.web.de/=3Fac=3DOM.AD.AD008K15039B7069a




More information about the wine-patches mailing list