• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 "common/napi_helper.cpp"
17 #include "common/native_common.h"
18 #include <cinttypes>
19 #include <js_native_api.h>
20 #include <node_api.h>
21 
22 #define PARAM_0 0
23 #define PARAM_1 1
24 #define PARAM_2 2
25 #define PARAM_3 3
26 #define PARAM_UNNORMAL (-1)
27 #define RETURN_0 0
28 #define FAILD (-1)
29 #define ERRON_0 0
30 #define SIZE_10 10
31 #define SIZE_100 100
32 #define SIZE_4096 4096
33 #define SIZE_8192 8192
34 #define PARAM_16 16
35 
Imaxabs(napi_env env,napi_callback_info info)36 static napi_value Imaxabs(napi_env env, napi_callback_info info)
37 {
38     size_t argc = PARAM_1;
39     napi_value args[1] = {nullptr};
40     int a;
41     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
42     napi_get_value_int32(env, args[0], &a);
43     int ret = imaxabs(a);
44     napi_value result = nullptr;
45     napi_create_int32(env, ret, &result);
46     return result;
47 }
48 
Imaxdiv(napi_env env,napi_callback_info info)49 static napi_value Imaxdiv(napi_env env, napi_callback_info info)
50 {
51     size_t argc = PARAM_2;
52     napi_value args[2] = {nullptr};
53     int aa, ba;
54     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
55     napi_get_value_int32(env, args[0], &aa);
56     napi_get_value_int32(env, args[1], &ba);
57     imaxdiv_t ret = imaxdiv(aa, ba);
58 
59     napi_value result = nullptr;
60     napi_create_object(env, &result);
61     napi_value quot = nullptr;
62     napi_value rem = nullptr;
63     int a = ret.quot;
64     int b = ret.rem;
65     napi_create_int32(env, a, &quot);
66     napi_set_named_property(env, result, "quot", quot);
67     napi_create_int32(env, b, &rem);
68     napi_set_named_property(env, result, "rem", rem);
69     return result;
70 }
Strtoimax(napi_env env,napi_callback_info info)71 static napi_value Strtoimax(napi_env env, napi_callback_info info)
72 {
73     size_t argc = PARAM_3;
74     napi_value args[3] = {nullptr};
75 
76     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
77 
78     char *valueZero = NapiHelper::GetString(env, args[0]);
79     char *valueFirst = NapiHelper::GetString(env, args[1]);
80     int valueSecond;
81     napi_get_value_int32(env, args[2], &valueSecond);
82 
83     napi_value result = nullptr;
84     int strToiMaxValue = strtoimax(valueZero, &valueFirst, valueSecond);
85 
86     napi_create_int32(env, strToiMaxValue, &result);
87 
88     return result;
89 }
90 
Strtoumax(napi_env env,napi_callback_info info)91 static napi_value Strtoumax(napi_env env, napi_callback_info info)
92 {
93     size_t argc = PARAM_3;
94     napi_value args[3] = {nullptr};
95     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
96 
97     char *valueZero = NapiHelper::GetString(env, args[0]);
98     char *valueFirst = NapiHelper::GetString(env, args[1]);
99     int valueSecond;
100     napi_get_value_int32(env, args[2], &valueSecond);
101     int strToiMaxValue = strtoumax(valueZero, &valueFirst, valueSecond);
102 
103     napi_value result = nullptr;
104     napi_create_int32(env, strToiMaxValue, &result);
105 
106     return result;
107 }
108 
Wcstoimax(napi_env env,napi_callback_info info)109 static napi_value Wcstoimax(napi_env env, napi_callback_info info)
110 {
111     size_t argc = PARAM_1;
112     napi_value args[1] = {nullptr};
113     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
114 
115     int param_int;
116     napi_get_value_int32(env, args[0], &param_int);
117 
118     int resultValue;
119     if (param_int == PARAM_0) {
120         resultValue = wcstoimax(L"ff", nullptr, PARAM_16);
121     } else {
122         resultValue = wcstoimax(L"1000xyz", nullptr, param_int);
123     }
124 
125     napi_value result = nullptr;
126     napi_create_int32(env, resultValue, &result);
127 
128     return result;
129 }
130 
Wcstoumax(napi_env env,napi_callback_info info)131 static napi_value Wcstoumax(napi_env env, napi_callback_info info)
132 {
133     size_t argc = PARAM_1;
134     napi_value args[1] = {nullptr};
135     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
136 
137     int param_int;
138     napi_get_value_int32(env, args[0], &param_int);
139 
140     int resultValue;
141     if (param_int == PARAM_0) {
142         resultValue = wcstoumax(L"ff", nullptr, PARAM_16);
143     } else {
144         resultValue = wcstoumax(L"1000xyz", nullptr, param_int);
145     }
146 
147     napi_value result = nullptr;
148     napi_create_int32(env, resultValue, &result);
149 
150     return result;
151 }
152 
153 EXTERN_C_START
Init(napi_env env,napi_value exports)154 static napi_value Init(napi_env env, napi_value exports)
155 {
156     napi_property_descriptor desc[] = {
157         {"strtoimax", nullptr, Strtoimax, nullptr, nullptr, nullptr, napi_default, nullptr},
158         {"strtoumax", nullptr, Strtoumax, nullptr, nullptr, nullptr, napi_default, nullptr},
159         {"wcstoimax", nullptr, Wcstoimax, nullptr, nullptr, nullptr, napi_default, nullptr},
160         {"wcstoumax", nullptr, Wcstoumax, nullptr, nullptr, nullptr, napi_default, nullptr},
161         {"imaxabs", nullptr, Imaxabs, nullptr, nullptr, nullptr, napi_default, nullptr},
162         {"imaxdiv", nullptr, Imaxdiv, nullptr, nullptr, nullptr, napi_default, nullptr},
163     };
164     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
165     return exports;
166 }
167 
168 EXTERN_C_END
169 
170 static napi_module demoModule = {
171     .nm_version = 1,
172     .nm_flags = 0,
173     .nm_filename = nullptr,
174     .nm_register_func = Init,
175     .nm_modname = "inttypes",
176     .nm_priv = ((void *)0),
177     .reserved = {0},
178 };
179 
RegisterEntryModule(void)180 extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }
181