• 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 "napi/native_api.h"
19 #include <cerrno>
20 #include <cfloat>
21 #include <clocale>
22 #include <cmath>
23 #include <cstdio>
24 #include <cstdlib>
25 #include <cstring>
26 #include <ctime>
27 #include <cwchar>
28 #include <fcntl.h>
29 #include <memory.h>
30 #include <unistd.h>
31 
32 #define PARAM_0 0
33 #define PARAM_1 1
34 #define MPARAM_1 (-1)
35 #define PARAM_2 2
36 #define PARAM_3 3
37 #define PARAM_314 3.14
38 #define PARAM_4 4
39 #define PARAM_25 25
40 #define PARAM_31 31
41 #define PARAM_32 32
42 #define PARAM_6 6
43 #define PARAM_7 7
44 #define PARAM_10 10
45 #define PARAM_13 13
46 #define PARAM_16 16
47 #define PARAM_17 17
48 #define PARAM_5 5
49 #define PARAM_80 80
50 #define PARAM_0777 0777
51 #define PARAM_250068492 250068492
52 #define PARAM_2064035584 2064035584
53 #define PARAM_208622688 208622688
54 #define PARAM_7340031 7340031
55 #define PARAM_1856892505 1856892505
56 #define PARAM_6358606123 6358606123
57 #define MPARAM_208340076 (-208340076)
58 #define PARAM_2001 2001
59 #define PARAM_6340800 6340800
60 #define MPARAM_36242240 (-3624224)
61 #define SIZE_100 100
62 #define ARRY_MAX 128
63 #define ZERO 0x0
64 #define PARAM_11 11
65 #define PARAM_20 20
66 #define PARAM_14 14
67 #define PARAM_18 18
68 #define ERRON_0 0
69 #define MINUSONE (-1)
70 #define SUCCESS 1
71 #define FAILD (-1)
72 #define SIZE_256 256
73 #define PARAM_12 12
74 
75 #define SIZEOF_WCHAR(x) (sizeof(x) / sizeof(wchar_t))
76 static const char *TEMP_FILE = "/data/storage/el2/base/files/fzl.txt";
77 
Btowc_One(napi_env env,napi_callback_info info)78 static napi_value Btowc_One(napi_env env, napi_callback_info info)
79 {
80     wint_t ret = btowc('6');
81     NAPI_ASSERT(env, ret == L'6', "btowc Error");
82     ret = btowc('A');
83     NAPI_ASSERT(env, ret == L'A', "btowc Error");
84     ret = btowc('&');
85     NAPI_ASSERT(env, ret == L'&', "btowc Error");
86     napi_value result = nullptr;
87     napi_create_int32(env, SUCCESS, &result);
88     return result;
89 }
90 
Btowc_Two(napi_env env,napi_callback_info info)91 static napi_value Btowc_Two(napi_env env, napi_callback_info info)
92 {
93     wint_t ret = btowc(EOF);
94     napi_value result = nullptr;
95     napi_create_int32(env, ret == WEOF, &result);
96     return result;
97 }
98 
Mbtowc_One(napi_env env,napi_callback_info info)99 static napi_value Mbtowc_One(napi_env env, napi_callback_info info)
100 {
101     const char *test = "musl";
102     wchar_t wc[ARRY_MAX];
103     size_t ret = mbtowc(wc, test, PARAM_1);
104     napi_value result = nullptr;
105     napi_create_int32(env, ret == SUCCESS && wc[PARAM_0] == L'm', &result);
106     return result;
107 }
108 
Mbtowc_Two(napi_env env,napi_callback_info info)109 static napi_value Mbtowc_Two(napi_env env, napi_callback_info info)
110 {
111     wchar_t wc[ARRY_MAX];
112     errno = 0;
113     int ret = mbtowc(wc, nullptr, MINUSONE);
114     napi_value result = nullptr;
115     napi_create_int32(env, ret == SUCCESS && errno == EBADF, &result);
116     return result;
117 }
118 
Fputwc_One(napi_env env,napi_callback_info info)119 static napi_value Fputwc_One(napi_env env, napi_callback_info info)
120 {
121     wchar_t mb_one_bytes = L'h';
122     FILE *fp = fopen(TEMP_FILE, "w");
123     NAPI_ASSERT(env, fp != nullptr, "Fputwc_One fopen Error");
124     int ret = PARAM_0;
125     if (fp) {
126         ret = fputwc(mb_one_bytes, fp);
127         fclose(fp);
128         remove(TEMP_FILE);
129     }
130     napi_value result = nullptr;
131     napi_create_int32(env, static_cast<wchar_t>(ret) == mb_one_bytes, &result);
132     return result;
133 }
134 
Fputws_One(napi_env env,napi_callback_info info)135 static napi_value Fputws_One(napi_env env, napi_callback_info info)
136 {
137     char wstr[SIZE_100] = {PARAM_0};
138     FILE *fp = fopen(TEMP_FILE, "w+");
139     NAPI_ASSERT(env, fp != nullptr, "Fputws_One fopen Error");
140     int ret = PARAM_0;
141     int rsize = PARAM_0;
142     if (fp) {
143         ret = fputws(L"This is a test", fp);
144         fseek(fp, PARAM_0, SEEK_SET);
145         rsize = fread(wstr, sizeof(char), SIZE_100, fp);
146         fclose(fp);
147         remove(TEMP_FILE);
148     }
149     napi_value result = nullptr;
150     napi_create_int32(env, rsize == ret, &result);
151     return result;
152 }
153 
Fwide_One(napi_env env,napi_callback_info info)154 static napi_value Fwide_One(napi_env env, napi_callback_info info)
155 {
156     errno = PARAM_0;
157     FILE *fp = fopen(TEMP_FILE, "w+");
158     NAPI_ASSERT(env, fp != nullptr, "Fwide_One fopen Error");
159     int ret = PARAM_0;
160     if (fp) {
161         ret = fwide(fp, PARAM_5);
162         fclose(fp);
163         remove(TEMP_FILE);
164     }
165     napi_value result = nullptr;
166     napi_create_int32(env, ret > PARAM_0 && errno == ERRON_0, &result);
167     return result;
168 }
169 
Fwide_Two(napi_env env,napi_callback_info info)170 static napi_value Fwide_Two(napi_env env, napi_callback_info info)
171 {
172     errno = PARAM_0;
173     FILE *fp = fopen(TEMP_FILE, "w+");
174     NAPI_ASSERT(env, fp != nullptr, "Fwide_Two fopen Error");
175     int ret = PARAM_0;
176     if (fp) {
177         ret = fwide(fp, PARAM_0);
178         fclose(fp);
179         remove(TEMP_FILE);
180     }
181     napi_value result = nullptr;
182     napi_create_int32(env, ret == ERRON_0 && errno == ERRON_0, &result);
183     return result;
184 }
185 
Fwprintf_One(napi_env env,napi_callback_info info)186 static napi_value Fwprintf_One(napi_env env, napi_callback_info info)
187 {
188     setlocale(LC_ALL, "en_US.UTF-8");
189     int ret = fwprintf(stdout, L"This is a test\n");
190     napi_value result = nullptr;
191     napi_create_int32(env, ret == wcslen(L"This is a test\n"), &result);
192     return result;
193 }
194 
Fwprintf_Two(napi_env env,napi_callback_info info)195 static napi_value Fwprintf_Two(napi_env env, napi_callback_info info)
196 {
197     setlocale(LC_ALL, "en_US.UTF-8");
198     int ret = fwprintf(stderr, L"This is a test\n");
199     napi_value result = nullptr;
200     napi_create_int32(env, ret == wcslen(L"This is a test\n"), &result);
201     return result;
202 }
203 
Wprintf_One(napi_env env,napi_callback_info info)204 static napi_value Wprintf_One(napi_env env, napi_callback_info info)
205 {
206     int ret = wprintf(L"%ls", L"This is a test");
207     napi_value result = nullptr;
208     napi_create_int32(env, ret == wcslen(L"This is a test"), &result);
209     return result;
210 }
211 
Wprintf_Two(napi_env env,napi_callback_info info)212 static napi_value Wprintf_Two(napi_env env, napi_callback_info info)
213 {
214     int ret = wprintf(L"%lc", L'a');
215     napi_value result = nullptr;
216     napi_create_int32(env, ret == SUCCESS, &result);
217     return result;
218 }
219 
Fwscanf_One(napi_env env,napi_callback_info info)220 static napi_value Fwscanf_One(napi_env env, napi_callback_info info)
221 {
222     int fd = open(TEMP_FILE, O_CREAT | O_RDWR, PARAM_0777);
223     int ret = PARAM_0;
224     FILE *fp = fdopen(fd, "w+");
225     if (fp) {
226         wchar_t wstr[PARAM_10] = {PARAM_0};
227         setlocale(LC_ALL, "en_US.UTF-8");
228         fwprintf(fp, L"%ls", L"test");
229         rewind(fp);
230         ret = fwscanf(fp, L"%ls", wstr);
231         fclose(fp);
232         remove(TEMP_FILE);
233     }
234     close(fd);
235     napi_value result = nullptr;
236     napi_create_int32(env, ret == SUCCESS, &result);
237     return result;
238 }
239 
Fwscanf_Two(napi_env env,napi_callback_info info)240 static napi_value Fwscanf_Two(napi_env env, napi_callback_info info)
241 {
242     int fd = open(TEMP_FILE, O_CREAT | O_RDWR, PARAM_0777);
243     int ret = PARAM_0;
244     FILE *fp = fdopen(fd, "w+");
245     if (fp) {
246         wchar_t wstr[50] = {PARAM_0};
247         fwprintf(fp, L"%ls", L"Summation");
248         rewind(fp);
249         ret = fwscanf(fp, L"%ls %lc", wstr);
250         fclose(fp);
251         remove(TEMP_FILE);
252     }
253     close(fd);
254     napi_value result = nullptr;
255     napi_create_int32(env, ret == SUCCESS, &result);
256     return result;
257 }
258 
Swprintf_One(napi_env env,napi_callback_info info)259 static napi_value Swprintf_One(napi_env env, napi_callback_info info)
260 {
261     wchar_t wbuf[SIZE_100] = {PARAM_0};
262     int ret = swprintf(wbuf, SIZE_100, L"%ls", L"This is test");
263     napi_value result = nullptr;
264     napi_create_int32(env, ret == wcslen(L"This is test"), &result);
265     return result;
266 }
267 
Swprintf_Two(napi_env env,napi_callback_info info)268 static napi_value Swprintf_Two(napi_env env, napi_callback_info info)
269 {
270     wchar_t wbuf[SIZE_100] = {PARAM_0};
271     int ret = swprintf(wbuf, SIZE_100, L"%s", "xyz");
272     napi_value result = nullptr;
273     napi_create_int32(env, ret == strlen("xyz"), &result);
274     return result;
275 }
276 
Swscanf_One(napi_env env,napi_callback_info info)277 static napi_value Swscanf_One(napi_env env, napi_callback_info info)
278 {
279     wchar_t wstr[] = L"swscanf 123";
280     wchar_t wtmp[PARAM_20];
281     setlocale(LC_ALL, "en_US.UTF-8");
282     int ret = swscanf(wstr, L"%ls", wtmp);
283     napi_value result = nullptr;
284     napi_create_int32(env, ret == SUCCESS, &result);
285     return result;
286 }
287 
Swscanf_Two(napi_env env,napi_callback_info info)288 static napi_value Swscanf_Two(napi_env env, napi_callback_info info)
289 {
290     wchar_t buffer[SIZE_100] = L"Theta \u03b8";
291     wchar_t symbol, desc[PARAM_10];
292     setlocale(LC_ALL, "en_US.UTF-8");
293     int ret = swscanf(buffer, L"%ls %lc", desc, &symbol);
294     napi_value result = nullptr;
295     napi_create_int32(env, ret == PARAM_2, &result);
296     return result;
297 }
298 
Mbrtowc_One(napi_env env,napi_callback_info info)299 static napi_value Mbrtowc_One(napi_env env, napi_callback_info info)
300 {
301     const char pt[] = "mbrtowc example";
302     wchar_t dest;
303     mbstate_t mbs;
304     mbrlen(nullptr, PARAM_0, &mbs);
305     int length = mbrtowc(&dest, pt, sizeof(pt), &mbs);
306     napi_value result = nullptr;
307     napi_create_int32(env, length == SUCCESS, &result);
308     return result;
309 }
310 
Mbsinit_One(napi_env env,napi_callback_info info)311 static napi_value Mbsinit_One(napi_env env, napi_callback_info info)
312 {
313     char buffer[PARAM_80];
314     mbstate_t mbst;
315     const wchar_t wcs[] = L"mbsinit";
316     const wchar_t *p = nullptr;
317     p = wcs;
318     int ret = mbsinit(&mbst);
319     memset(&mbst, PARAM_0, sizeof(mbst));
320     wcsrtombs(buffer, &p, PARAM_80, &mbst);
321     napi_value result = nullptr;
322     napi_create_int32(env, ret == SUCCESS, &result);
323     return result;
324 }
325 
Mbstowcs_One(napi_env env,napi_callback_info info)326 static napi_value Mbstowcs_One(napi_env env, napi_callback_info info)
327 {
328     const int TEST_BUFFER_SIZE = ARRY_MAX;
329     const char *src = "mbstowcs_One";
330     wchar_t dst[TEST_BUFFER_SIZE];
331     memset(dst, ZERO, sizeof(wchar_t) * TEST_BUFFER_SIZE);
332     size_t ret = mbstowcs(dst, src, strlen(src));
333     napi_value result = nullptr;
334     napi_create_int32(env, ret == strlen(src), &result);
335     return result;
336 }
337 
Mbsrtowcs_One(napi_env env,napi_callback_info info)338 static napi_value Mbsrtowcs_One(napi_env env, napi_callback_info info)
339 {
340     setlocale(LC_ALL, "en_US.utf8");
341     const char *src = "\u0763\u0757";
342     wchar_t dest[PARAM_20];
343     mbstate_t ps = mbstate_t();
344     int max = PARAM_10;
345     int ret = mbsrtowcs(dest, &src, max, &ps);
346     napi_value result = nullptr;
347     napi_create_int32(env, ret == PARAM_2, &result);
348     return result;
349 }
350 
Mbsnrtowcs_One(napi_env env,napi_callback_info info)351 static napi_value Mbsnrtowcs_One(napi_env env, napi_callback_info info)
352 {
353     setlocale(LC_ALL, "en_US.utf8");
354     const char *src = "\u0763\u0757";
355     wchar_t dest[PARAM_20];
356     mbstate_t ps = mbstate_t();
357     int max = PARAM_10;
358     int ret = mbsnrtowcs(dest, &src, max, max, &ps);
359     napi_value result = nullptr;
360     napi_create_int32(env, ret == PARAM_2, &result);
361     return result;
362 }
363 
OpenWmemstream_One(napi_env env,napi_callback_info info)364 static napi_value OpenWmemstream_One(napi_env env, napi_callback_info info)
365 {
366     size_t len = PARAM_0;
367     wchar_t *ptr = nullptr;
368     FILE *fp = open_wmemstream(&ptr, &len);
369     if (fp) {
370         fputws(L"hello, world!", fp);
371         fclose(fp);
372     }
373     free(ptr);
374     ptr = nullptr;
375     napi_value result = nullptr;
376     napi_create_int32(env, wcslen(L"hello, world!") == len, &result);
377     return result;
378 }
379 
Putwc_One(napi_env env,napi_callback_info info)380 static napi_value Putwc_One(napi_env env, napi_callback_info info)
381 {
382     wint_t ret = MINUSONE;
383     FILE *fp = fopen(TEMP_FILE, "w");
384     NAPI_ASSERT(env, fp != nullptr, "Putwc_One fopen Error");
385     wchar_t wc = L'p';
386     ret = putwc(wc, fp);
387     fclose(fp);
388     remove(TEMP_FILE);
389     napi_value result = nullptr;
390     napi_create_int32(env, static_cast<wchar_t>(ret) == L'p', &result);
391     return result;
392 }
393 
PutWChar_One(napi_env env,napi_callback_info info)394 static napi_value PutWChar_One(napi_env env, napi_callback_info info)
395 {
396     wint_t ret = MINUSONE;
397     wchar_t wch[] = L"this is putwchar_0100 test case, std output success!";
398     int length = SIZEOF_WCHAR(wch);
399     for (int nLoop = PARAM_0; nLoop < length; nLoop++) {
400         ret = putwchar(wch[nLoop]);
401         NAPI_ASSERT(env, static_cast<wchar_t>(ret) == wch[nLoop], "putwchar Error");
402     }
403     napi_value result = nullptr;
404     napi_create_int32(env, SUCCESS, &result);
405     return result;
406 }
407 
Towlower_One(napi_env env,napi_callback_info info)408 static napi_value Towlower_One(napi_env env, napi_callback_info info)
409 {
410     wchar_t wc = L'A';
411     wint_t wt = PARAM_0;
412     wt = towlower(wc);
413     napi_value result = nullptr;
414     napi_create_int32(env, wt == L'a', &result);
415     return result;
416 }
417 
Towupper_One(napi_env env,napi_callback_info info)418 static napi_value Towupper_One(napi_env env, napi_callback_info info)
419 {
420     wchar_t wc = L'a';
421     wint_t wt = PARAM_0;
422     wt = towupper(wc);
423     napi_value result = nullptr;
424     napi_create_int32(env, wt == L'A', &result);
425     return result;
426 }
427 
Ungetwc_One(napi_env env,napi_callback_info info)428 static napi_value Ungetwc_One(napi_env env, napi_callback_info info)
429 {
430     FILE *fp = fopen(TEMP_FILE, "w+");
431     NAPI_ASSERT(env, fp != nullptr, "ungetwc fopen Error");
432     wint_t wc = L'a';
433     putwc(wc, fp);
434     fseek(fp, PARAM_0, SEEK_SET);
435     wint_t ret = ungetwc(wc, fp);
436     ret = getwc(fp);
437     fclose(fp);
438     remove(TEMP_FILE);
439     napi_value result = nullptr;
440     napi_create_int32(env, static_cast<wchar_t>(ret) == L'a', &result);
441     return result;
442 }
443 
Wcpcpy_One(napi_env env,napi_callback_info info)444 static napi_value Wcpcpy_One(napi_env env, napi_callback_info info)
445 {
446     wchar_t src[] = L"Source string";
447     wchar_t dst[PARAM_14] = {PARAM_0};
448     wcpcpy(dst, src);
449     napi_value result = nullptr;
450     napi_create_int32(env, wcscmp(src, dst) == ERRON_0, &result);
451     return result;
452 }
453 
Wcpncpy_One(napi_env env,napi_callback_info info)454 static napi_value Wcpncpy_One(napi_env env, napi_callback_info info)
455 {
456     wchar_t src[] = L"Source string";
457     wchar_t dst[PARAM_18] = {PARAM_0};
458     size_t src_len = PARAM_13;
459     wcpncpy(dst, src, src_len + PARAM_1);
460     napi_value result = nullptr;
461     napi_create_int32(env, wcscmp(src, dst) == ERRON_0, &result);
462     return result;
463 }
464 
Wcrtomb_One(napi_env env,napi_callback_info info)465 static napi_value Wcrtomb_One(napi_env env, napi_callback_info info)
466 {
467     wchar_t wcs = L'A';
468     char s[PARAM_20];
469     mbstate_t pr;
470     memset(&pr, PARAM_0, sizeof(pr));
471     int ret = MINUSONE;
472     ret = wcrtomb(s, wcs, &pr);
473     NAPI_ASSERT(env, ret == SUCCESS, "wcrtomb Error");
474     napi_value result = nullptr;
475     napi_create_int32(env, strcmp(s, "A") == ERRON_0, &result);
476 
477     return result;
478 }
479 
Wcscasecmp_One(napi_env env,napi_callback_info info)480 static napi_value Wcscasecmp_One(napi_env env, napi_callback_info info)
481 {
482     int ret = MINUSONE;
483     ret = wcscasecmp(L"hello1", L"HELLO2");
484     NAPI_ASSERT(env, ret < PARAM_0, "wcscasecmp Error");
485     ret = wcscasecmp(L"hello2", L"HELLO1");
486     NAPI_ASSERT(env, ret > PARAM_0, "wcscasecmp Error");
487     ret = wcscasecmp(L"hello", L"HELLO");
488     NAPI_ASSERT(env, ret == ERRON_0, "wcscasecmp Error");
489     napi_value result = nullptr;
490     napi_create_int32(env, ret == ERRON_0, &result);
491     return result;
492 }
493 
Wcscasecmpl_One(napi_env env,napi_callback_info info)494 static napi_value Wcscasecmpl_One(napi_env env, napi_callback_info info)
495 {
496     int ret = MINUSONE;
497     locale_t localInfo = nullptr;
498     ret = wcscasecmp_l(L"hello1", L"HELLO2", localInfo);
499     NAPI_ASSERT(env, ret < PARAM_0, "wcscasecmp_l Error");
500     ret = wcscasecmp_l(L"hello2", L"HELLO1", localInfo);
501     NAPI_ASSERT(env, ret > PARAM_0, "wcscasecmp_l Error");
502     ret = wcscasecmp_l(L"hello", L"HELLO", localInfo);
503     NAPI_ASSERT(env, ret == ERRON_0, "wcscasecmp_l Error");
504     napi_value result = nullptr;
505     napi_create_int32(env, ret == ERRON_0, &result);
506     return result;
507 }
508 
Wcscat_One(napi_env env,napi_callback_info info)509 static napi_value Wcscat_One(napi_env env, napi_callback_info info)
510 {
511     wchar_t wcs[PARAM_80];
512     wcscpy(wcs, L"these ");
513     wcscat(wcs, L"wide strings ");
514     wcscat(wcs, L"are ");
515     wcscat(wcs, L"concatenated.");
516     napi_value result = nullptr;
517     napi_create_int32(env, wcscmp(wcs, L"these wide strings are concatenated.") == ERRON_0, &result);
518     return result;
519 }
520 
Wcschr_One(napi_env env,napi_callback_info info)521 static napi_value Wcschr_One(napi_env env, napi_callback_info info)
522 {
523     wchar_t wcs[] = L"This is a sample wide string";
524     wchar_t *pwc = nullptr;
525     pwc = wcschr(wcs, L's');
526     napi_value result = nullptr;
527     napi_create_int32(env, pwc - wcs + PARAM_1 == PARAM_4, &result);
528     return result;
529 }
530 
Wcscmp_One(napi_env env,napi_callback_info info)531 static napi_value Wcscmp_One(napi_env env, napi_callback_info info)
532 {
533     int ret = MINUSONE;
534     ret = wcscmp(L"ABCD", L"ABCE");
535     NAPI_ASSERT(env, ret < PARAM_0, "wcscmp Error");
536     ret = wcscmp(L"ABCE", L"ABCD");
537     NAPI_ASSERT(env, ret > PARAM_0, "wcscmp Error");
538     ret = wcscmp(L"test wcscmp", L"test wcscmp");
539     NAPI_ASSERT(env, ret == ERRON_0, "wcscmp Error");
540     napi_value result = nullptr;
541     napi_create_int32(env, ret == ERRON_0, &result);
542     return result;
543 }
544 
Wcscoll_One(napi_env env,napi_callback_info info)545 static napi_value Wcscoll_One(napi_env env, napi_callback_info info)
546 {
547     setlocale(LC_COLLATE, "en_US.utf8");
548     int ret = wcscoll(L"år", L"ängel");
549     napi_value result = nullptr;
550     napi_create_int32(env, ret == SUCCESS, &result);
551     return result;
552 }
553 
Wcscolll_One(napi_env env,napi_callback_info info)554 static napi_value Wcscolll_One(napi_env env, napi_callback_info info)
555 {
556     int ret = MINUSONE;
557     locale_t localInfo = nullptr;
558     ret = wcscoll_l(L"abcdefg", L"abcdef", localInfo);
559     NAPI_ASSERT(env, ret > PARAM_0, "wcscoll_l Error");
560     ret = wcscoll_l(L"abcde", L"abcdef", localInfo);
561     NAPI_ASSERT(env, ret < PARAM_0, "wcscoll_l Error");
562     ret = wcscoll_l(L"abcdef", L"abcdef", localInfo);
563     napi_value result = nullptr;
564     napi_create_int32(env, ret == ERRON_0, &result);
565     return result;
566 }
567 
Wcscpy_One(napi_env env,napi_callback_info info)568 static napi_value Wcscpy_One(napi_env env, napi_callback_info info)
569 {
570     wchar_t wcs[] = L"wcscpy test";
571     wchar_t des[40];
572     wcscpy(des, wcs);
573     napi_value result = nullptr;
574     napi_create_int32(env, wcscmp(wcs, des) == ERRON_0, &result);
575     return result;
576 }
577 
Wcscspn_One(napi_env env,napi_callback_info info)578 static napi_value Wcscspn_One(napi_env env, napi_callback_info info)
579 {
580     wchar_t wcs[] = L"fcba73";
581     wchar_t keys[] = L"1234567890";
582     int ret = MINUSONE;
583     ret = wcscspn(wcs, keys);
584     napi_value result = nullptr;
585     napi_create_int32(env, ret == PARAM_4, &result);
586     return result;
587 }
588 
Wcsdup_One(napi_env env,napi_callback_info info)589 static napi_value Wcsdup_One(napi_env env, napi_callback_info info)
590 {
591     wchar_t src[] = L"wcsdup";
592     wchar_t *ret = wcsdup(src);
593     NAPI_ASSERT(env, ret != nullptr, "wcsdup Error");
594     napi_value result = nullptr;
595     napi_create_int32(env, wcscmp(src, ret) == ERRON_0, &result);
596     return result;
597 }
598 
Wcsftime_One(napi_env env,napi_callback_info info)599 static napi_value Wcsftime_One(napi_env env, napi_callback_info info)
600 {
601     int ret = MINUSONE;
602     time_t rawtime;
603     struct tm *timeinfo;
604     wchar_t buffer[PARAM_80];
605     time(&rawtime);
606     timeinfo = localtime(&rawtime);
607     ret = wcsftime(buffer, PARAM_80, L"Now it's %I:%M%p.", timeinfo);
608     napi_value result = nullptr;
609     napi_create_int32(env, ret == PARAM_17, &result);
610     return result;
611 }
612 
Wcsftimel_One(napi_env env,napi_callback_info info)613 static napi_value Wcsftimel_One(napi_env env, napi_callback_info info)
614 {
615     int ret = MINUSONE;
616     time_t rtime;
617     struct tm *timeinfo;
618     wchar_t buffer[PARAM_80];
619     time(&rtime);
620     timeinfo = localtime(&rtime);
621     locale_t newlocale_ = newlocale(LC_ALL_MASK, "en_US", nullptr);
622     ret = wcsftime_l(buffer, PARAM_80, L"%I:%M%p", timeinfo, newlocale_);
623     if (newlocale_) {
624         freelocale(newlocale_);
625         newlocale_ = nullptr;
626     }
627     napi_value result = nullptr;
628     napi_create_int32(env, ret == PARAM_7, &result);
629     return result;
630 }
631 
Wcslen_One(napi_env env,napi_callback_info info)632 static napi_value Wcslen_One(napi_env env, napi_callback_info info)
633 {
634     wchar_t str[] = L"wcslen";
635     size_t ret = PARAM_6;
636     napi_value result = nullptr;
637     napi_create_int32(env, ret == wcslen(str), &result);
638     return result;
639 }
640 
Wcsncasecmp_One(napi_env env,napi_callback_info info)641 static napi_value Wcsncasecmp_One(napi_env env, napi_callback_info info)
642 {
643     int ret = MINUSONE;
644     ret = wcsncasecmp(L"hello1", L"HELLO2", PARAM_6);
645     NAPI_ASSERT(env, ret < PARAM_0, "wcsncasecmp Error");
646     ret = wcsncasecmp(L"hello2", L"HELLO1", PARAM_6);
647     NAPI_ASSERT(env, ret > PARAM_0, "wcsncasecmp Error");
648     ret = wcsncasecmp(L"hello1", L"HELLO2", PARAM_5);
649     napi_value result = nullptr;
650     napi_create_int32(env, ret == ERRON_0, &result);
651     return result;
652 }
653 
Wcsncasecmpl_One(napi_env env,napi_callback_info info)654 static napi_value Wcsncasecmpl_One(napi_env env, napi_callback_info info)
655 {
656     int ret = MINUSONE;
657     ret = wcsncasecmp_l(L"hello1", L"HELLO2", PARAM_6, nullptr);
658     NAPI_ASSERT(env, ret < PARAM_0, "wcsncasecmp_l Error");
659     ret = wcsncasecmp_l(L"hello2", L"HELLO1", PARAM_6, nullptr);
660     NAPI_ASSERT(env, ret > PARAM_0, "wcsncasecmp_l Error");
661     ret = wcsncasecmp_l(L"hello1", L"HELLO2", PARAM_5, nullptr);
662     napi_value result = nullptr;
663     napi_create_int32(env, ret == ERRON_0, &result);
664     return result;
665 }
666 
Wcsncat_One(napi_env env,napi_callback_info info)667 static napi_value Wcsncat_One(napi_env env, napi_callback_info info)
668 {
669     wchar_t dst[PARAM_32] = {PARAM_0};
670     wchar_t *ret = wcsncat(dst, L"hello, world!", PARAM_5);
671     napi_value result = nullptr;
672     napi_create_int32(env, wcscmp(dst, ret) == ERRON_0, &result);
673     return result;
674 }
675 
Wcsncmp_One(napi_env env,napi_callback_info info)676 static napi_value Wcsncmp_One(napi_env env, napi_callback_info info)
677 {
678     int ret = MINUSONE;
679     ret = wcsncmp(L"aaaa", L"aaab", PARAM_4);
680     NAPI_ASSERT(env, ret < PARAM_0, "wcsncmp Error");
681     ret = wcsncmp(L"aaab", L"aaaa", PARAM_4);
682     NAPI_ASSERT(env, ret > PARAM_0, "wcsncmp Error");
683     ret = wcsncmp(L"aaaa", L"aaab", PARAM_3);
684     NAPI_ASSERT(env, ret == ERRON_0, "wcsncmp Error");
685     napi_value result = nullptr;
686     napi_create_int32(env, ret == ERRON_0, &result);
687     return result;
688 }
689 
Wcsncpy_One(napi_env env,napi_callback_info info)690 static napi_value Wcsncpy_One(napi_env env, napi_callback_info info)
691 {
692     const wchar_t src[] = L"Hello";
693     wchar_t buf[SIZEOF_WCHAR(src) + PARAM_1];
694     wmemset(buf, L'A', SIZEOF_WCHAR(buf));
695     wchar_t *ret = static_cast<wchar_t *>(buf);
696 
697     napi_value result = nullptr;
698     napi_create_int32(env, ret == wcsncpy(ret, src, SIZEOF_WCHAR(src)), &result);
699     return result;
700 }
701 
Wcsnlen_One(napi_env env,napi_callback_info info)702 static napi_value Wcsnlen_One(napi_env env, napi_callback_info info)
703 {
704     const wchar_t *wc = L"ABCDEF";
705     size_t want = PARAM_6;
706     size_t ret = wcsnlen(wc, PARAM_6);
707     napi_value result = nullptr;
708     napi_create_int32(env, ret == want, &result);
709     return result;
710 }
711 
Wcsnrtombs_One(napi_env env,napi_callback_info info)712 static napi_value Wcsnrtombs_One(napi_env env, napi_callback_info info)
713 {
714     const wchar_t src[] = L"test wcsnrtombs";
715     const wchar_t *p;
716     mbstate_t mbs;
717     char buffer[PARAM_32];
718     int wn = PARAM_4;
719     int n = PARAM_4;
720     mbrlen(nullptr, PARAM_0, &mbs);
721     memset(buffer, PARAM_0, sizeof(buffer));
722     p = src;
723     int ret = wcsnrtombs(buffer, &p, wn, n, &mbs);
724     NAPI_ASSERT(env, ret > PARAM_0, "wcsnrtombs Error");
725     napi_value result = nullptr;
726     napi_create_int32(env, strcmp(buffer, "test") == ERRON_0, &result);
727     return result;
728 }
729 
Wcspbrk_One(napi_env env,napi_callback_info info)730 static napi_value Wcspbrk_One(napi_env env, napi_callback_info info)
731 {
732     wchar_t s[] = L"hello, world!";
733     wchar_t *ret = wcspbrk(s, L"abch");
734     NAPI_ASSERT(env, ret != nullptr, "wcspbrk Error");
735     napi_value result = nullptr;
736     napi_create_int32(env, wcscmp(ret, s) == ERRON_0, &result);
737     return result;
738 }
739 
Wcsrchr_One(napi_env env,napi_callback_info info)740 static napi_value Wcsrchr_One(napi_env env, napi_callback_info info)
741 {
742     wchar_t ch[] = L"hello, world";
743     wchar_t *ret = wcsrchr(ch, L'h');
744     NAPI_ASSERT(env, ret != nullptr, "wcsrchr Error");
745     napi_value result = nullptr;
746     napi_create_int32(env, wcscmp(ret, ch) == ERRON_0, &result);
747     return result;
748 }
749 
Wcsrtombs_One(napi_env env,napi_callback_info info)750 static napi_value Wcsrtombs_One(napi_env env, napi_callback_info info)
751 {
752     char str[SIZE_256] = {PARAM_0};
753     size_t want = PARAM_6;
754     const wchar_t *src = L"ABCDEF";
755     size_t ret = wcsrtombs(str, &src, PARAM_10, nullptr);
756     napi_value result = nullptr;
757     napi_create_int32(env, ret == want, &result);
758     return result;
759 }
760 
Wcsspn_One(napi_env env,napi_callback_info info)761 static napi_value Wcsspn_One(napi_env env, napi_callback_info info)
762 {
763     size_t ret = wcsspn(L"hello world", L"abcdefghijklmnopqrstuvwxyz");
764     size_t want = 5U;
765     napi_value result = nullptr;
766     napi_create_int32(env, ret == want, &result);
767     return result;
768 }
769 
Wcsstr_One(napi_env env,napi_callback_info info)770 static napi_value Wcsstr_One(napi_env env, napi_callback_info info)
771 {
772     wchar_t wcs[] = L"This is a simple string";
773     wchar_t *ret = nullptr;
774     ret = wcsstr(wcs, L"simple");
775     NAPI_ASSERT(env, ret != nullptr, "wcsstr Error");
776     wcsncpy(ret, L"sample", PARAM_6);
777     napi_value result = nullptr;
778     napi_create_int32(env, wcscmp(ret, L"sample string") == ERRON_0, &result);
779     return result;
780 }
781 
Wcstod_One(napi_env env,napi_callback_info info)782 static napi_value Wcstod_One(napi_env env, napi_callback_info info)
783 {
784     wchar_t str0[] = L"3.14wcstod";
785     wchar_t *end = nullptr;
786     wchar_t str1[] = L"wcstod";
787     double ret = wcstod(str0, &end);
788     NAPI_ASSERT(env, (fabs(ret - PARAM_314) < DBL_EPSILON), "wcstod Error");
789     napi_value result = nullptr;
790     napi_create_int32(env, wcscmp(end, str1) == ERRON_0, &result);
791     return result;
792 }
793 
Wcstof_One(napi_env env,napi_callback_info info)794 static napi_value Wcstof_One(napi_env env, napi_callback_info info)
795 {
796     wchar_t str0[] = L"3.14wcstof";
797     wchar_t *end = nullptr;
798     wchar_t str1[] = L"wcstof";
799     float ret = wcstof(str0, &end);
800     NAPI_ASSERT(env, (fabsf(ret - 3.14f) < FLT_EPSILON), "wcstof Error");
801     napi_value result = nullptr;
802     napi_create_int32(env, wcscmp(end, str1) == ERRON_0, &result);
803     return result;
804 }
805 
Wcstok_One(napi_env env,napi_callback_info info)806 static napi_value Wcstok_One(napi_env env, napi_callback_info info)
807 {
808     wchar_t str[] = L"parrot,owl.sparrow,pigeon,crow";
809     wchar_t delim[] = L",.";
810     wchar_t *ptr;
811     wchar_t *ret = wcstok(str, delim, &ptr);
812     NAPI_ASSERT(env, ret != nullptr, "wcstok Error");
813     napi_value result = nullptr;
814     napi_create_int32(env, wcscmp(ret, L"parrot") == ERRON_0, &result);
815     return result;
816 }
817 
Wcstol_One(napi_env env,napi_callback_info info)818 static napi_value Wcstol_One(napi_env env, napi_callback_info info)
819 {
820     wchar_t wsNumbers[] = L"2001 60c0c0 -1101110100110100100000 0x6fffff";
821     wchar_t *pEnd = nullptr;
822     long int li1 = wcstol(wsNumbers, &pEnd, PARAM_10);
823     long int li2 = wcstol(pEnd, &pEnd, PARAM_16);
824     long int li3 = wcstol(pEnd, &pEnd, PARAM_2);
825     long int li4 = wcstol(pEnd, nullptr, PARAM_0);
826     napi_value result = nullptr;
827     napi_create_int32(env, li1 == PARAM_2001 && li2 == PARAM_6340800 && li3 == MPARAM_36242240 && li4 == PARAM_7340031,
828                       &result);
829     return result;
830 }
831 
Wcstold_One(napi_env env,napi_callback_info info)832 static napi_value Wcstold_One(napi_env env, napi_callback_info info)
833 {
834     wchar_t str0[] = L"3.14wcstold";
835     wchar_t *end = nullptr;
836     wchar_t str1[] = L"wcstold";
837     long double ret = wcstold(str0, &end);
838     NAPI_ASSERT(env, (fabsl(ret - 3.14L) < LDBL_EPSILON), "wcstold Error");
839     napi_value result = nullptr;
840     napi_create_int32(env, wcscmp(end, str1) == ERRON_0, &result);
841     return result;
842 }
843 
Wcstoll_One(napi_env env,napi_callback_info info)844 static napi_value Wcstoll_One(napi_env env, napi_callback_info info)
845 {
846     wchar_t wsNumbers[] = L"1856892505 17b00a12b -01100011010110000010001101100 0x6fffff";
847     wchar_t *pEnd = nullptr;
848     long long int lli1 = wcstoll(wsNumbers, &pEnd, PARAM_10);
849     long long int lli2 = wcstoll(pEnd, &pEnd, PARAM_16);
850     long long int lli3 = wcstoll(pEnd, &pEnd, PARAM_2);
851     long long int lli4 = wcstoll(pEnd, nullptr, PARAM_0);
852     napi_value result = nullptr;
853     napi_create_int32(
854         env, lli1 == PARAM_1856892505 && lli2 == PARAM_6358606123 && lli3 == MPARAM_208340076 && lli4 == PARAM_7340031,
855         &result);
856     return result;
857 }
858 
Wcstombs_One(napi_env env,napi_callback_info info)859 static napi_value Wcstombs_One(napi_env env, napi_callback_info info)
860 {
861     const wchar_t str[] = L"wcstombs example";
862     char buffer[PARAM_32];
863     int ret = wcstombs(buffer, str, sizeof(buffer));
864     napi_value result = nullptr;
865     napi_create_int32(env, ret == wcslen(L"wcstombs example"), &result);
866     return result;
867 }
868 
Wcstoul_One(napi_env env,napi_callback_info info)869 static napi_value Wcstoul_One(napi_env env, napi_callback_info info)
870 {
871     unsigned long want = PARAM_25;
872     unsigned long ret = wcstoul(L"25", nullptr, PARAM_0);
873     napi_value result = nullptr;
874     napi_create_int32(env, ret == want, &result);
875     return result;
876 }
877 
Wcstoull_One(napi_env env,napi_callback_info info)878 static napi_value Wcstoull_One(napi_env env, napi_callback_info info)
879 {
880     wchar_t wsNumbers[] = L"250068492 7b06af00 1100011011110101010001100000 0x6fffff";
881     wchar_t *pEnd;
882     unsigned long long int ulli1 = wcstoull(wsNumbers, &pEnd, PARAM_10);
883     unsigned long long int ulli2 = wcstoull(pEnd, &pEnd, PARAM_16);
884     unsigned long long int ulli3 = wcstoull(pEnd, &pEnd, PARAM_2);
885     unsigned long long int ulli4 = wcstoull(pEnd, nullptr, PARAM_0);
886     napi_value result = nullptr;
887     napi_create_int32(env,
888                       ulli1 == PARAM_250068492 && ulli2 == PARAM_2064035584 && ulli3 == PARAM_208622688 &&
889                           ulli4 == PARAM_7340031,
890                       &result);
891     return result;
892 }
893 
Wcswcs_One(napi_env env,napi_callback_info info)894 static napi_value Wcswcs_One(napi_env env, napi_callback_info info)
895 {
896     wchar_t wstr[] = L"abcd";
897     wchar_t wch[] = L"a";
898     wchar_t *q = wcswcs(wstr, wch);
899     napi_value result = nullptr;
900     napi_create_int32(env, q - wstr == ERRON_0, &result);
901     return result;
902 }
903 
Wcswidth_One(napi_env env,napi_callback_info info)904 static napi_value Wcswidth_One(napi_env env, napi_callback_info info)
905 {
906     int want = PARAM_2;
907     int ret = wcswidth(L"abc", want);
908     napi_value result = nullptr;
909     napi_create_int32(env, ret == want, &result);
910     return result;
911 }
912 
Wcsxfrm_One(napi_env env,napi_callback_info info)913 static napi_value Wcsxfrm_One(napi_env env, napi_callback_info info)
914 {
915     wchar_t wc[] = L"ABCD";
916     wchar_t src[PARAM_20] = {PARAM_0};
917     size_t ret = wcsxfrm(src, wc, PARAM_5);
918     napi_value result = nullptr;
919     napi_create_int32(env, ret == wcslen(wc), &result);
920     return result;
921 }
922 
Wcsxfrml_One(napi_env env,napi_callback_info info)923 static napi_value Wcsxfrml_One(napi_env env, napi_callback_info info)
924 {
925     locale_t localInfo = nullptr;
926     wchar_t wc[] = L"ABCD";
927     wchar_t src[PARAM_20] = {PARAM_0};
928     size_t ret = wcsxfrm_l(src, wc, PARAM_5, localInfo);
929     napi_value result = nullptr;
930     napi_create_int32(env, ret == wcslen(wc), &result);
931     return result;
932 }
933 
Wctob_One(napi_env env,napi_callback_info info)934 static napi_value Wctob_One(napi_env env, napi_callback_info info)
935 {
936     wchar_t c = L'A';
937     int ret = wctob(c);
938     napi_value result = nullptr;
939     napi_create_int32(env, ret == 'A', &result);
940     return result;
941 }
942 
Wctomb_One(napi_env env,napi_callback_info info)943 static napi_value Wctomb_One(napi_env env, napi_callback_info info)
944 {
945     char byte[SIZE_256] = {PARAM_0};
946     int ret = wctomb(byte, L'h');
947     napi_value result = nullptr;
948     napi_create_int32(env, ret == SUCCESS, &result);
949     return result;
950 }
951 
Wcwidth_One(napi_env env,napi_callback_info info)952 static napi_value Wcwidth_One(napi_env env, napi_callback_info info)
953 {
954     int ret = MINUSONE;
955     const int INPUT_VALUE[PARAM_12] = {0x0300, 0x20dd, 0x00ad,  0x200b,  0x4e00, 0x9fff,
956                                        0x3400, 0x4dbf, 0x20000, 0x2a6df, 0xac00, 0xd7a3};
957     ret = wcwidth(INPUT_VALUE[PARAM_0]);
958     NAPI_ASSERT(env, ret == ERRON_0, "wcwidth Error");
959     ret = wcwidth(INPUT_VALUE[PARAM_1]);
960     NAPI_ASSERT(env, ret == ERRON_0, "wcwidth Error");
961     ret = wcwidth(INPUT_VALUE[PARAM_2]);
962     NAPI_ASSERT(env, ret == SUCCESS, "wcwidth Error");
963     ret = wcwidth(INPUT_VALUE[PARAM_3]);
964     NAPI_ASSERT(env, ret == ERRON_0, "wcwidth Error");
965     ret = wcwidth(INPUT_VALUE[PARAM_4]);
966     NAPI_ASSERT(env, ret == PARAM_2, "wcwidth Error");
967     ret = wcwidth(INPUT_VALUE[PARAM_11]);
968     NAPI_ASSERT(env, ret == PARAM_2, "wcwidth Error");
969     napi_value result = nullptr;
970     napi_create_int32(env, ret == PARAM_2, &result);
971     return result;
972 }
973 
Wmemchr_One(napi_env env,napi_callback_info info)974 static napi_value Wmemchr_One(napi_env env, napi_callback_info info)
975 {
976     wchar_t wcs[] = L"Example wide string";
977     wchar_t *ret = wmemchr(wcs, L'p', wcslen(wcs));
978     NAPI_ASSERT(env, ret != nullptr, "wcwidth Error");
979     napi_value result = nullptr;
980     napi_create_int32(env, wcscmp(ret, L"ple wide string") == ERRON_0, &result);
981     return result;
982 }
983 
Wmemcmp_One(napi_env env,napi_callback_info info)984 static napi_value Wmemcmp_One(napi_env env, napi_callback_info info)
985 {
986     int ret = MINUSONE;
987     wchar_t str[] = L"ABCDEFG";
988     wchar_t tar[] = L"ABCDEFF";
989     ret = wmemcmp(str, tar, wcslen(str));
990     NAPI_ASSERT(env, ret == SUCCESS, "wmemcmp Error");
991     ret = wmemcmp(tar, str, wcslen(str));
992     NAPI_ASSERT(env, ret == MPARAM_1, "wmemcmp Error");
993     ret = wmemcmp(str, str, wcslen(str));
994     NAPI_ASSERT(env, ret == ERRON_0, "wmemcmp Error");
995     napi_value result = nullptr;
996     napi_create_int32(env, ret == ERRON_0, &result);
997     return result;
998 }
999 
Wmemcpy_One(napi_env env,napi_callback_info info)1000 static napi_value Wmemcpy_One(napi_env env, napi_callback_info info)
1001 {
1002     wchar_t dest[PARAM_3];
1003     wchar_t src[] = L"aaa";
1004     wchar_t *ret = wmemcpy(dest, src, PARAM_3);
1005     NAPI_ASSERT(env, ret != nullptr, "wmemcpy Error");
1006     napi_value result = nullptr;
1007     napi_create_int32(env, wcsncmp(dest, src, PARAM_3) == ERRON_0, &result);
1008     return result;
1009 }
1010 
Wmemmove_One(napi_env env,napi_callback_info info)1011 static napi_value Wmemmove_One(napi_env env, napi_callback_info info)
1012 {
1013     wchar_t src[] = L"This is a c test for wmemmove function";
1014     wchar_t *dest = &src[PARAM_0];
1015     wchar_t *ret = wmemmove(dest, src, PARAM_5);
1016     NAPI_ASSERT(env, ret != nullptr, "wmemmove Error");
1017     napi_value result = nullptr;
1018     napi_create_int32(env, ret == dest, &result);
1019     return result;
1020 }
1021 
Wmemset_One(napi_env env,napi_callback_info info)1022 static napi_value Wmemset_One(napi_env env, napi_callback_info info)
1023 {
1024     wchar_t wcs[] = L"almost every programmer should know wmemset!";
1025     wchar_t *ret = wmemset(wcs, L'-', PARAM_6);
1026     NAPI_ASSERT(env, ret != nullptr, "wmemset Error");
1027     napi_value result = nullptr;
1028     napi_create_int32(env, wcscmp(ret, L"------ every programmer should know wmemset!") == ERRON_0, &result);
1029     return result;
1030 }
1031 
1032 extern "C" int Vfwprintf_Test(const wchar_t *format, ...);
Vfwprintf_Test(FILE * stream,const wchar_t * format,...)1033 int Vfwprintf_Test(FILE *stream, const wchar_t *format, ...)
1034 {
1035     va_list args;
1036     va_start(args, format);
1037     int ret = vfwprintf(stream, format, args);
1038     va_end(args);
1039     return ret;
1040 }
Vfwprintf_One(napi_env env,napi_callback_info info)1041 static napi_value Vfwprintf_One(napi_env env, napi_callback_info info)
1042 {
1043     FILE *fp = fopen(TEMP_FILE, "w");
1044     NAPI_ASSERT(env, fp != nullptr, "Vfwprintf_One fopen Error");
1045     int ret = MINUSONE;
1046     ret = Vfwprintf_Test(fp, L"Call with %d variable argument.\n", PARAM_1);
1047     NAPI_ASSERT(env, ret = PARAM_31, "vfwprintf Error");
1048     ret = Vfwprintf_Test(fp, L"Call with %d variable %ls.\n", PARAM_2, L"arguments");
1049     fclose(fp);
1050     remove(TEMP_FILE);
1051     napi_value result = nullptr;
1052     napi_create_int32(env, ret == PARAM_32, &result);
1053     return result;
1054 }
1055 
1056 extern "C" int Vswprintf_Test(const wchar_t *format, ...);
Vswprintf_Test(const wchar_t * format,...)1057 int Vswprintf_Test(const wchar_t *format, ...)
1058 {
1059     wchar_t buffer[SIZE_256];
1060     va_list args;
1061     va_start(args, format);
1062     int ret = vswprintf(buffer, SIZE_256, format, args);
1063     fputws(buffer, stdout);
1064     va_end(args);
1065     return ret;
1066 }
1067 
Vswprintf_One(napi_env env,napi_callback_info info)1068 static napi_value Vswprintf_One(napi_env env, napi_callback_info info)
1069 {
1070     wchar_t str[] = L"test string has %d wide characters.\n";
1071     size_t ret = MINUSONE;
1072     ret = Vswprintf_Test(str, wcslen(str));
1073     napi_value result = nullptr;
1074     napi_create_int32(env, ret == wcslen(str), &result);
1075     return result;
1076 }
1077 
1078 extern "C" int Vwscanf_Test(const wchar_t *format, ...);
Vwscanf_Test(const wchar_t * format,...)1079 int Vwscanf_Test(const wchar_t *format, ...)
1080 {
1081     va_list args;
1082     va_start(args, format);
1083     int ret = vwscanf(format, args);
1084     va_end(args);
1085     return ret;
1086 }
1087 
Vwscanf_One(napi_env env,napi_callback_info info)1088 static napi_value Vwscanf_One(napi_env env, napi_callback_info info)
1089 {
1090     FILE *fp = fopen(TEMP_FILE, "w");
1091     NAPI_ASSERT(env, fp != nullptr, "Vwscanf_One fopen Error");
1092     wchar_t wstr[] = L"vwscanf";
1093     fputws(wstr, fp);
1094     fseek(fp, PARAM_0, SEEK_SET);
1095     FILE *fp1 = freopen(TEMP_FILE, "r", stdin);
1096     NAPI_ASSERT(env, fp1 != nullptr, "Vwscanf_One freopen Error");
1097     wchar_t wch[PARAM_20];
1098     int ret = Vwscanf_Test(L"%ls", wch);
1099     NAPI_ASSERT(env, ret == SUCCESS, "vwscanf Error");
1100     fclose(fp);
1101     fclose(fp1);
1102     remove(TEMP_FILE);
1103     napi_value result = nullptr;
1104     napi_create_int32(env, wcscmp(wch, wstr) == ERRON_0, &result);
1105     return result;
1106 }
1107 
1108 extern "C" int Vwprintf_Test(const wchar_t *format, ...);
Vwprintf_Test(const wchar_t * format,...)1109 int Vwprintf_Test(const wchar_t *format, ...)
1110 {
1111     va_list args;
1112     va_start(args, format);
1113     int ret = vwprintf(format, args);
1114     va_end(args);
1115     return ret;
1116 }
Vwprintf_One(napi_env env,napi_callback_info info)1117 static napi_value Vwprintf_One(napi_env env, napi_callback_info info)
1118 {
1119     int ret = MINUSONE;
1120     ret = Vwprintf_Test(L"Call with %d variable %ls.\n", PARAM_2, L"arguments");
1121     napi_value result = nullptr;
1122     napi_create_int32(env, ret == PARAM_32, &result);
1123     return result;
1124 }
1125 
1126 extern "C" int Vfwscanf_Test(FILE *fp, const wchar_t *format, ...);
Vfwscanf_Test(FILE * fp,const wchar_t * format,...)1127 int Vfwscanf_Test(FILE *fp, const wchar_t *format, ...)
1128 {
1129     va_list args;
1130     va_start(args, format);
1131     int result = vfwscanf(fp, format, args);
1132     va_end(args);
1133     return result;
1134 }
1135 
Vfwscanf_One(napi_env env,napi_callback_info info)1136 static napi_value Vfwscanf_One(napi_env env, napi_callback_info info)
1137 {
1138     setlocale(LC_ALL, "en_US.UTF-8");
1139     wchar_t symbol[] = L"\u0915\u0916\u0917\u0918\u0919";
1140     wchar_t names[PARAM_5][PARAM_5] = {L"Ka", L"Kha", L"Ga", L"Gha", L"Nga"};
1141     FILE *fp = fopen(TEMP_FILE, "w+");
1142     NAPI_ASSERT(env, fp != nullptr, "vfwscanf fopen Error");
1143     for (int i = PARAM_0; i < PARAM_5; i++) {
1144         fwprintf(fp, L"%lc %ls ", symbol[i], names[i]);
1145     }
1146     fseek(fp, PARAM_0, SEEK_SET);
1147     wchar_t ch, str[PARAM_5];
1148     int ret = PARAM_0;
1149     for (ret = PARAM_0; ret < PARAM_5; ret++) {
1150         Vfwscanf_Test(fp, L"%lc %ls ", &ch, str);
1151         NAPI_ASSERT(env, wcscmp(str, names[ret]) == ERRON_0, "vfwscanf Error");
1152     }
1153     fclose(fp);
1154     remove(TEMP_FILE);
1155     napi_value result = nullptr;
1156     napi_create_int32(env, ret == PARAM_5, &result);
1157     return result;
1158 }
1159 
Getwchar_One(napi_env env,napi_callback_info info)1160 static napi_value Getwchar_One(napi_env env, napi_callback_info info)
1161 {
1162     FILE *fp = fopen(TEMP_FILE, "w");
1163     NAPI_ASSERT(env, fp != nullptr, "Getwchar_One fopen Error");
1164     wchar_t wstr[] = L"getwchar";
1165     fputws(wstr, fp);
1166     fseek(fp, PARAM_0, SEEK_SET);
1167     FILE *fp1 = freopen(TEMP_FILE, "r", stdin);
1168     NAPI_ASSERT(env, fp1 != nullptr, "Getwchar_One freopen Error");
1169     wint_t ret = getwchar();
1170     fclose(fp);
1171     fclose(fp1);
1172     remove(TEMP_FILE);
1173     napi_value result = nullptr;
1174     napi_create_int32(env, static_cast<wchar_t>(ret) == L'g', &result);
1175     return result;
1176 }
1177 
Wscanf_One(napi_env env,napi_callback_info info)1178 static napi_value Wscanf_One(napi_env env, napi_callback_info info)
1179 {
1180     FILE *fp = fopen(TEMP_FILE, "w");
1181     NAPI_ASSERT(env, fp != nullptr, "Wscanf_One fopen Error");
1182     wchar_t wstr[] = L"testwscanf";
1183     fputws(wstr, fp);
1184     fseek(fp, PARAM_0, SEEK_SET);
1185     FILE *fp1 = freopen(TEMP_FILE, "r", stdin);
1186     NAPI_ASSERT(env, fp1 != nullptr, "Wscanf_One freopen Error");
1187     wchar_t wch[50] = {PARAM_0};
1188     int ret = wscanf(L"%ls", wch);
1189     NAPI_ASSERT(env, ret == SUCCESS, "wscanf Error");
1190     fclose(fp);
1191     fclose(fp1);
1192     remove(TEMP_FILE);
1193     napi_value result = nullptr;
1194     napi_create_int32(env, wcscmp(wch, L"testwscanf") == ERRON_0, &result);
1195     return result;
1196 }
1197 
1198 EXTERN_C_START
Init(napi_env env,napi_value exports)1199 static napi_value Init(napi_env env, napi_value exports)
1200 {
1201     napi_property_descriptor desc[] = {
1202         {"Btowc_One", nullptr, Btowc_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1203         {"Btowc_Two", nullptr, Btowc_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
1204         {"Fputwc_One", nullptr, Fputwc_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1205         {"Fputws_One", nullptr, Fputws_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1206         {"Fwide_One", nullptr, Fwide_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1207         {"Fwide_Two", nullptr, Fwide_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
1208         {"Fwprintf_One", nullptr, Fwprintf_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1209         {"Fwprintf_Two", nullptr, Fwprintf_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
1210         {"Fwscanf_One", nullptr, Fwscanf_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1211         {"Fwscanf_Two", nullptr, Fwscanf_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
1212         {"Getwchar_One", nullptr, Getwchar_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1213         {"Mbrtowc_One", nullptr, Mbrtowc_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1214         {"Mbsinit_One", nullptr, Mbsinit_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1215         {"Mbsnrtowcs_One", nullptr, Mbsnrtowcs_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1216         {"Mbsrtowcs_One", nullptr, Mbsrtowcs_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1217         {"Mbstowcs_One", nullptr, Mbstowcs_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1218         {"Mbtowc_One", nullptr, Mbtowc_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1219         {"Mbtowc_Two", nullptr, Mbtowc_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
1220         {"OpenWmemstream_One", nullptr, OpenWmemstream_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1221         {"Putwc_One", nullptr, Putwc_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1222         {"PutWChar_One", nullptr, PutWChar_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1223         {"Swprintf_One", nullptr, Swprintf_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1224         {"Swprintf_Two", nullptr, Swprintf_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
1225         {"Swscanf_One", nullptr, Swscanf_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1226         {"Swscanf_Two", nullptr, Swscanf_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
1227         {"Towlower_One", nullptr, Towlower_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1228         {"Towupper_One", nullptr, Towupper_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1229         {"Ungetwc_One", nullptr, Ungetwc_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1230         {"Vfwprintf_One", nullptr, Vfwprintf_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1231         {"Vfwscanf_One", nullptr, Vfwscanf_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1232         {"Vswprintf_One", nullptr, Vswprintf_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1233         {"Vwprintf_One", nullptr, Vwprintf_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1234         {"Vwscanf_One", nullptr, Vwscanf_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1235         {"Wcpcpy_One", nullptr, Wcpcpy_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1236         {"Wcpncpy_One", nullptr, Wcpncpy_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1237         {"Wcrtomb_One", nullptr, Wcrtomb_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1238         {"Wcscasecmp_One", nullptr, Wcscasecmp_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1239         {"Wcscasecmpl_One", nullptr, Wcscasecmpl_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1240         {"Wcscat_One", nullptr, Wcscat_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1241         {"Wcschr_One", nullptr, Wcschr_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1242         {"Wcscmp_One", nullptr, Wcscmp_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1243         {"Wcscoll_One", nullptr, Wcscoll_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1244         {"Wcscolll_One", nullptr, Wcscolll_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1245         {"Wcscpy_One", nullptr, Wcscpy_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1246         {"Wcscspn_One", nullptr, Wcscspn_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1247         {"Wcsdup_One", nullptr, Wcsdup_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1248         {"Wcsftime_One", nullptr, Wcsftime_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1249         {"Wcsftimel_One", nullptr, Wcsftimel_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1250         {"Wcslen_One", nullptr, Wcslen_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1251         {"Wcsncasecmp_One", nullptr, Wcsncasecmp_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1252         {"Wcsncasecmpl_One", nullptr, Wcsncasecmpl_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1253         {"Wcsncat_One", nullptr, Wcsncat_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1254         {"Wcsncmp_One", nullptr, Wcsncmp_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1255         {"Wcsncpy_One", nullptr, Wcsncpy_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1256         {"Wcsnlen_One", nullptr, Wcsnlen_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1257         {"Wcsnrtombs_One", nullptr, Wcsnrtombs_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1258         {"Wcspbrk_One", nullptr, Wcspbrk_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1259         {"Wcsrchr_One", nullptr, Wcsrchr_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1260         {"Wcsrtombs_One", nullptr, Wcsrtombs_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1261         {"Wcsspn_One", nullptr, Wcsspn_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1262         {"Wcsstr_One", nullptr, Wcsstr_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1263         {"Wcstod_One", nullptr, Wcstod_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1264         {"Wcstof_One", nullptr, Wcstof_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1265         {"Wcstok_One", nullptr, Wcstok_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1266         {"Wcstol_One", nullptr, Wcstol_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1267         {"Wcstold_One", nullptr, Wcstold_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1268         {"Wcstoll_One", nullptr, Wcstoll_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1269         {"Wcstombs_One", nullptr, Wcstombs_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1270         {"Wcstoul_One", nullptr, Wcstoul_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1271         {"Wcstoull_One", nullptr, Wcstoull_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1272         {"Wcswcs_One", nullptr, Wcswcs_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1273         {"Wcswidth_One", nullptr, Wcswidth_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1274         {"Wcsxfrm_One", nullptr, Wcsxfrm_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1275         {"Wcsxfrml_One", nullptr, Wcsxfrml_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1276         {"Wctob_One", nullptr, Wctob_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1277         {"Wctomb_One", nullptr, Wctomb_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1278         {"Wcwidth_One", nullptr, Wcwidth_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1279         {"Wmemchr_One", nullptr, Wmemchr_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1280         {"Wmemcmp_One", nullptr, Wmemcmp_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1281         {"Wmemcpy_One", nullptr, Wmemcpy_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1282         {"Wmemmove_One", nullptr, Wmemmove_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1283         {"Wmemset_One", nullptr, Wmemset_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1284         {"Wprintf_One", nullptr, Wprintf_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1285         {"Wprintf_Two", nullptr, Wprintf_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
1286         {"Wscanf_One", nullptr, Wscanf_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1287     };
1288     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
1289     return exports;
1290 }
1291 
1292 EXTERN_C_END
1293 
1294 static napi_module demoModule = {
1295     .nm_version = 1,
1296     .nm_flags = 0,
1297     .nm_filename = nullptr,
1298     .nm_register_func = Init,
1299     .nm_modname = "wcharndk1",
1300     .nm_priv = ((void *)0),
1301     .reserved = {0},
1302 };
1303 
RegisterEntryModule(void)1304 extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }
1305