1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "napi/native_api.h"
17 #include <cfenv>
18 #include <js_native_api_types.h>
19
20 #define PARAM_0 0
21 #define PARAM_1 1
22 #define PARAM_2 2
23 #define PARAM_4 4
24 #define PARAM_8 8
25 #define PARAM_16 16
26 #define MPARAM_1 (-1)
27
FeTestExcept(napi_env env,napi_callback_info info)28 static napi_value FeTestExcept(napi_env env, napi_callback_info info)
29 {
30 size_t argc = PARAM_1;
31 napi_value args[1] = {nullptr};
32 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
33 int firstParam;
34 napi_get_value_int32(env, args[0], &firstParam);
35 int backParam = fetestexcept(firstParam);
36 napi_value result;
37 napi_create_int32(env, backParam, &result);
38 return result;
39 }
40
FeUpdateEnv(napi_env env,napi_callback_info info)41 static napi_value FeUpdateEnv(napi_env env, napi_callback_info info)
42 {
43 int backParam;
44 const fenv_t *envp = nullptr;
45 backParam = feupdateenv(envp);
46 napi_value result = nullptr;
47 napi_create_int32(env, backParam, &result);
48 return result;
49 }
50
FeSetRound(napi_env env,napi_callback_info info)51 static napi_value FeSetRound(napi_env env, napi_callback_info info)
52 {
53 size_t argc = PARAM_1;
54 napi_value args[1] = {nullptr};
55 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
56 int backParam, rounding_mode;
57 napi_get_value_int32(env, args[0], &rounding_mode);
58 backParam = fesetround(rounding_mode);
59 napi_value result = nullptr;
60 napi_create_int32(env, backParam, &result);
61 return result;
62 }
63
FeSetExceptFlag(napi_env env,napi_callback_info info)64 static napi_value FeSetExceptFlag(napi_env env, napi_callback_info info)
65 {
66 size_t argc = PARAM_1;
67 napi_value args[1] = {nullptr};
68 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
69 int backParam, excepts;
70 napi_get_value_int32(env, args[0], &excepts);
71 const fexcept_t flagp = PARAM_0;
72 backParam = fesetexceptflag(&flagp, excepts);
73 napi_value result = nullptr;
74 napi_create_int32(env, backParam, &result);
75 return result;
76 }
77
FeSetEnv(napi_env env,napi_callback_info info)78 static napi_value FeSetEnv(napi_env env, napi_callback_info info)
79 {
80 int backParam;
81 const fenv_t *envp = nullptr;
82 backParam = fesetenv(envp);
83 napi_value result = nullptr;
84 napi_create_int32(env, backParam, &result);
85 return result;
86 }
87
FeRaiseExcept(napi_env env,napi_callback_info info)88 static napi_value FeRaiseExcept(napi_env env, napi_callback_info info)
89 {
90 size_t argc = PARAM_1;
91 napi_value args[1] = {nullptr};
92 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
93 int backParam, excepts;
94 napi_get_value_int32(env, args[0], &excepts);
95 backParam = feraiseexcept(excepts);
96 napi_value result = nullptr;
97 napi_create_int32(env, backParam, &result);
98 return result;
99 }
100
FeHoldExcept(napi_env env,napi_callback_info info)101 static napi_value FeHoldExcept(napi_env env, napi_callback_info info)
102 {
103 int backParam;
104 fenv_t *envp = nullptr;
105 backParam = feholdexcept(envp);
106 napi_value result = nullptr;
107 napi_create_int32(env, backParam, &result);
108 return result;
109 }
110
FeGetRound(napi_env env,napi_callback_info info)111 static napi_value FeGetRound(napi_env env, napi_callback_info info)
112 {
113 int backParam;
114 backParam = fegetround();
115 napi_value result = nullptr;
116 napi_create_int32(env, backParam, &result);
117 return result;
118 }
119
FeGetExceptFlag(napi_env env,napi_callback_info info)120 static napi_value FeGetExceptFlag(napi_env env, napi_callback_info info)
121 {
122 size_t argc = PARAM_1;
123 napi_value args[1] = {nullptr};
124 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
125 int backParam, excepts;
126 napi_get_value_int32(env, args[0], &excepts);
127 fexcept_t *flagp = nullptr;
128 backParam = fegetexceptflag(flagp, excepts);
129 napi_value result = nullptr;
130 napi_create_int32(env, backParam, &result);
131 return result;
132 }
133
FeGetEnv(napi_env env,napi_callback_info info)134 static napi_value FeGetEnv(napi_env env, napi_callback_info info)
135 {
136 int backParam;
137 fenv_t *fenv = nullptr;
138 backParam = fegetenv(fenv);
139 napi_value result = nullptr;
140 napi_create_int32(env, backParam, &result);
141 return result;
142 }
143
FeClearExcept(napi_env env,napi_callback_info info)144 static napi_value FeClearExcept(napi_env env, napi_callback_info info)
145 {
146 size_t argc = PARAM_1;
147 napi_value args[1] = {nullptr};
148 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
149 int backParam, list;
150 napi_get_value_int32(env, args[0], &list);
151 switch (list) {
152 case PARAM_0:
153 backParam = feclearexcept(list);
154 break;
155 case PARAM_1:
156 backParam = feclearexcept(list);
157 break;
158 case PARAM_2:
159 backParam = feclearexcept(list);
160 break;
161 case PARAM_4:
162 backParam = feclearexcept(list);
163 break;
164 case PARAM_8:
165 backParam = feclearexcept(list);
166 break;
167 case PARAM_16:
168 backParam = feclearexcept(list);
169 break;
170 case MPARAM_1:
171 backParam = feclearexcept(list);
172 break;
173 default:
174 backParam = feclearexcept(list);
175 }
176 napi_value result = nullptr;
177 napi_create_int32(env, backParam, &result);
178 return result;
179 }
180
181 EXTERN_C_START
Init(napi_env env,napi_value exports)182 static napi_value Init(napi_env env, napi_value exports)
183 {
184 napi_property_descriptor desc[] = {
185 {"fetestexcept", nullptr, FeTestExcept, nullptr, nullptr, nullptr, napi_default, nullptr},
186 {"feupdateenv", nullptr, FeUpdateEnv, nullptr, nullptr, nullptr, napi_default, nullptr},
187 {"fesetround", nullptr, FeSetRound, nullptr, nullptr, nullptr, napi_default, nullptr},
188 {"fesetexceptflag", nullptr, FeSetExceptFlag, nullptr, nullptr, nullptr, napi_default, nullptr},
189 {"fesetenv", nullptr, FeSetEnv, nullptr, nullptr, nullptr, napi_default, nullptr},
190 {"fegetround", nullptr, FeGetRound, nullptr, nullptr, nullptr, napi_default, nullptr},
191 {"feraiseexcept", nullptr, FeRaiseExcept, nullptr, nullptr, nullptr, napi_default, nullptr},
192 {"fegetexceptflag", nullptr, FeGetExceptFlag, nullptr, nullptr, nullptr, napi_default, nullptr},
193 {"feholdexcept", nullptr, FeHoldExcept, nullptr, nullptr, nullptr, napi_default, nullptr},
194 {"fegetenv", nullptr, FeGetEnv, nullptr, nullptr, nullptr, napi_default, nullptr},
195 {"feclearexcept", nullptr, FeClearExcept, nullptr, nullptr, nullptr, napi_default, nullptr},
196 };
197 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
198 return exports;
199 }
200 EXTERN_C_END
201
202 static napi_module demoModule = {
203 .nm_version = 1,
204 .nm_flags = 0,
205 .nm_filename = nullptr,
206 .nm_register_func = Init,
207 .nm_modname = "libfenvndk",
208 .nm_priv = ((void *)0),
209 .reserved = {0},
210 };
211
RegisterModule(void)212 extern "C" __attribute__((constructor)) void RegisterModule(void) { napi_module_register(&demoModule); }
213