1 #include <wchar.h>
2 #include <limits.h>
3 #include <string.h>
4 #ifndef __LITEOS__
5 #include "param_check.h"
6 #endif
7
wcsnrtombs(char * restrict dst,const wchar_t ** restrict wcs,size_t wn,size_t n,mbstate_t * restrict st)8 size_t wcsnrtombs(char *restrict dst, const wchar_t **restrict wcs, size_t wn, size_t n, mbstate_t *restrict st)
9 {
10 #ifndef __LITEOS__
11 PARAM_CHECK(wcs);
12 #endif
13 const wchar_t *ws = *wcs;
14 size_t cnt = 0;
15 if (!dst) n=0;
16 while (ws && wn) {
17 char tmp[MB_LEN_MAX];
18 size_t l = wcrtomb(n<MB_LEN_MAX ? tmp : dst, *ws, 0);
19 if (l==-1) {
20 cnt = -1;
21 break;
22 }
23 if (dst) {
24 if (n<MB_LEN_MAX) {
25 if (l>n) break;
26 memcpy(dst, tmp, l);
27 }
28 dst += l;
29 n -= l;
30 }
31 if (!*ws) {
32 ws = 0;
33 break;
34 }
35 ws++;
36 wn--;
37 cnt += l;
38 }
39 if (dst) *wcs = ws;
40 return cnt;
41 }
42