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
;