• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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