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, ");
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], ¶m_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], ¶m_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