https://git.reactos.org/?p=reactos.git;a=commitdiff;h=994d5e0ad1a5b194e2c60…
commit 994d5e0ad1a5b194e2c60ea395dfc2dcf19b95dc
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Sun Aug 6 09:50:39 2023 +0300
Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org>
CommitDate: Fri Aug 11 19:00:42 2023 +0300
[CRT] Make _controlfp_s portable
---
sdk/lib/crt/float/_controlfp_s.c | 31 +++++++++++++++++++++++++++++++
sdk/lib/crt/float/arm/_controlfp.c | 13 -------------
sdk/lib/crt/float/float.cmake | 1 +
sdk/lib/crt/float/i386/cntrlfp.c | 22 ----------------------
4 files changed, 32 insertions(+), 35 deletions(-)
diff --git a/sdk/lib/crt/float/_controlfp_s.c b/sdk/lib/crt/float/_controlfp_s.c
new file mode 100644
index 00000000000..5f5363770ce
--- /dev/null
+++ b/sdk/lib/crt/float/_controlfp_s.c
@@ -0,0 +1,31 @@
+/*
+ * PROJECT: ReactOS CRT library
+ * LICENSE: GPL-2.0+ (
https://spdx.org/licenses/GPL-2.0+)
+ * PURPOSE: Implementation of _controlfp_s (adapted from wine msvcrt/math.c)
+ * COPYRIGHT: Copyright 2000 Jon Griffiths
+ * Copyright 2010 Piotr Caban
+ * Copyright 2021 Roman Masanin <36927roma(a)gmail.com>
+ */
+
+#include <precomp.h>
+#include <float.h>
+
+#ifdef _M_ARM
+#define INVALID_MASK ~(_MCW_EM | _MCW_RC | _MCW_DN)
+#else
+#define INVALID_MASK ~(_MCW_EM | _MCW_IC | _MCW_RC | _MCW_PC | _MCW_DN)
+#endif
+
+int CDECL _controlfp_s(unsigned int* cur, unsigned int newval, unsigned int mask)
+{
+ unsigned int val;
+
+ if (!MSVCRT_CHECK_PMT((newval & mask & INVALID_MASK) == 0))
+ {
+ if (cur) *cur = _controlfp(0, 0); /* retrieve it anyway */
+ return EINVAL;
+ }
+ val = _controlfp(newval, mask);
+ if (cur) *cur = val;
+ return 0;
+}
diff --git a/sdk/lib/crt/float/arm/_controlfp.c b/sdk/lib/crt/float/arm/_controlfp.c
index 2c697841ea2..1bce54126d9 100644
--- a/sdk/lib/crt/float/arm/_controlfp.c
+++ b/sdk/lib/crt/float/arm/_controlfp.c
@@ -68,16 +68,3 @@ unsigned int CDECL _control87(unsigned int newval, unsigned int mask)
return flags;
}
-int CDECL _controlfp_s(unsigned int *cur, unsigned int newval, unsigned int mask)
-{
- unsigned int val;
-
- if (!MSVCRT_CHECK_PMT( !(newval & mask & ~(_MCW_EM | _MCW_RC | _MCW_DN)) ))
- {
- if (cur) *cur = _controlfp(0, 0); /* retrieve it anyway */
- return EINVAL;
- }
- val = _controlfp(newval, mask);
- if (cur) *cur = val;
- return 0;
-}
diff --git a/sdk/lib/crt/float/float.cmake b/sdk/lib/crt/float/float.cmake
index d3ca0e6a9c6..86568dcb7d1 100644
--- a/sdk/lib/crt/float/float.cmake
+++ b/sdk/lib/crt/float/float.cmake
@@ -6,6 +6,7 @@ list(APPEND LIBCNTPR_FLOAT_SOURCE
list(APPEND CRT_FLOAT_SOURCE
${LIBCNTPR_FLOAT_SOURCE}
float/chgsign.c
+ float/_controlfp_s.c
float/copysign.c
float/fpclass.c
float/fpecode.c
diff --git a/sdk/lib/crt/float/i386/cntrlfp.c b/sdk/lib/crt/float/i386/cntrlfp.c
index b78cbc7cd26..09fe41449e6 100644
--- a/sdk/lib/crt/float/i386/cntrlfp.c
+++ b/sdk/lib/crt/float/i386/cntrlfp.c
@@ -113,25 +113,3 @@ unsigned int CDECL _control87(unsigned int newval, unsigned int
mask)
return flags;
}
-
-/*********************************************************************
- * _controlfp_s (MSVCRT.@)
- */
-int CDECL _controlfp_s(unsigned int *cur, unsigned int newval, unsigned int mask)
-{
-#ifdef __i386__
- unsigned int val;
-
- if (!MSVCRT_CHECK_PMT( !(newval & mask & ~(_MCW_EM | _MCW_IC | _MCW_RC |
_MCW_PC | _MCW_DN))))
- {
- if (cur) *cur = _controlfp( 0, 0 ); /* retrieve it anyway */
- return EINVAL;
- }
- val = _controlfp( newval, mask );
- if (cur) *cur = val;
- return 0;
-#else
- FIXME(":Not Implemented!\n");
- return 0;
-#endif
-}