mbsrtowcs.c (671B)
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 for (n = 0; ; n++) { 20 cnt = mbrtowc(&wc, s, MB_LEN_MAX, ps); 21 if (cnt == (size_t) -2) { 22 s += MB_LEN_MAX; 23 continue; 24 } 25 if (cnt == (size_t) -1) 26 return -1; 27 28 if (dest) { 29 if (n == len) { 30 *src = s; 31 return n; 32 } 33 *dest++ = wc; 34 } 35 s += cnt; 36 37 if (wc == 0) 38 break; 39 } 40 41 if (dest) { 42 memset(ps, 0, sizeof(mbstate_t)); 43 *src = NULL; 44 } 45 46 return n; 47 }