Reactos
at master 90 lines 1.8 kB view raw
1// 2// matherr.cpp 3// 4// Copyright (c) 2024 Timo Kreuzer 5// 6// User math error support. 7// 8// SPDX-License-Identifier: MIT 9// 10 11#include <math.h> 12#include <corecrt_startup.h> 13#include <corecrt_internal.h> 14 15static __crt_state_management::dual_state_global<_UserMathErrorFunctionPointer> __acrt_global_user_matherr; 16 17// 18// Declared in corecrt_internal.h 19// Called from initialize_pointers() 20// 21extern "C" 22void __cdecl __acrt_initialize_user_matherr(void* encoded_null) 23{ 24 __acrt_global_user_matherr.initialize( 25 reinterpret_cast<_UserMathErrorFunctionPointer>(encoded_null)); 26} 27 28// 29// Declared in corecrt_internal.h 30// 31extern "C" 32bool __cdecl __acrt_has_user_matherr(void) 33{ 34 _UserMathErrorFunctionPointer user_matherr = 35 __crt_fast_decode_pointer(__acrt_global_user_matherr.value()); 36 return user_matherr != nullptr; 37} 38 39// 40// Declared in corecrt_internal.h 41// 42extern "C" 43int __cdecl __acrt_invoke_user_matherr(struct _exception* _Exp) 44{ 45 _UserMathErrorFunctionPointer user_matherr = 46 __crt_fast_decode_pointer(__acrt_global_user_matherr.value()); 47 if (user_matherr != nullptr) 48 { 49 return user_matherr(_Exp); 50 } 51 52 return 0; 53} 54 55// 56// Declared in corecrt_startup.h 57// 58extern "C" 59void 60__cdecl 61__setusermatherr( 62 _UserMathErrorFunctionPointer _UserMathErrorFunction) 63{ 64 _UserMathErrorFunctionPointer encodedPtr = 65 __crt_fast_encode_pointer(_UserMathErrorFunction); 66 67 __acrt_global_user_matherr.value() = encodedPtr; 68} 69 70// 71// Used by libm 72// 73extern "C" 74int 75__cdecl 76_invoke_matherr( 77 int type, 78 char* name, 79 double arg1, 80 double arg2, 81 double retval) 82{ 83 struct _exception excpt; 84 excpt.type = type; 85 excpt.name = name; 86 excpt.arg1 = arg1; 87 excpt.arg2 = arg2; 88 excpt.retval = retval; 89 return __acrt_invoke_user_matherr(&excpt); 90}