xref: /reactos/sdk/lib/crt/float/_controlfp_s.c (revision 9cfd8dd9)
1 /*
2  * PROJECT:     ReactOS CRT library
3  * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE:     Implementation of _controlfp_s (adapted from wine msvcrt/math.c)
5  * COPYRIGHT:   Copyright 2000 Jon Griffiths
6  *              Copyright 2010 Piotr Caban
7  *              Copyright 2021 Roman Masanin <36927roma@gmail.com>
8  */
9 
10 #include <precomp.h>
11 #include <float.h>
12 
13 #ifdef _M_ARM
14 #define INVALID_MASK ~(_MCW_EM | _MCW_RC | _MCW_DN)
15 #else
16 #define INVALID_MASK ~(_MCW_EM | _MCW_IC | _MCW_RC | _MCW_PC | _MCW_DN)
17 #endif
18 
19 int CDECL _controlfp_s(unsigned int* cur, unsigned int newval, unsigned int mask)
20 {
21     unsigned int val;
22 
23     if (!MSVCRT_CHECK_PMT((newval & mask & INVALID_MASK) == 0))
24     {
25         if (cur) *cur = _controlfp(0, 0);  /* retrieve it anyway */
26         return EINVAL;
27     }
28     val = _controlfp(newval, mask);
29     if (cur) *cur = val;
30     return 0;
31 }
32