Skip to content

Commit 9f66624

Browse files
committed
fixed <fenv.h> function-macros and added <cfenv>
1 parent 74d1f12 commit 9f66624

File tree

4 files changed

+85
-43
lines changed

4 files changed

+85
-43
lines changed

src/libc/fenv.c

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,24 @@
33
const fenv_t __fe_dfl_env = FE_TONEAREST;
44
fenv_t __fe_cur_env = __fe_dfl_env;
55

6-
#define _
7-
#define DEF(name, params, args) int name _ params { return name args; }
8-
9-
DEF(feclearexcept, (int excepts), (excepts))
10-
DEF(fegetexceptflag, (fexcept_t *flagp, int excepts), (flagp, excepts))
11-
DEF(feraiseexcept, (int excepts), (excepts))
12-
DEF(fesetexceptflag, (const fexcept_t *flagp, int excepts), (flagp, excepts))
13-
DEF(fetestexcept, (int excepts), (excepts))
14-
15-
DEF(fegetround, (void), ())
16-
DEF(fesetround, (int rounding_mode), (rounding_mode))
17-
18-
DEF(fegetenv, (fenv_t *envp), (envp))
19-
DEF(feholdexcept, (fenv_t *envp), (envp))
20-
DEF(fesetenv, (const fenv_t *envp), (envp))
21-
DEF(feupdateenv, (const fenv_t *envp), (envp))
6+
extern inline int feclearexcept(int __excepts);
7+
8+
extern inline int fegetexceptflag(fexcept_t *__flagp, int __excepts);
9+
10+
extern inline int feraiseexcept(int __excepts);
11+
12+
extern inline int fesetexceptflag(const fexcept_t *__flagp, int __excepts);
13+
14+
extern inline int fetestexcept(int __excepts);
15+
16+
extern inline int fegetround(void);
17+
18+
extern inline int fesetround(int __rounding_mode);
19+
20+
extern inline int fegetenv(fenv_t *__envp);
21+
22+
extern inline int feholdexcept(fenv_t *__envp);
23+
24+
extern inline int fesetenv(const fenv_t *__envp);
25+
26+
extern inline int feupdateenv(const fenv_t *__envp);

src/libc/include/fenv.h

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ extern __fenv_t __fe_cur_env;
1111
#ifndef _FENV_H
1212
#define _FENV_H
1313

