Alexandre Julliard : kernelbase: Copy MulDiv() implementation instead of forwarding.

Alexandre Julliard julliard at winehq.org
Fri Nov 13 15:57:52 CST 2020


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Nov 13 13:18:53 2020 +0100

kernelbase: Copy MulDiv() implementation instead of forwarding.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernelbase/kernelbase.spec |  2 +-
 dlls/kernelbase/main.c          | 26 ++++++++++++++++++++++++++
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec
index da35b5e5c6e..36d0492857f 100644
--- a/dlls/kernelbase/kernelbase.spec
+++ b/dlls/kernelbase/kernelbase.spec
@@ -959,7 +959,7 @@
 @ stdcall MoveFileExW(wstr wstr long)
 # @ stub MoveFileWithProgressTransactedW
 @ stdcall MoveFileWithProgressW(wstr wstr ptr ptr long)
-@ stdcall MulDiv(long long long) kernel32.MulDiv
+@ stdcall MulDiv(long long long)
 @ stdcall MultiByteToWideChar(long long str long ptr long)
 # @ stub NamedPipeEventEnum
 # @ stub NamedPipeEventSelect
diff --git a/dlls/kernelbase/main.c b/dlls/kernelbase/main.c
index e85586a0751..b90ee1cba2c 100644
--- a/dlls/kernelbase/main.c
+++ b/dlls/kernelbase/main.c
@@ -62,6 +62,32 @@ BOOL WINAPI DllMainCRTStartup( HANDLE inst, DWORD reason, LPVOID reserved )
 }
 
 
+/***********************************************************************
+ *           MulDiv   (kernelbase.@)
+ */
+INT WINAPI MulDiv( INT a, INT b, INT c )
+{
+    LONGLONG ret;
+
+    if (!c) return -1;
+
+    /* We want to deal with a positive divisor to simplify the logic. */
+    if (c < 0)
+    {
+        a = -a;
+        c = -c;
+    }
+
+    /* If the result is positive, we "add" to round. else, we subtract to round. */
+    if ((a < 0 && b < 0) || (a >= 0 && b >= 0))
+        ret = (((LONGLONG)a * b) + (c / 2)) / c;
+    else
+        ret = (((LONGLONG)a * b) - (c / 2)) / c;
+
+    if (ret > 2147483647 || ret < -2147483647) return -1;
+    return ret;
+}
+
 /***********************************************************************
  *          AppPolicyGetProcessTerminationMethod (KERNELBASE.@)
  */




More information about the wine-cvs mailing list