From 78412005e121472490160e5a6b32322ed1275a32 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Sat, 14 Jan 2006 17:36:23 +0100 Subject: [PATCH] msvcrt: Set errno in the standard math functions too, not only in the _CI* variants. --- dlls/msvcrt/math.c | 202 +++++++++++++++++++++++++++++++++++++++--------- dlls/msvcrt/msvcrt.spec | 32 ++++---- 2 files changed, 181 insertions(+), 53 deletions(-) diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index e9373487e8c..f5277b0717c 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -51,6 +51,155 @@ typedef int (*MSVCRT_matherr_func)(struct MSVCRT__exception *); static MSVCRT_matherr_func MSVCRT_default_matherr_func = NULL; +/********************************************************************* + * MSVCRT_acos (MSVCRT.@) + */ +double MSVCRT_acos( double x ) +{ + if (x < -1.0 || x > 1.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; + return acos(x); +} + +/********************************************************************* + * MSVCRT_asin (MSVCRT.@) + */ +double MSVCRT_asin( double x ) +{ + if (x < -1.0 || x > 1.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; + return asin(x); +} + +/********************************************************************* + * MSVCRT_atan (MSVCRT.@) + */ +double MSVCRT_atan( double x ) +{ + if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; + return atan(x); +} + +/********************************************************************* + * MSVCRT_atan2 (MSVCRT.@) + */ +double MSVCRT_atan2( double x, double y ) +{ + if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; + return atan2(x,y); +} + +/********************************************************************* + * MSVCRT_cos (MSVCRT.@) + */ +double MSVCRT_cos( double x ) +{ + if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; + return cos(x); +} + +/********************************************************************* + * MSVCRT_cosh (MSVCRT.@) + */ +double MSVCRT_cosh( double x ) +{ + if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; + return cosh(x); +} + +/********************************************************************* + * MSVCRT_exp (MSVCRT.@) + */ +double MSVCRT_exp( double x ) +{ + if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; + return exp(x); +} + +/********************************************************************* + * MSVCRT_fmod (MSVCRT.@) + */ +double MSVCRT_fmod( double x, double y ) +{ + if (!finite(x) || !finite(y)) *MSVCRT__errno() = MSVCRT_EDOM; + return fmod(x,y); +} + +/********************************************************************* + * MSVCRT_log (MSVCRT.@) + */ +double MSVCRT_log( double x) +{ + if (x < 0.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; + if (x == 0.0) *MSVCRT__errno() = MSVCRT_ERANGE; + return log(x); +} + +/********************************************************************* + * MSVCRT_log10 (MSVCRT.@) + */ +double MSVCRT_log10( double x ) +{ + if (x < 0.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; + if (x == 0.0) *MSVCRT__errno() = MSVCRT_ERANGE; + return log10(x); +} + +/********************************************************************* + * MSVCRT_pow (MSVCRT.@) + */ +double MSVCRT_pow( double x, double y ) +{ + /* FIXME: If x < 0 and y is not integral, set EDOM */ + double z = pow(x,y); + if (!finite(z)) *MSVCRT__errno() = MSVCRT_EDOM; + return z; +} + +/********************************************************************* + * MSVCRT_sin (MSVCRT.@) + */ +double MSVCRT_sin( double x ) +{ + if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; + return sin(x); +} + +/********************************************************************* + * MSVCRT_sinh (MSVCRT.@) + */ +double MSVCRT_sinh( double x ) +{ + if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; + return sinh(x); +} + +/********************************************************************* + * MSVCRT_sqrt (MSVCRT.@) + */ +double MSVCRT_sqrt( double x ) +{ + if (x < 0.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; + return sqrt(x); +} + +/********************************************************************* + * MSVCRT_tan (MSVCRT.@) + */ +double MSVCRT_tan( double x ) +{ + if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; + return tan(x); +} + +/********************************************************************* + * MSVCRT_tanh (MSVCRT.@) + */ +double MSVCRT_tanh( double x ) +{ + if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; + return tanh(x); +} + + #if defined(__GNUC__) && defined(__i386__) #define FPU_DOUBLE(var) double var; \ @@ -65,8 +214,7 @@ static MSVCRT_matherr_func MSVCRT_default_matherr_func = NULL; double _CIacos(void) { FPU_DOUBLE(x); - if (x < -1.0 || x > 1.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; - return acos(x); + return MSVCRT_acos(x); } /********************************************************************* @@ -75,8 +223,7 @@ double _CIacos(void) double _CIasin(void) { FPU_DOUBLE(x); - if (x < -1.0 || x > 1.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; - return asin(x); + return MSVCRT_asin(x); } /********************************************************************* @@ -85,8 +232,7 @@ double _CIasin(void) double _CIatan(void) { FPU_DOUBLE(x); - if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; - return atan(x); + return MSVCRT_atan(x); } /********************************************************************* @@ -95,8 +241,7 @@ double _CIatan(void) double _CIatan2(void) { FPU_DOUBLES(x,y); - if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; - return atan2(x,y); + return MSVCRT_atan2(x,y); } /********************************************************************* @@ -105,8 +250,7 @@ double _CIatan2(void) double _CIcos(void) { FPU_DOUBLE(x); - if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; - return cos(x); + return MSVCRT_cos(x); } /********************************************************************* @@ -115,8 +259,7 @@ double _CIcos(void) double _CIcosh(void) { FPU_DOUBLE(x); - if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; - return cosh(x); + return MSVCRT_cosh(x); } /********************************************************************* @@ -125,8 +268,7 @@ double _CIcosh(void) double _CIexp(void) { FPU_DOUBLE(x); - if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; - return exp(x); + return MSVCRT_exp(x); } /********************************************************************* @@ -135,8 +277,7 @@ double _CIexp(void) double _CIfmod(void) { FPU_DOUBLES(x,y); - if (!finite(x) || !finite(y)) *MSVCRT__errno() = MSVCRT_EDOM; - return fmod(x,y); + return MSVCRT_fmod(x,y); } /********************************************************************* @@ -145,9 +286,7 @@ double _CIfmod(void) double _CIlog(void) { FPU_DOUBLE(x); - if (x < 0.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; - if (x == 0.0) *MSVCRT__errno() = MSVCRT_ERANGE; - return log(x); + return MSVCRT_log(x); } /********************************************************************* @@ -156,9 +295,7 @@ double _CIlog(void) double _CIlog10(void) { FPU_DOUBLE(x); - if (x < 0.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; - if (x == 0.0) *MSVCRT__errno() = MSVCRT_ERANGE; - return log10(x); + return MSVCRT_log10(x); } /********************************************************************* @@ -166,12 +303,8 @@ double _CIlog10(void) */ double _CIpow(void) { - double z; FPU_DOUBLES(x,y); - /* FIXME: If x < 0 and y is not integral, set EDOM */ - z = pow(x,y); - if (!finite(z)) *MSVCRT__errno() = MSVCRT_EDOM; - return z; + return MSVCRT_pow(x,y); } /********************************************************************* @@ -180,8 +313,7 @@ double _CIpow(void) double _CIsin(void) { FPU_DOUBLE(x); - if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; - return sin(x); + return MSVCRT_sin(x); } /********************************************************************* @@ -190,8 +322,7 @@ double _CIsin(void) double _CIsinh(void) { FPU_DOUBLE(x); - if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; - return sinh(x); + return MSVCRT_sinh(x); } /********************************************************************* @@ -200,8 +331,7 @@ double _CIsinh(void) double _CIsqrt(void) { FPU_DOUBLE(x); - if (x < 0.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; - return sqrt(x); + return MSVCRT_sqrt(x); } /********************************************************************* @@ -210,8 +340,7 @@ double _CIsqrt(void) double _CItan(void) { FPU_DOUBLE(x); - if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; - return tan(x); + return MSVCRT_tan(x); } /********************************************************************* @@ -220,8 +349,7 @@ double _CItan(void) double _CItanh(void) { FPU_DOUBLE(x); - if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; - return tanh(x); + return MSVCRT_tanh(x); } #else /* defined(__GNUC__) && defined(__i386__) */ diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index e9e4298502c..9a6da3ac317 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -569,11 +569,11 @@ @ cdecl _yn(long double ) @ cdecl abort() MSVCRT_abort @ cdecl abs(long) -@ cdecl acos(double) +@ cdecl acos(double) MSVCRT_acos @ cdecl asctime(ptr) MSVCRT_asctime -@ cdecl asin(double) -@ cdecl atan(double) -@ cdecl atan2(double double) +@ cdecl asin(double) MSVCRT_asin +@ cdecl atan(double) MSVCRT_atan +@ cdecl atan2(double double) MSVCRT_atan2 @ cdecl atexit(ptr) MSVCRT_atexit @ cdecl atof(str) @ cdecl atoi(str) @@ -583,13 +583,13 @@ @ cdecl ceil(double) @ cdecl clearerr(ptr) MSVCRT_clearerr @ cdecl clock() MSVCRT_clock -@ cdecl cos(double) -@ cdecl cosh(double) +@ cdecl cos(double) MSVCRT_cos +@ cdecl cosh(double) MSVCRT_cosh @ cdecl ctime(ptr) MSVCRT_ctime @ cdecl difftime(long long) MSVCRT_difftime @ cdecl div(long long) MSVCRT_div @ cdecl exit(long) MSVCRT_exit -@ cdecl exp(double) +@ cdecl exp(double) MSVCRT_exp @ cdecl fabs(double) @ cdecl fclose(ptr) MSVCRT_fclose @ cdecl feof(ptr) MSVCRT_feof @@ -601,7 +601,7 @@ @ cdecl fgetwc(ptr) MSVCRT_fgetwc @ cdecl fgetws(ptr long ptr) MSVCRT_fgetws @ cdecl floor(double) -@ cdecl fmod(double double) +@ cdecl fmod(double double) MSVCRT_fmod @ cdecl fopen(str str) MSVCRT_fopen @ varargs fprintf(ptr str) MSVCRT_fprintf @ cdecl fputc(long ptr) MSVCRT_fputc @@ -657,8 +657,8 @@ @ cdecl ldiv(long long) MSVCRT_ldiv @ cdecl localeconv() MSVCRT_localeconv @ cdecl localtime(ptr) MSVCRT_localtime -@ cdecl log(double) -@ cdecl log10(double) +@ cdecl log(double) MSVCRT_log +@ cdecl log10(double) MSVCRT_log10 @ cdecl -i386 longjmp(ptr long) MSVCRT_longjmp @ cdecl malloc(long) MSVCRT_malloc @ cdecl mblen(ptr long) MSVCRT_mblen @@ -672,7 +672,7 @@ @ cdecl mktime(ptr) MSVCRT_mktime @ cdecl modf(double ptr) @ cdecl perror(str) MSVCRT_perror -@ cdecl pow(double double) +@ cdecl pow(double double) MSVCRT_pow @ varargs printf(str) MSVCRT_printf @ cdecl putc(long ptr) MSVCRT_putc @ cdecl putchar(long) MSVCRT_putchar @@ -691,10 +691,10 @@ @ cdecl setlocale(long str) MSVCRT_setlocale @ cdecl setvbuf(ptr str long long) MSVCRT_setvbuf @ cdecl signal(long long) MSVCRT_signal -@ cdecl sin(double) -@ cdecl sinh(double) +@ cdecl sin(double) MSVCRT_sin +@ cdecl sinh(double) MSVCRT_sinh @ varargs sprintf(ptr str) MSVCRT_sprintf -@ cdecl sqrt(double) +@ cdecl sqrt(double) MSVCRT_sqrt @ cdecl srand(long) MSVCRT_srand @ varargs sscanf(str str) MSVCRT_sscanf @ cdecl strcat(str str) @@ -721,8 +721,8 @@ @ varargs swprintf(wstr wstr) MSVCRT_swprintf @ varargs swscanf(wstr wstr) MSVCRT_swscanf @ cdecl system(str) MSVCRT_system -@ cdecl tan(double) -@ cdecl tanh(double) +@ cdecl tan(double) MSVCRT_tan +@ cdecl tanh(double) MSVCRT_tanh @ cdecl time(ptr) MSVCRT_time @ cdecl tmpfile() MSVCRT_tmpfile @ cdecl tmpnam(ptr) MSVCRT_tmpnam -- 2.11.4.GIT