• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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