14-
#ifdef __cplusplus
15-
extern "C" {
16-
#endif
17-
1814
enum {
1915
FE_DIVBYZERO = 1 << 6,
2016
#define FE_DIVBYZERO FE_DIVBYZERO
@@ -45,39 +41,53 @@ typedef unsigned char fexcept_t;
4541
extern const fenv_t __fe_dfl_env;
4642
#define FE_DFL_ENV (&__fe_dfl_env)
4743

48-
int feclearexcept(int);
49-
#define feclearexcept(excepts) (__fe_cur_env &= ~((excepts) & FE_ALL_EXCEPT), 0)
44+
#ifdef __cplusplus
45+
extern "C" {
46+
#endif
5047

51-
int fegetexceptflag(fexcept_t *, int);
52-
#define fegetexceptflag(flagp, excepts) (*(flagp) = __fe_cur_env & (excepts) & FE_ALL_EXCEPT, 0)
48+
inline int feclearexcept(int __excepts) {
49+
return (__fe_cur_env &= ~((__excepts) & FE_ALL_EXCEPT), 0);
50+
}
5351

54-
int feraiseexcept(int);
55-
#define feraiseexcept(excepts) (__fe_cur_env |= (excepts) & FE_ALL_EXCEPT, 0)
52+
inline int fegetexceptflag(fexcept_t *__flagp, int __excepts) {
53+
return (*(__flagp) = __fe_cur_env & (__excepts) & FE_ALL_EXCEPT, 0);
54+
}
5655

57-
int fesetexceptflag(const fexcept_t *, int);
58-
#define fesetexceptflag(flagp, excepts) (__fe_cur_env = (__fe_cur_env & ~((excepts) & FE_ALL_EXCEPT)) \
59-
| (*(flagp) & (excepts) & FE_ALL_EXCEPT), 0)
56+
inline int feraiseexcept(int __excepts) {
57+
return (__fe_cur_env |= (__excepts) & FE_ALL_EXCEPT, 0);
58+
}
6059

61-
int fetestexcept(int);
62-
#define fetestexcept(excepts) (__fe_cur_env & (excepts) & FE_ALL_EXCEPT)
60+
inline int fesetexceptflag(const fexcept_t *__flagp, int __excepts) {
61+
return (__fe_cur_env = (__fe_cur_env & ~((__excepts) & FE_ALL_EXCEPT)) | (*(__flagp) & (__excepts) & FE_ALL_EXCEPT), 0);
62+
}
6363

64-
int fegetround(void);
65-
#define fegetround() (__fe_cur_env & 3)
64+
inline int fetestexcept(int __excepts) {
65+
return (__fe_cur_env & (__excepts) & FE_ALL_EXCEPT);
66+
}
6667

67-
int fesetround(int);
68-
#define fesetround(rounding_mode) (__fe_cur_env = (__fe_cur_env & ~3) | ((rounding_mode) & 3), 0)
68+
inline int fegetround(void) {
69+
return (__fe_cur_env & 3);
70+
}
6971

70-
int fegetenv(fenv_t *);
71-
#define fegetenv(envp) (*(envp) = __fe_cur_env, 0)
72+
inline int fesetround(int __rounding_mode) {
73+
return (__fe_cur_env = (__fe_cur_env & ~3) | ((__rounding_mode) & 3), 0);
74+
}
7275

73-
int feholdexcept(fenv_t *);
74-
#define feholdexcept(envp) (*(envp) = __fe_cur_env, __fe_cur_env &= ~FE_ALL_EXCEPT, 0)
76+
inline int fegetenv(fenv_t *__envp) {
77+
return (*(__envp) = __fe_cur_env, 0);
78+
}
7579

76-
int fesetenv(const fenv_t *);
77-
#define fesetenv(envp) (__fe_cur_env = *(envp), 0)
80+
inline int feholdexcept(fenv_t *__envp) {
81+
return (*(__envp) = __fe_cur_env, __fe_cur_env &= ~FE_ALL_EXCEPT, 0);
82+
}
83+
84+
inline int fesetenv(const fenv_t *__envp) {
85+
return (__fe_cur_env = *(__envp), 0);
86+
}
7887

79-
int feupdateenv(const fenv_t *);
80-
#define feupdateenv(envp) (__fe_cur_env = (__fe_cur_env & FE_ALL_EXCEPT) | *(envp), 0)
88+
inline int feupdateenv(const fenv_t *__envp) {
89+
return (__fe_cur_env = (__fe_cur_env & FE_ALL_EXCEPT) | *(__envp), 0);
90+
}
8191

8292
#ifdef __cplusplus
8393
}

src/libcxx/header_test.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <cassert>
55
#include <cctype>
66
#include <cerrno>
7+
#include <cfenv>
78
#include <cfloat>
89
#include <cinttypes>
910
#include <ciso646>

src/libcxx/include/cfenv

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// -*- C++ -*-
2+
#ifndef _EZCXX_CFENV
3+
#define _EZCXX_CFENV
4+
5+
#include <fenv.h>
6+
7+
#pragma clang system_header
8+
9+
namespace std {
10+
using ::fenv_t;
11+
using ::fexcept_t;
12+
13+
using ::feclearexcept;
14+
using ::fegetexceptflag;
15+
using ::feraiseexcept;
16+
using ::fesetexceptflag;
17+
using ::fetestexcept;
18+
using ::fegetround;
19+
using ::fesetround;
20+
using ::fegetenv;
21+
using ::feholdexcept;
22+
using ::fesetenv;
23+
using ::feupdateenv;
24+
} // namespace std
25+
26+
#endif // _EZCXX_CFENV

0 commit comments

Comments
 (0)