|
@@ -38,12 +38,15 @@ size_t mbsrtowcs(wchar_t *restrict ws, const char **restrict src, size_t wn, mbs
|
|
|
}
|
|
|
|
|
|
if (!ws) for (;;) {
|
|
|
+#ifdef __GNUC__
|
|
|
+ typedef uint32_t __attribute__((__may_alias__)) w32;
|
|
|
if (*s-1u < 0x7f && (uintptr_t)s%4 == 0) {
|
|
|
- while (!(( *(uint32_t*)s | *(uint32_t*)s-0x01010101) & 0x80808080)) {
|
|
|
+ while (!(( *(w32*)s | *(w32*)s-0x01010101) & 0x80808080)) {
|
|
|
s += 4;
|
|
|
wn -= 4;
|
|
|
}
|
|
|
}
|
|
|
+#endif
|
|
|
if (*s-1u < 0x7f) {
|
|
|
s++;
|
|
|
wn--;
|
|
@@ -69,8 +72,10 @@ resume0:
|
|
|
*src = (const void *)s;
|
|
|
return wn0;
|
|
|
}
|
|
|
+#ifdef __GNUC__
|
|
|
+ typedef uint32_t __attribute__((__may_alias__)) w32;
|
|
|
if (*s-1u < 0x7f && (uintptr_t)s%4 == 0) {
|
|
|
- while (wn>=5 && !(( *(uint32_t*)s | *(uint32_t*)s-0x01010101) & 0x80808080)) {
|
|
|
+ while (wn>=5 && !(( *(w32*)s | *(w32*)s-0x01010101) & 0x80808080)) {
|
|
|
*ws++ = *s++;
|
|
|
*ws++ = *s++;
|
|
|
*ws++ = *s++;
|
|
@@ -78,6 +83,7 @@ resume0:
|
|
|
wn -= 4;
|
|
|
}
|
|
|
}
|
|
|
+#endif
|
|
|
if (*s-1u < 0x7f) {
|
|
|
*ws++ = *s++;
|
|
|
wn--;
|