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