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 "napi/native_api.h"
18 #include <clocale>
19 #include <cstdlib>
20 #include <cstring>
21 #include <malloc.h>
22 #include <strings.h>
23 #include <sys/procfs.h>
24
25 #define PARAM_0 0
26 #define TWOVALUE 2
27 #define PARAM_6 6
28 #define PARAM_2 2
29 #define PARAM_3 3
30 #define PARAM_4 4
31 #define PARAM_1 1
32 #define PARAM_10 10
33 #define PARAM_UNNORMAL (-1)
34
Strcasecmp(napi_env env, napi_callback_info info)35 static napi_value Strcasecmp(napi_env env, napi_callback_info info)
36 {
37 size_t argc = PARAM_2;
38 napi_value args[2] = {nullptr};
39 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
40 char *valueFirst = NapiHelper::GetString(env, args[0]);
41 char *valueSecond = NapiHelper::GetString(env, args[1]);
42 int sinValue = strcasecmp(valueFirst, valueSecond);
43 napi_value result = nullptr;
44 napi_create_int32(env, sinValue, &result);
45 return result;
46 }
47
Strcasecmp_l(napi_env env, napi_callback_info info)48 static napi_value Strcasecmp_l(napi_env env, napi_callback_info info)
49 {
50 size_t argc = PARAM_2;
51 napi_value args[2] = {nullptr};
52 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
53 char *valueFirst = NapiHelper::GetString(env, args[0]);
54 char *valueSecond = NapiHelper::GetString(env, args[1]);
55 locale_t locale = nullptr;
56 int sinValue = strcasecmp_l(valueFirst, valueSecond, locale);
57 napi_value result = nullptr;
58 napi_create_int32(env, sinValue, &result);
59 return result;
60 }
61
Strncasecmp(napi_env env, napi_callback_info info)62 static napi_value Strncasecmp(napi_env env, napi_callback_info info)
63 {
64 size_t argc = PARAM_3;
65 napi_value args[3] = {nullptr};
66 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
67 char *valueFirst = NapiHelper::GetString(env, args[0]);
68 char *valueSecond = NapiHelper::GetString(env, args[1]);
69 int valueThird;
70 napi_get_value_int32(env, args[2], &valueThird);
71 int sinValue = strncasecmp(valueFirst, valueSecond, valueThird);
72 napi_value result = nullptr;
73 napi_create_int32(env, sinValue, &result);
74 return result;
75 }
76
Strncasecmp_l(napi_env env, napi_callback_info info)77 static napi_value Strncasecmp_l(napi_env env, napi_callback_info info)
78 {
79 size_t argc = PARAM_4;
80 napi_value args[4] = {nullptr};
81 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
82 char *valueFirst = NapiHelper::GetString(env, args[0]);
83 char *valueSecond = NapiHelper::GetString(env, args[1]);
84 int valueThird;
85 napi_get_value_int32(env, args[2], &valueThird);
86 int value4;
87 napi_get_value_int32(env, args[3], &value4);
88 int sinValue;
89 if (value4 == PARAM_0) {
90 locale_t locale = newlocale(LC_ALL_MASK, "en_US", nullptr);
91 sinValue = strncasecmp_l(valueFirst, valueSecond, valueThird, locale);
92 } else {
93 sinValue = strncasecmp_l(valueFirst, valueSecond, valueThird, nullptr);
94 }
95 napi_value result = nullptr;
96 napi_create_int32(env, sinValue, &result);
97 return result;
98 }
99
Stpcpy(napi_env env, napi_callback_info info)100 static napi_value Stpcpy(napi_env env, napi_callback_info info)
101 {
102 size_t argc = PARAM_1;
103 napi_value args[1] = {nullptr};
104 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
105 char valueFirst[4];
106 char *valueSecond = NapiHelper::GetString(env, args[0]);
107 stpcpy(valueFirst, valueSecond);
108 napi_value result = nullptr;
109 napi_create_string_utf8(env, valueFirst, NAPI_AUTO_LENGTH, &result);
110 return result;
111 }
112
Strcpy(napi_env env, napi_callback_info info)113 static napi_value Strcpy(napi_env env, napi_callback_info info)
114 {
115 size_t argc = PARAM_1;
116 napi_value args[1] = {nullptr};
117 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
118 char valueFirst[4];
119 char *valueSecond = NapiHelper::GetString(env, args[0]);
120 strcpy(valueFirst, valueSecond);
121 napi_value result = nullptr;
122 napi_create_string_utf8(env, valueFirst, NAPI_AUTO_LENGTH, &result);
123 return result;
124 }
125
Strcspn(napi_env env, napi_callback_info info)126 static napi_value Strcspn(napi_env env, napi_callback_info info)
127 {
128 size_t argc = PARAM_2;
129 napi_value args[2] = {nullptr};
130 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
131 char *valueFirst = NapiHelper::GetString(env, args[0]);
132 char *valueSecond = NapiHelper::GetString(env, args[1]);
133 int int_value;
134 int_value = strcspn(valueFirst, valueSecond);
135 napi_value result = nullptr;
136 napi_create_int32(env, int_value, &result);
137 return result;
138 }
Index(napi_env env, napi_callback_info info)139 static napi_value Index(napi_env env, napi_callback_info info)
140 {
141 size_t argc = PARAM_1;
142 napi_value args[1] = {nullptr};
143 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
144 char *paramSrc = NapiHelper::GetString(env, args[0]);
145
146 char *ret = index(paramSrc, 'C');
147 int resultValue = PARAM_UNNORMAL;
148 if (ret != nullptr) {
149 resultValue = PARAM_0;
150 } else {
151 resultValue = PARAM_UNNORMAL;
152 }
153
154 napi_value result = nullptr;
155 napi_create_int32(env, resultValue, &result);
156
157 return result;
158 }
159
Ffs(napi_env env, napi_callback_info info)160 static napi_value Ffs(napi_env env, napi_callback_info info)
161 {
162 size_t argc = PARAM_1;
163 napi_value args[1] = {nullptr};
164 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
165 int firstParam;
166 napi_get_value_int32(env, args[0], &firstParam);
167 int backParam = ffs(firstParam);
168 napi_value result;
169 napi_create_int32(env, backParam, &result);
170 return result;
171 }
172
FfsL(napi_env env, napi_callback_info info)173 static napi_value FfsL(napi_env env, napi_callback_info info)
174 {
175 size_t argc = PARAM_1;
176 napi_value args[1] = {nullptr};
177 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
178 double firstParam;
179 napi_get_value_double(env, args[0], &firstParam);
180 double backParam = ffsl(firstParam);
181 napi_value result;
182 napi_create_double(env, backParam, &result);
183 return result;
184 }
185
FfsLL(napi_env env, napi_callback_info info)186 static napi_value FfsLL(napi_env env, napi_callback_info info)
187 {
188 size_t argc = PARAM_1;
189 napi_value args[1] = {nullptr};
190 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
191 double firstParam;
192 napi_get_value_double(env, args[0], &firstParam);
193 double backParam = ffsll(firstParam);
194 napi_value result;
195 napi_create_double(env, backParam, &result);
196 return result;
197 }
198
Bcmp(napi_env env, napi_callback_info info)199 napi_value Bcmp(napi_env env, napi_callback_info info)
200 {
201 const char *valueFirst = "Hello";
202 const char *valueSecond = "Hello";
203 size_t size = PARAM_10;
204 int resultValue = bcmp(valueFirst, valueSecond, size);
205 napi_value result;
206 napi_create_int32(env, resultValue, &result);
207 return result;
208 }
209
Bcopy(napi_env env, napi_callback_info info)210 static napi_value Bcopy(napi_env env, napi_callback_info info)
211 {
212 void *dest = malloc(PARAM_6);
213 bcopy("hello", dest, PARAM_6);
214 napi_value result = nullptr;
215 if (strcmp(static_cast<char *>(dest), "hello")) {
216 napi_create_int32(env, PARAM_UNNORMAL, &result);
217 } else {
218 napi_create_int32(env, PARAM_0, &result);
219 }
220 return result;
221 }
222
Bzero(napi_env env, napi_callback_info info)223 static napi_value Bzero(napi_env env, napi_callback_info info)
224 {
225 char dest[] = "hello";
226 bzero((void *)dest, PARAM_6);
227 napi_value result = nullptr;
228 if (PARAM_0 != *static_cast<char *>(dest)) {
229 napi_create_int32(env, PARAM_UNNORMAL, &result);
230 } else {
231 napi_create_int32(env, PARAM_0, &result);
232 }
233 return result;
234 }
235
236 EXTERN_C_START
Init(napi_env env, napi_value exports)237 static napi_value Init(napi_env env, napi_value exports)
238 {
239 napi_property_descriptor desc[] = {
240 {"strcasecmp", nullptr, Strcasecmp, nullptr, nullptr, nullptr, napi_default, nullptr},
241 {"strcasecmp_l", nullptr, Strcasecmp_l, nullptr, nullptr, nullptr, napi_default, nullptr},
242 {"strncasecmp", nullptr, Strncasecmp, nullptr, nullptr, nullptr, napi_default, nullptr},
243 {"strncasecmp_l", nullptr, Strncasecmp_l, nullptr, nullptr, nullptr, napi_default, nullptr},
244 {"index", nullptr, Index, nullptr, nullptr, nullptr, napi_default, nullptr},
245 {"ffs", nullptr, Ffs, nullptr, nullptr, nullptr, napi_default, nullptr},
246 {"ffsl", nullptr, FfsL, nullptr, nullptr, nullptr, napi_default, nullptr},
247 {"ffsll", nullptr, FfsLL, nullptr, nullptr, nullptr, napi_default, nullptr},
248 {"bcmp", nullptr, Bcmp, nullptr, nullptr, nullptr, napi_default, nullptr},
249 {"stpcpy", nullptr, Stpcpy, nullptr, nullptr, nullptr, napi_default, nullptr},
250 {"strcpy", nullptr, Strcpy, nullptr, nullptr, nullptr, napi_default, nullptr},
251 {"strcspn", nullptr, Strcspn, nullptr, nullptr, nullptr, napi_default, nullptr},
252 {"bcopy", nullptr, Bcopy, nullptr, nullptr, nullptr, napi_default, nullptr},
253 {"bzero", nullptr, Bzero, nullptr, nullptr, nullptr, napi_default, nullptr},
254 };
255 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
256 return exports;
257 }
258
259 EXTERN_C_END
260
261 static napi_module demoModule = {
262 .nm_version = 1,
263 .nm_flags = 0,
264 .nm_filename = nullptr,
265 .nm_register_func = Init,
266 .nm_modname = "strings",
267 .nm_priv = ((void *)0),
268 .reserved = {0},
269 };
270
RegisterModule(void)271 extern "C" __attribute__((constructor)) void RegisterModule(void) { napi_module_register(&demoModule); }
272