Shuai Meng : vbscript: Implemented Sgn.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jul 11 13:37:31 CDT 2014
Module: wine
Branch: master
Commit: 0b13d721c27c2ede6a0e15d7822b37f6ef57f84e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0b13d721c27c2ede6a0e15d7822b37f6ef57f84e
Author: Shuai Meng <mengshuaicalendr at gmail.com>
Date: Fri Jul 11 11:47:45 2014 +0800
vbscript: Implemented Sgn.
---
dlls/vbscript/global.c | 53 ++++++++++++++++++++-------------------------
dlls/vbscript/tests/api.vbs | 31 ++++++++++++++++++++++++++
dlls/vbscript/vbscript.h | 1 +
3 files changed, 56 insertions(+), 29 deletions(-)
diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c
index fa53757..fa06353 100644
--- a/dlls/vbscript/global.c
+++ b/dlls/vbscript/global.c
@@ -182,35 +182,15 @@ HRESULT to_int(VARIANT *v, int *ret)
static HRESULT to_double(VARIANT *v, double *ret)
{
- switch(V_VT(v)) {
- case VT_I2:
- *ret = V_I2(v);
- break;
- case VT_I4:
- *ret = V_I4(v);
- break;
- case VT_R4:
- *ret = V_R4(v);
- break;
- case VT_R8:
- *ret = V_R8(v);
- break;
- case VT_BSTR: {
- VARIANT dst;
- HRESULT hres;
+ VARIANT dst;
+ HRESULT hres;
- V_VT(&dst) = VT_EMPTY;
- hres = VariantChangeType(&dst, v, VARIANT_LOCALBOOL, VT_R8);
- if(FAILED(hres))
- return hres;
- *ret = V_R8(&dst);
- break;
- }
- default:
- FIXME("arg %s not supported\n", debugstr_variant(v));
- return E_NOTIMPL;
- }
+ V_VT(&dst) = VT_EMPTY;
+ hres = VariantChangeType(&dst, v, 0, VT_R8);
+ if(FAILED(hres))
+ return hres;
+ *ret = V_R8(&dst);
return S_OK;
}
@@ -1284,8 +1264,23 @@ static HRESULT Global_Int(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIA
static HRESULT Global_Sgn(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
{
- FIXME("\n");
- return E_NOTIMPL;
+ double v;
+ short val;
+ HRESULT hres;
+
+ TRACE("(%s)\n", debugstr_variant(arg));
+
+ assert(args_cnt == 1);
+
+ if(V_VT(arg) == VT_NULL)
+ return MAKE_VBSERROR(VBSE_ILLEGAL_NULL_USE);
+
+ hres = to_double(arg, &v);
+ if (FAILED(hres))
+ return hres;
+
+ val = v == 0 ? 0 : (v > 0 ? 1 : -1);
+ return return_short(res, val);
}
static HRESULT Global_Now(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs
index abdb6c7..33596d3 100644
--- a/dlls/vbscript/tests/api.vbs
+++ b/dlls/vbscript/tests/api.vbs
@@ -878,4 +878,35 @@ Call ok(getVT(VarType(CBool(0.5))) = "VT_I2", "getVT(VarType(CBool(0.5))) = " &
Call ok(VarType(CByte(255)) = vbByte, "VarType(CByte(255)) = " & VarType(CByte(255)))
Call ok(getVT(VarType(CByte(255))) = "VT_I2", "getVT(VarType(CByte(255))) = " & getVT(VarType(CByte(255))))
+Call ok(Sgn(Empty) = 0, "Sgn(MyEmpty) = " & Sgn(Empty))
+Call ok(getVT(Sgn(Empty)) = "VT_I2", "getVT(Sgn(MyEmpty)) = " & getVT(Sgn(Empty)))
+Call ok(Sgn(0) = 0, "Sgn(0) = " & Sgn(0))
+Call ok(getVT(Sgn(0)) = "VT_I2", "getVT(Sgn(0)) = " & getVT(Sgn(0)))
+Call ok(Sgn(-32769) = -1, "Sgn(-32769) = " & Sgn(-32769))
+Call ok(getVT(Sgn(-32769)) = "VT_I2", "getVT(Sgn(-32769)) = " & getVT(Sgn(-32769)))
+Call ok(Sgn(CSng(-0.5)) = -1, "Sgn(CSng(-0.5)) = " & Sgn(CSng(-0.5)))
+Call ok(getVT(Sgn(CSng(-0.5))) = "VT_I2", "getVT(Sgn(CSng(-0.5))) = " & getVT(Sgn(CSng(-0.5))))
+Call ok(Sgn(0.5) = 1, "Sgn(0.5) = " & Sgn(0.5))
+Call ok(getVT(Sgn(0.5)) = "VT_I2", "getVT(Sgn(0.5)) = " & getVT(Sgn(0.5)))
+Call ok(Sgn(CCur(-1)) = -1, "Sgn(CCur(-1)) = " & Sgn(CCur(-1)))
+Call ok(getVT(Sgn(CCur(-1))) = "VT_I2", "getVT(Sgn(CCur(-1))) = " & getVT(Sgn(CCur(-1))))
+Call ok(Sgn(CStr(-1)) = -1, "Sgn(CStr(-1)) = " & Sgn(CStr(-1)))
+Call ok(getVT(Sgn(CStr(-1))) = "VT_I2", "getVT(Sgn(CStr(-1))) = " & getVT(Sgn(CStr(-1))))
+Call ok(Sgn(False) = 0, "Sgn(False) = " & Sgn(False))
+Call ok(getVT(Sgn(False)) = "VT_I2", "getVT(Sgn(False)) = " & getVT(Sgn(False)))
+Call ok(Sgn(True) = -1, "Sgn(True) = " & Sgn(True))
+Call ok(getVT(Sgn(True)) = "VT_I2", "getVT(Sgn(True)) = " & getVT(Sgn(True)))
+Call ok(Sgn(CByte(1)) = 1, "Sgn(CByte(1)) = " & Sgn(CByte(1)))
+Call ok(getVT(Sgn(CByte(1))) ="VT_I2", "getVT(Sgn(CByte(1))) = " & getVT(Sgn(CByte(1))))
+
+Sub testSgnError(strings, error_num)
+ on error resume next
+
+ Call Err.clear()
+ Call Sgn(strings)
+ Call ok(Err.number = error_num, "Err.number = " & Err.number)
+End Sub
+
+Call testSgnError(Null, 94)
+
Call reportSuccess()
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index c2fedd6..ed9491c 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -406,6 +406,7 @@ HRESULT map_hres(HRESULT) DECLSPEC_HIDDEN;
#define VBSE_PERMISSION_DENIED 70
#define VBSE_PATH_FILE_ACCESS 75
#define VBSE_PATH_NOT_FOUND 76
+#define VBSE_ILLEGAL_NULL_USE 94
#define VBSE_OLE_NOT_SUPPORTED 430
#define VBSE_OLE_NO_PROP_OR_METHOD 438
#define VBSE_ACTION_NOT_SUPPORTED 445
More information about the wine-cvs
mailing list