diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index e0e466145ff..9c765b3d2a3 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1104,7 +1104,7 @@ @ varargs _cwscanf_s(wstr) @ varargs _cwscanf_s_l(wstr ptr) @ extern _daylight MSVCRT___daylight -@ stub _dclass +@ cdecl _dclass(double) MSVCR120__dclass @ cdecl _difftime32(long long) MSVCRT__difftime32 @ cdecl _difftime64(long long) MSVCRT__difftime64 @ stub _dosmaperr @@ -1140,7 +1140,7 @@ @ cdecl _fcloseall() MSVCRT__fcloseall @ cdecl _fcvt(double long ptr ptr) MSVCRT__fcvt @ cdecl _fcvt_s(ptr long double long ptr ptr) MSVCRT__fcvt_s -@ stub _fdclass +@ cdecl _fdclass(float) MSVCR120__fdclass @ cdecl _fdopen(long str) MSVCRT__fdopen @ stub _fdpcomp @ stub _fdsign @@ -1389,7 +1389,7 @@ @ cdecl _j1(double) MSVCRT__j1 @ cdecl _jn(long double) MSVCRT__jn @ cdecl _kbhit() -@ stub _ldclass +@ cdecl _ldclass(double) MSVCR120__ldclass @ stub _ldpcomp @ stub _ldsign @ stub _ldtest diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index 16a9c4eb2dd..9b75d361f47 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -2526,3 +2526,44 @@ LDOUBLE CDECL MSVCR120_truncl(LDOUBLE x) { return MSVCR120_trunc(x); } + +/********************************************************************* + * _dclass (MSVCR120.@) + */ +short CDECL MSVCR120__dclass(double x) +{ + switch (MSVCRT__fpclass(x)) { + case MSVCRT__FPCLASS_QNAN: + case MSVCRT__FPCLASS_SNAN: + return MSVCRT_FP_NAN; + case MSVCRT__FPCLASS_NINF: + case MSVCRT__FPCLASS_PINF: + return MSVCRT_FP_INFINITE; + case MSVCRT__FPCLASS_ND: + case MSVCRT__FPCLASS_PD: + return MSVCRT_FP_SUBNORMAL; + case MSVCRT__FPCLASS_NN: + case MSVCRT__FPCLASS_PN: + default: + return MSVCRT_FP_NORMAL; + case MSVCRT__FPCLASS_NZ: + case MSVCRT__FPCLASS_PZ: + return MSVCRT_FP_ZERO; + } +} + +/********************************************************************* + * _fdclass (MSVCR120.@) + */ +short CDECL MSVCR120__fdclass(float x) +{ + return MSVCR120__dclass(x); +} + +/********************************************************************* + * _ldclass (MSVCR120.@) + */ +short CDECL MSVCR120__ldclass(LDOUBLE x) +{ + return MSVCR120__dclass(x); +} diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index f3970877914..41f31b90a62 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -824,6 +824,13 @@ struct MSVCRT__stat64 { #define MSVCRT__FPCLASS_PN 0x0100 /* Positive Normal */ #define MSVCRT__FPCLASS_PINF 0x0200 /* Positive Infinity */ +/* fpclassify constants */ +#define MSVCRT_FP_INFINITE 1 +#define MSVCRT_FP_NAN 2 +#define MSVCRT_FP_NORMAL -1 +#define MSVCRT_FP_SUBNORMAL -2 +#define MSVCRT_FP_ZERO 0 + #define MSVCRT__MCW_EM 0x0008001f #define MSVCRT__MCW_IC 0x00040000 #define MSVCRT__MCW_RC 0x00000300