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 }