| #include <float.h> |
| #include <errno.h> |
| #include <windows.h> |
| #include <msvcrt.h> |
| |
| static errno_t __cdecl _stub( |
| unsigned int *currentControl, |
| unsigned int newControl, |
| unsigned int mask |
| ); |
| |
| errno_t __cdecl (*__MINGW_IMP_SYMBOL(_controlfp_s))(unsigned int *, unsigned int, unsigned int) = _stub; |
| |
| errno_t __cdecl _controlfp_s( |
| unsigned int *currentControl, |
| unsigned int newControl, |
| unsigned int mask |
| ){ |
| return __MINGW_IMP_SYMBOL(_controlfp_s)(currentControl,newControl,mask); |
| } |
| |
| static const unsigned int allflags = _MCW_DN | _MCW_EM | _MCW_IC | _MCW_RC | _MCW_PC; |
| static errno_t __cdecl _int_controlfp_s( |
| unsigned int *currentControl, |
| unsigned int newControl, |
| unsigned int mask |
| ){ |
| unsigned int cont; |
| if(!(newControl & mask & ~allflags)){ |
| if (currentControl) *currentControl = _controlfp( 0, 0 ); |
| return EINVAL; |
| } |
| cont = _controlfp( newControl, mask ); |
| if(currentControl) *currentControl = cont; |
| return 0; |
| } |
| |
| static errno_t __cdecl _stub ( |
| unsigned int *currentControl, |
| unsigned int newControl, |
| unsigned int mask |
| ) |
| { |
| errno_t __cdecl (*f)(unsigned int *, unsigned int, unsigned int) = __MINGW_IMP_SYMBOL(_controlfp_s); |
| |
| if (f == _stub) |
| { |
| f = (errno_t __cdecl (*)(unsigned int *, unsigned int, unsigned int)) |
| GetProcAddress (__mingw_get_msvcrt_handle (), "_controlfp_s"); |
| if (!f) |
| f = _int_controlfp_s; |
| __MINGW_IMP_SYMBOL(_controlfp_s) = f; |
| } |
| return (*f)(currentControl, newControl, mask); |
| } |
| |