Piotr Caban : msvcr120: Add fegetenv implementation.
Alexandre Julliard
julliard at winehq.org
Tue Jul 5 11:07:49 CDT 2016
Module: wine
Branch: master
Commit: 1150c0454d1b93fd30bdee552ea8e82d35eda51a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1150c0454d1b93fd30bdee552ea8e82d35eda51a
Author: Piotr Caban <piotr at codeweavers.com>
Date: Mon Jul 4 11:04:23 2016 +0200
msvcr120: Add fegetenv implementation.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
.../api-ms-win-crt-runtime-l1-1-0.spec | 2 +-
dlls/msvcr120/msvcr120.spec | 2 +-
dlls/msvcr120/tests/msvcr120.c | 25 ++++++++++++++++++++++
dlls/msvcr120_app/msvcr120_app.spec | 2 +-
dlls/msvcrt/math.c | 11 ++++++++++
dlls/msvcrt/msvcrt.h | 6 ++++++
dlls/ucrtbase/ucrtbase.spec | 2 +-
7 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/dlls/api-ms-win-crt-runtime-l1-1-0/api-ms-win-crt-runtime-l1-1-0.spec b/dlls/api-ms-win-crt-runtime-l1-1-0/api-ms-win-crt-runtime-l1-1-0.spec
index 8d96f98..17b9861 100644
--- a/dlls/api-ms-win-crt-runtime-l1-1-0/api-ms-win-crt-runtime-l1-1-0.spec
+++ b/dlls/api-ms-win-crt-runtime-l1-1-0/api-ms-win-crt-runtime-l1-1-0.spec
@@ -88,7 +88,7 @@
@ cdecl abort() ucrtbase.abort
@ cdecl exit(long) ucrtbase.exit
@ stub feclearexcept
-@ stub fegetenv
+@ cdecl fegetenv(ptr) ucrtbase.fegetenv
@ stub fegetexceptflag
@ stub fegetround
@ stub feholdexcept
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec
index 86f466b..a2e7832 100644
--- a/dlls/msvcr120/msvcr120.spec
+++ b/dlls/msvcr120/msvcr120.spec
@@ -2144,7 +2144,7 @@
@ stub fdimf
@ stub fdiml
@ stub feclearexcept
-@ stub fegetenv
+@ cdecl fegetenv(ptr) MSVCRT_fegetenv
@ stub fegetexceptflag
@ stub fegetround
@ stub feholdexcept
diff --git a/dlls/msvcr120/tests/msvcr120.c b/dlls/msvcr120/tests/msvcr120.c
index 6ee659f..25330f1 100644
--- a/dlls/msvcr120/tests/msvcr120.c
+++ b/dlls/msvcr120/tests/msvcr120.c
@@ -147,6 +147,12 @@ struct MSVCRT_lconv
wchar_t* _W_negative_sign;
};
+typedef struct
+{
+ unsigned int control;
+ unsigned int status;
+} fenv_t;
+
static char* (CDECL *p_setlocale)(int category, const char* locale);
static struct MSVCRT_lconv* (CDECL *p_localeconv)(void);
static size_t (CDECL *p_wcstombs_s)(size_t *ret, char* dest, size_t sz, const wchar_t* src, size_t max);
@@ -162,6 +168,8 @@ static int (CDECL *p__finite)(double);
static float (CDECL *p_wcstof)(const wchar_t*, wchar_t**);
static double (CDECL *p_remainder)(double, double);
static int* (CDECL *p_errno)(void);
+static int (CDECL *p_fegetenv)(fenv_t*);
+static int (CDECL *p__clearfp)(void);
/* make sure we use the correct errno */
#undef errno
@@ -207,6 +215,8 @@ static BOOL init(void)
p_wcstof = (void*)GetProcAddress(module, "wcstof");
p_remainder = (void*)GetProcAddress(module, "remainder");
p_errno = (void*)GetProcAddress(module, "_errno");
+ SET(p_fegetenv, "fegetenv");
+ SET(p__clearfp, "_clearfp");
if(sizeof(void*) == 8) { /* 64-bit initialization */
SET(p_critical_section_ctor,
"??0critical_section at Concurrency@@QEAA at XZ");
@@ -686,6 +696,20 @@ static void test_critical_section(void)
call_func1(p_critical_section_dtor, &cs);
}
+static void test_fegetenv(void)
+{
+ int ret;
+ fenv_t env;
+
+ p__clearfp();
+
+ ret = p_fegetenv(&env);
+ ok(!ret, "fegetenv returned %x\n", ret);
+ ok(env.control == (_EM_INEXACT|_EM_UNDERFLOW|_EM_OVERFLOW|_EM_ZERODIVIDE|_EM_INVALID),
+ "env.control = %x\n", env.control);
+ ok(!env.status, "env.status = %x\n", env.status);
+}
+
START_TEST(msvcr120)
{
if (!init()) return;
@@ -699,4 +723,5 @@ START_TEST(msvcr120)
test__strtof();
test_remainder();
test_critical_section();
+ test_fegetenv();
}
diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec
index e498fc7..94c0e08 100644
--- a/dlls/msvcr120_app/msvcr120_app.spec
+++ b/dlls/msvcr120_app/msvcr120_app.spec
@@ -1810,7 +1810,7 @@
@ stub fdimf
@ stub fdiml
@ stub feclearexcept
-@ stub fegetenv
+@ cdecl fegetenv(ptr) msvcr120.fegetenv
@ stub fegetexceptflag
@ stub fegetround
@ stub feholdexcept
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index 3d2104b..e9d594c 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -1199,6 +1199,17 @@ int CDECL _controlfp_s(unsigned int *cur, unsigned int newval, unsigned int mask
}
/*********************************************************************
+ * fegetenv (MSVCR120.@)
+ */
+int CDECL MSVCRT_fegetenv(fenv_t *env)
+{
+ env->control = _controlfp(0, 0) & (MSVCRT__EM_INEXACT | MSVCRT__EM_UNDERFLOW |
+ MSVCRT__EM_OVERFLOW | MSVCRT__EM_ZERODIVIDE | MSVCRT__EM_INVALID);
+ env->status = _statusfp();
+ return 0;
+}
+
+/*********************************************************************
* __fpe_flt_rounds (UCRTBASE.@)
*/
int CDECL __fpe_flt_rounds(void)
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index 6c2ab42..958ca4e 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -910,6 +910,12 @@ struct MSVCRT__stat64 {
#define MSVCRT__DN_SAVE_OPERANDS_FLUSH_RESULTS 0x03000000
#define MSVCRT__EM_AMBIGUOUS 0x80000000
+typedef struct
+{
+ unsigned int control;
+ unsigned int status;
+} fenv_t;
+
#define MSVCRT_CLOCKS_PER_SEC 1000
/* signals */
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index c03a434..0d6b397 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -2286,7 +2286,7 @@
@ stub fdimf
@ stub fdiml
@ stub feclearexcept
-@ stub fegetenv
+@ cdecl fegetenv(ptr) MSVCRT_fegetenv
@ stub fegetexceptflag
@ stub fegetround
@ stub feholdexcept
More information about the wine-cvs
mailing list