Jacek Caban : vbscript: Round half to even in to_int.

Alexandre Julliard julliard at winehq.org
Thu May 16 13:55:06 CDT 2013


Module: wine
Branch: master
Commit: 48a862306288d69d3623d5ecdc0f5a5a40addafe
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=48a862306288d69d3623d5ecdc0f5a5a40addafe

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu May 16 11:26:17 2013 +0200

vbscript: Round half to even in to_int.

Spotted by Zhan Jianyu.

---

 dlls/vbscript/global.c      |   12 ++++++++++--
 dlls/vbscript/tests/api.vbs |    9 +++++++++
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c
index 4a5a277..392b88f 100644
--- a/dlls/vbscript/global.c
+++ b/dlls/vbscript/global.c
@@ -150,12 +150,20 @@ static HRESULT to_int(VARIANT *v, int *ret)
         *ret = V_I4(v);
         break;
     case VT_R8: {
-        double n = round(V_R8(v));
+        double n = floor(V_R8(v)+0.5);
+        INT32 i;
+
         if(!is_int32(n)) {
             FIXME("%lf is out of int range\n", n);
             return E_FAIL;
         }
-        *ret = n;
+
+        /* Round half to even */
+        i = n;
+        if(i%2 && n-V_R8(v) == 0.5)
+            i--;
+
+        *ret = i;
         break;
     }
     case VT_BOOL:
diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs
index 0aaeefb..b6d8cd5 100644
--- a/dlls/vbscript/tests/api.vbs
+++ b/dlls/vbscript/tests/api.vbs
@@ -134,6 +134,8 @@ Call ok(getVT(Chr(120)) = "VT_BSTR", "getVT(Chr(120)) = " & getVT(Chr(120)))
 Call ok(getVT(Chr(255)) = "VT_BSTR", "getVT(Chr(255)) = " & getVT(Chr(255)))
 Call ok(Chr(120) = "x", "Chr(120) = " & Chr(120))
 Call ok(Chr(0) <> "", "Chr(0) = """"")
+Call ok(Chr(120.5) = "x", "Chr(120.5) = " & Chr(120.5))
+Call ok(Chr(119.5) = "x", "Chr(119.5) = " & Chr(119.5))
 
 Call ok(isObject(new EmptyClass), "isObject(new EmptyClass) is not true?")
 Set x = new EmptyClass
@@ -292,6 +294,9 @@ Call ok(Space(5) = "     ", "Space(5) = " & Space(5) & """")
 Call ok(Space(5.2) = "     ", "Space(5.2) = " & Space(5.2) & """")
 Call ok(Space(5.8) = "      ", "Space(5.8) = " & Space(5.8) & """")
 Call ok(Space(5.5) = "      ", "Space(5.5) = " & Space(5.5) & """")
+Call ok(Space(4.5) = "    ", "Space(4.5) = " & Space(4.5) & """")
+Call ok(Space(0.5) = "", "Space(0.5) = " & Space(0.5) & """")
+Call ok(Space(1.5) = "  ", "Space(1.5) = " & Space(1.5) & """")
 
 Sub TestStrReverse(str, ex)
     Call ok(StrReverse(str) = ex, "StrReverse(" & str & ") = " & StrReverse(str))
@@ -310,6 +315,8 @@ TestLeft "test", 2, "te"
 TestLeft "test", 5, "test"
 TestLeft "test", 0, ""
 TestLeft 123, 2, "12"
+TestLeft "123456", 1.5, "12"
+TestLeft "123456", 2.5, "12"
 if isEnglishLang then TestLeft true, 2, "Tr"
 
 Sub TestRight(str, len, ex)
@@ -383,6 +390,8 @@ if isEnglishLang then
     Call ok(WeekDayName(1, 10) = "Sun", "WeekDayName(1, 10) = " & WeekDayName(1, 10))
     Call ok(WeekDayName(1, true, 0) = "Sun", "WeekDayName(1, true, 0) = " & WeekDayName(1, true, 0))
     Call ok(WeekDayName(1, true, 2) = "Mon", "WeekDayName(1, true, 2) = " & WeekDayName(1, true, 2))
+    Call ok(WeekDayName(1, true, 2.5) = "Mon", "WeekDayName(1, true, 2.5) = " & WeekDayName(1, true, 2.5))
+    Call ok(WeekDayName(1, true, 1.5) = "Mon", "WeekDayName(1, true, 1.5) = " & WeekDayName(1, true, 1.5))
     Call ok(WeekDayName(1, true, 7) = "Sat", "WeekDayName(1, true, 7) = " & WeekDayName(1, true, 7))
     Call ok(WeekDayName(1, true, 7.1) = "Sat", "WeekDayName(1, true, 7.1) = " & WeekDayName(1, true, 7.1))
 




More information about the wine-cvs mailing list