From 75be5eee639d1d0fd3542cc744d15b0f20f43e0e Mon Sep 17 00:00:00 2001 From: Zhan Jianyu Date: Tue, 21 May 2013 21:30:06 +0800 Subject: [PATCH] vbscript: Implemented builtin function CBool. --- dlls/vbscript/global.c | 36 ++++++++++++++++++++++++++++++++++-- dlls/vbscript/tests/api.vbs | 8 ++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c index 49dcb50b608..fbd86012be4 100644 --- a/dlls/vbscript/global.c +++ b/dlls/vbscript/global.c @@ -114,6 +114,16 @@ static HRESULT return_int(VARIANT *res, int val) return S_OK; } +static HRESULT return_bool(VARIANT *res, int val) +{ + if(res) { + V_VT(res) = VT_BOOL; + V_BOOL(res) = val != 0 ? VARIANT_TRUE : VARIANT_FALSE; + } + + return S_OK; +} + static inline HRESULT return_double(VARIANT *res, double val) { if(res) { @@ -400,8 +410,30 @@ static HRESULT Global_CLng(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARI static HRESULT Global_CBool(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res) { - FIXME("\n"); - return E_NOTIMPL; + int val; + TRACE("%s\n", debugstr_variant(arg)); + + assert(args_cnt == 1); + + switch(V_VT(arg)) { + case VT_I2: + val = V_I2(arg); + break; + case VT_I4: + val = V_I4(arg); + break; + case VT_R4: + val = V_R4(arg) > 0.0 || V_R4(arg) < 0.0; + break; + case VT_R8: + val = V_R8(arg) > 0.0 || V_R8(arg) < 0.0; + break; + default: + ERR("Not a numeric vaule: %s\n", debugstr_variant(arg)); + return E_FAIL; + } + + return return_bool(res, val); } static HRESULT Global_CByte(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 1151071a2f9..3c496b186f2 100644 --- a/dlls/vbscript/tests/api.vbs +++ b/dlls/vbscript/tests/api.vbs @@ -456,4 +456,12 @@ Call ok(getVT(CInt(36.50)) = "VT_I2", "getVT(CInt(36.50)) = " & getVT(CInt(36.50 Call ok(CInt(36.75) = 37, "CInt(36.75) = " & CInt(36.75)) Call ok(getVT(CInt(36.75)) = "VT_I2", "getVT(CInt(36.75)) = " & getVT(CInt(36.75))) + +Call ok(CBool(5) = true, "CBool(5) = " & CBool(5)) +Call ok(getVT(CBool(5)) = "VT_BOOL", "getVT(CBool(5)) = " & getVT(CBool(5))) +Call ok(CBool(0) = false, "CBool(0) = " & CBool(0)) +Call ok(getVT(CBool(0)) = "VT_BOOL", "getVT(CBool(0)) = " & getVT(CBool(0))) +Call ok(CBool(-5) = true, "CBool(-5) = " & CBool(-5)) +Call ok(getVT(CBool(-5)) = "VT_BOOL", "getVT(CBool(-5)) = " & getVT(CBool(-5))) + Call reportSuccess()