Alistair Leslie-Hughes : oleaut32: Support VT_DECIMAL in VarRound.

Alexandre Julliard julliard at winehq.org
Tue Feb 19 15:29:35 CST 2019


Module: wine
Branch: master
Commit: 0c738d900a8daccf2c5460972033766d34d59aed
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=0c738d900a8daccf2c5460972033766d34d59aed

Author: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date:   Thu Feb 14 03:39:57 2019 +0000

oleaut32: Support VT_DECIMAL in VarRound.

Based on a patch by Carlos Chiriboga Calderon.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=26653
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/oleaut32/tests/vartest.c |  4 ++--
 dlls/oleaut32/variant.c       | 14 ++++++++++++++
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/dlls/oleaut32/tests/vartest.c b/dlls/oleaut32/tests/vartest.c
index 62b4852..0b1ac0f 100644
--- a/dlls/oleaut32/tests/vartest.c
+++ b/dlls/oleaut32/tests/vartest.c
@@ -3630,7 +3630,8 @@ static const struct decimal_round_t decimal_round_data[] = {
     {{ 2, 0, 0, 0, 199 }, { 2, 0, 0, 0, 199 }, 2},
     {{ 2, DECIMAL_NEG, 0, 0, 199 }, { 2, DECIMAL_NEG, 0, 0, 199 }, 2},
     {{ 2, DECIMAL_NEG, 0, 0, 55 },  { 2, DECIMAL_NEG, 0, 0, 6 }, 1},
-    {{ 2, 0, 0, 0, 55 },  { 2, 0, 0, 0, 6 }, 1}
+    {{ 2, 0, 0, 0, 55 },  { 2, 0, 0, 0, 6 }, 1},
+    {{ 2, 0, 0, 0, 1999 }, { 1, 0, 0, 0, 200 }, 1},
 };
 
 static void test_VarRound(void)
@@ -3733,7 +3734,6 @@ static void test_VarRound(void)
         S1(U1(*pdec)).Lo32 = ptr->source.Lo32;
         VariantInit(&vDst);
         hres = pVarRound(&v, ptr->dec, &vDst);
-    todo_wine
         ok(hres == S_OK, "%d: got 0x%08x\n", i, hres);
         if (hres == S_OK)
         {
diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c
index 8781f3e..fcbef53 100644
--- a/dlls/oleaut32/variant.c
+++ b/dlls/oleaut32/variant.c
@@ -5134,7 +5134,21 @@ HRESULT WINAPI VarRound(LPVARIANT pVarIn, int deci, LPVARIANT pVarOut)
 	}
 	V_VT(pVarOut) = V_VT(pVarIn);
 	break;
+    case VT_DECIMAL:
+    {
+        double dbl;
 
+        VarR8FromDec(&V_DECIMAL(pVarIn), &dbl);
+
+        if (dbl>0.0f)
+            dbl = floor(dbl*pow(10,deci)+0.5);
+        else
+            dbl = ceil(dbl*pow(10,deci)-0.5);
+
+        V_VT(pVarOut)=VT_DECIMAL;
+        VarDecFromR8(dbl, &V_DECIMAL(pVarOut));
+        break;
+    }
     /* cases we don't know yet */
     default:
 	FIXME("unimplemented part, V_VT(pVarIn) == 0x%X, deci == %d\n",




More information about the wine-cvs mailing list