implement reallocarray
[musl] / src / multibyte / mbsrtowcs.c
index 0ee8b69..9b2f2df 100644 (file)
@@ -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--;