mbsrtowcs.c - scc - simple c99 compiler
(HTM) git clone git://git.simple-cc.org/scc
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Submodules
(DIR) README
(DIR) LICENSE
---
mbsrtowcs.c (643B)
---
1 #include <limits.h>
2 #include <string.h>
3 #include <wchar.h>
4
5 #undef mbsrtowcs
6
7 size_t
8 mbsrtowcs(wchar_t *restrict dest, const char **restrict src, size_t len,
9 mbstate_t *restrict ps)
10 {
11 wchar_t wc;
12 const char *s = *src;
13 size_t cnt, n;
14 static mbstate_t st;
15
16 if (!ps)
17 ps = &st;
18
19 n = 0;
20 for (;;) {
21 cnt = mbrtowc(&wc, s, MB_LEN_MAX, ps);
22 if (cnt == (size_t) -2) {
23 s += MB_LEN_MAX;
24 continue;
25 }
26 if (cnt == (size_t) -1)
27 return -1;
28
29 if (dest) {
30 if (n == len) {
31 *src = s;
32 break;
33 }
34 *dest++ = wc;
35 }
36
37 if (wc == 0) {
38 if (dest)
39 *src = NULL;
40 break;
41 }
42
43 s += cnt;
44 n++;
45
46 }
47
48 return n;
49 }