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