8 size_t mbsrtowcs(wchar_t *restrict ws, const char **restrict src, size_t wn, mbstate_t *restrict st)
10 const unsigned char *s = (const void *)*src;
14 if (st && (c = *(unsigned *)st)) {
24 if (!ws) return strlen((const char *)s);
27 *src = (const void *)s;
42 typedef uint32_t __attribute__((__may_alias__)) w32;
43 if (*s-1u < 0x7f && (uintptr_t)s%4 == 0) {
44 while (!(( *(w32*)s | *(w32*)s-0x01010101) & 0x80808080)) {
55 if (*s-SA > SB-SA) break;
58 if (OOB(c,*s)) { s--; break; }
61 if (*s-0x80u >= 0x40) { s-=2; break; }
64 if (*s-0x80u >= 0x40) { s-=3; break; }
72 *src = (const void *)s;
76 typedef uint32_t __attribute__((__may_alias__)) w32;
77 if (*s-1u < 0x7f && (uintptr_t)s%4 == 0) {
78 while (wn>=5 && !(( *(w32*)s | *(w32*)s-0x01010101) & 0x80808080)) {
92 if (*s-SA > SB-SA) break;
95 if (OOB(c,*s)) { s--; break; }
96 c = (c<<6) | *s++-0x80;
98 if (*s-0x80u >= 0x40) { s-=2; break; }
99 c = (c<<6) | *s++-0x80;
101 if (*s-0x80u >= 0x40) { s-=3; break; }
102 c = (c<<6) | *s++-0x80;
118 if (ws) *src = (const void *)s;