Module: wine Branch: master Commit: fd6cf181f6760e630d6505c6a4624a3af2e59297 URL: https://gitlab.winehq.org/wine/wine/-/commit/fd6cf181f6760e630d6505c6a4624a3...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Wed Nov 16 16:33:39 2022 +0300
vbscript: Implement FormatPercent().
---
dlls/vbscript/global.c | 32 +++++++++++++++++++++++++++++--- dlls/vbscript/tests/api.vbs | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 3 deletions(-)
diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c index 471523c0c8f..73049a5e77f 100644 --- a/dlls/vbscript/global.c +++ b/dlls/vbscript/global.c @@ -2983,10 +2983,36 @@ static HRESULT Global_FormatCurrency(BuiltinDisp *This, VARIANT *args, unsigned return return_bstr(res, str); }
-static HRESULT Global_FormatPercent(BuiltinDisp *This, VARIANT *arg, unsigned args_cnt, VARIANT *res) +static HRESULT Global_FormatPercent(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, VARIANT *res) { - FIXME("\n"); - return E_NOTIMPL; + union + { + struct + { + int num_dig, inc_lead, use_parens, group; + } s; + int val[4]; + } int_args = { .s.num_dig = -1, .s.inc_lead = -2, .s.use_parens = -2, .s.group = -2 }; + HRESULT hres; + BSTR str; + int i; + + TRACE("\n"); + + assert(1 <= args_cnt && args_cnt <= 5); + + for (i = 1; i < args_cnt; ++i) + { + if (V_VT(args+i) == VT_ERROR) continue; + if (V_VT(args+i) == VT_NULL) return MAKE_VBSERROR(VBSE_ILLEGAL_NULL_USE); + if (FAILED(hres = to_int(args+i, &int_args.val[i-1]))) return hres; + } + + hres = VarFormatPercent(args, int_args.s.num_dig, int_args.s.inc_lead, int_args.s.use_parens, + int_args.s.group, 0, &str); + if (FAILED(hres)) return hres; + + return return_bstr(res, str); }
static HRESULT Global_FormatDateTime(BuiltinDisp *This, VARIANT *arg, unsigned args_cnt, VARIANT *res) diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs index 391aa0b63fb..ecae726d229 100644 --- a/dlls/vbscript/tests/api.vbs +++ b/dlls/vbscript/tests/api.vbs @@ -2375,4 +2375,40 @@ end sub call testFormatCurrency() call testFormatCurrencyError()
+sub testFormatPercentError() + on error resume next + dim x + call Err.clear() + x = FormatPercent(null) + call ok(Err.number = 13, "Err.number = " & Err.number) + call ok(getVT(x) = "VT_EMPTY*", "getVT = " & getVT(x)) + call Err.clear() + x = FormatPercent(.10,null) + call ok(Err.number = 94, "Err.number = " & Err.number) + call ok(getVT(x) = "VT_EMPTY*", "getVT = " & getVT(x)) + call Err.clear() + x = FormatPercent(.10,0,null) + call ok(Err.number = 94, "Err.number = " & Err.number) + call ok(getVT(x) = "VT_EMPTY*", "getVT = " & getVT(x)) + call Err.clear() + x = FormatPercent(.10,0,0,null) + call ok(Err.number = 94, "Err.number = " & Err.number) + call ok(getVT(x) = "VT_EMPTY*", "getVT = " & getVT(x)) + call Err.clear() + x = FormatPercent(.10,0,0,0,null) + call ok(Err.number = 94, "Err.number = " & Err.number) + call ok(getVT(x) = "VT_EMPTY*", "getVT = " & getVT(x)) +end sub + +sub testFormatPercent() + dim x + + x = FormatPercent(0) + x = FormatPercent(.12,,,-1) + call ok(getVT(x) = "VT_BSTR*", "getVT = " & getVT(x)) +end sub + +call testFormatPercent() +call testFormatPercentError() + Call reportSuccess()