1#include <limits.h>2#include <string.h>3#include <wchar.h>45#undef mbsrtowcs67size_t8mbsrtowcs(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;1516 if (!ps)17 ps = &st;1819 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;2829 if (dest) {30 if (n == len) {31 *src = s;32 break;33 }34 *dest++ = wc;35 }3637 if (wc == 0) {38 if (dest)39 *src = NULL;40 break;41 }4243 s += cnt;44 n++;4546 }4748 return n;49}