Module: wine Branch: master Commit: d273247eb9bd3420ce06d7688a8accbd73c4dafb URL: https://gitlab.winehq.org/wine/wine/-/commit/d273247eb9bd3420ce06d7688a8accb...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Wed Nov 16 16:27:58 2022 +0300
vbscript: Implement FormatCurrency().
---
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 424fbadda6c..471523c0c8f 100644 --- a/dlls/vbscript/global.c +++ b/dlls/vbscript/global.c @@ -2951,10 +2951,36 @@ static HRESULT Global_FormatNumber(BuiltinDisp *This, VARIANT *arg, unsigned arg return E_NOTIMPL; }
-static HRESULT Global_FormatCurrency(BuiltinDisp *This, VARIANT *arg, unsigned args_cnt, VARIANT *res) +static HRESULT Global_FormatCurrency(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 = VarFormatCurrency(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_FormatPercent(BuiltinDisp *This, VARIANT *arg, unsigned args_cnt, VARIANT *res) diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs index 0e47f428d09..391aa0b63fb 100644 --- a/dlls/vbscript/tests/api.vbs +++ b/dlls/vbscript/tests/api.vbs @@ -2339,4 +2339,40 @@ end sub call testRandomize() call testRandomizeError()
+sub testFormatCurrencyError() + on error resume next + dim x + call Err.clear() + x = FormatCurrency(null) + call ok(Err.number = 13, "Err.number = " & Err.number) + call ok(getVT(x) = "VT_EMPTY*", "getVT = " & getVT(x)) + call Err.clear() + x = FormatCurrency(1000,null) + call ok(Err.number = 94, "Err.number = " & Err.number) + call ok(getVT(x) = "VT_EMPTY*", "getVT = " & getVT(x)) + call Err.clear() + x = FormatCurrency(1000,0,null) + call ok(Err.number = 94, "Err.number = " & Err.number) + call ok(getVT(x) = "VT_EMPTY*", "getVT = " & getVT(x)) + call Err.clear() + x = FormatCurrency(1000,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 = FormatCurrency(1000,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 testFormatCurrency() + dim x + + x = FormatCurrency(0) + x = FormatCurrency(-1000,,,-1) + call ok(getVT(x) = "VT_BSTR*", "getVT = " & getVT(x)) +end sub + +call testFormatCurrency() +call testFormatCurrencyError() + Call reportSuccess()