mirror of
https://git.musl-libc.org/git/musl
synced 2025-01-06 23:02:10 +03:00
cleanup multibyte stuff to remove ugly casts, sanitize the ptr align casts
This commit is contained in:
parent
2cdfb7ca26
commit
f9d880d258
@ -53,9 +53,9 @@ extern const uint32_t bittab[];
|
||||
#define FAILSTATE R(0x80,0x80)
|
||||
|
||||
#ifdef I_FAILED_TO_RTFM_RFC3629
|
||||
#define SA 0xc2
|
||||
#define SB 0xfe
|
||||
#define SA 0xc2u
|
||||
#define SB 0xfeu
|
||||
#else
|
||||
#define SA 0xc2
|
||||
#define SB 0xf5
|
||||
#define SA 0xc2u
|
||||
#define SB 0xf5u
|
||||
#endif
|
||||
|
@ -15,7 +15,7 @@ size_t mbrtowc(wchar_t *wc, const char *src, size_t n, mbstate_t *st)
|
||||
{
|
||||
static unsigned internal_state;
|
||||
unsigned c;
|
||||
const unsigned char *s = src;
|
||||
const unsigned char *s = (const void *)src;
|
||||
const unsigned N = n;
|
||||
|
||||
if (!st) st = (void *)&internal_state;
|
||||
@ -29,8 +29,8 @@ size_t mbrtowc(wchar_t *wc, const char *src, size_t n, mbstate_t *st)
|
||||
|
||||
if (!n) return -2;
|
||||
if (!c) {
|
||||
if ((unsigned)*s < 0x80) return !!(*wc = *s);
|
||||
if ((unsigned)*s-SA > SB-SA) goto ilseq;
|
||||
if (*s < 0x80) return !!(*wc = *s);
|
||||
if (*s-SA > SB-SA) goto ilseq;
|
||||
c = bittab[*s++-SA]; n--;
|
||||
}
|
||||
|
||||
@ -44,7 +44,7 @@ loop:
|
||||
return N-n;
|
||||
}
|
||||
if (n) {
|
||||
if ((unsigned)*s-0x80 >= 0x40) goto ilseq;
|
||||
if (*s-0x80u >= 0x40) goto ilseq;
|
||||
goto loop;
|
||||
}
|
||||
}
|
||||
|
@ -14,7 +14,7 @@
|
||||
size_t mbsrtowcs(wchar_t *ws, const char **src, size_t wn, mbstate_t *st)
|
||||
{
|
||||
unsigned c;
|
||||
const unsigned char *s = *src;
|
||||
const unsigned char *s = (const void *)*src;
|
||||
const wchar_t *wsorig = ws;
|
||||
|
||||
if (!st) st = (void *)&c, c = 0;
|
||||
@ -30,12 +30,12 @@ size_t mbsrtowcs(wchar_t *ws, const char **src, size_t wn, mbstate_t *st)
|
||||
}
|
||||
|
||||
if (!ws) for (wn=0;;) {
|
||||
if ((unsigned)*s-SA >= SB-SA) {
|
||||
while (((unsigned)s&3) && (unsigned)*s-1<0x7f) s++, wn++;
|
||||
if (*s-SA >= SB-SA) {
|
||||
while (((uintptr_t)s&3) && *s-1u<0x7f) s++, wn++;
|
||||
while (!(( *(uint32_t*)s | *(uint32_t*)s-0x01010101) & 0x80808080)) s+=4, wn+=4;
|
||||
while ((unsigned)*s-1<0x7f) s++, wn++;
|
||||
while (*s-1u<0x7f) s++, wn++;
|
||||
if (!*s) return wn;
|
||||
if ((unsigned)*s-SA >= SB-SA) goto ilseq2;
|
||||
if (*s-SA >= SB-SA) goto ilseq2;
|
||||
}
|
||||
c = bittab[*s++-SA];
|
||||
do {
|
||||
@ -43,22 +43,22 @@ resume0:
|
||||
if (OOB(c,*s)) goto ilseq2; s++;
|
||||
c <<= 6; if (!(c&(1U<<31))) break;
|
||||
#ifdef I_FAILED_TO_RTFM_RFC3629
|
||||
if ((unsigned)*s++-0x80 >= 0x40) goto ilseq2;
|
||||
if (*s++-0x80u >= 0x40) goto ilseq2;
|
||||
c <<= 6; if (!(c&(1U<<31))) break;
|
||||
if ((unsigned)*s++-0x80 >= 0x40) goto ilseq2;
|
||||
if (*s++-0x80u >= 0x40) goto ilseq2;
|
||||
c <<= 6; if (!(c&(1U<<31))) break;
|
||||
#endif
|
||||
if ((unsigned)*s++-0x80 >= 0x40) goto ilseq2;
|
||||
if (*s++-0x80u >= 0x40) goto ilseq2;
|
||||
c <<= 6; if (!(c&(1U<<31))) break;
|
||||
if ((unsigned)*s++-0x80 >= 0x40) goto ilseq2;
|
||||
if (*s++-0x80u >= 0x40) goto ilseq2;
|
||||
} while (0);
|
||||
wn++; c = 0;
|
||||
}
|
||||
|
||||
while (wn) {
|
||||
if ((unsigned)*s-SA >= SB-SA) {
|
||||
if (*s-SA >= SB-SA) {
|
||||
if (wn >= 7) {
|
||||
while (((unsigned)s&3) && (unsigned)*s-1<0x7f) {
|
||||
while (((uintptr_t)s&3) && *s-1u<0x7f) {
|
||||
*ws++ = *s++;
|
||||
wn--;
|
||||
}
|
||||
@ -70,7 +70,7 @@ resume0:
|
||||
wn -= 4;
|
||||
}
|
||||
}
|
||||
while (wn && (unsigned)*s-1<0x7f) {
|
||||
while (wn && *s-1u<0x7f) {
|
||||
*ws++ = *s++;
|
||||
wn--;
|
||||
}
|
||||
@ -80,7 +80,7 @@ resume0:
|
||||
*src = 0;
|
||||
return ws-wsorig;
|
||||
}
|
||||
if ((unsigned)*s-SA >= SB-SA) goto ilseq;
|
||||
if (*s-SA >= SB-SA) goto ilseq;
|
||||
}
|
||||
c = bittab[*s++-SA];
|
||||
do {
|
||||
@ -90,29 +90,29 @@ resume:
|
||||
if (!(c&(1U<<31))) break;
|
||||
|
||||
#ifdef I_FAILED_TO_RTFM_RFC3629
|
||||
if ((unsigned)*s-0x80 >= 0x40) goto ilseq;
|
||||
if (*s-0x80u >= 0x40) goto ilseq;
|
||||
c = (c<<6) | *s++-0x80;
|
||||
if (!(c&(1U<<31))) break;
|
||||
|
||||
if ((unsigned)*s-0x80 >= 0x40) goto ilseq;
|
||||
if (*s-0x80u >= 0x40) goto ilseq;
|
||||
c = (c<<6) | *s++-0x80;
|
||||
if (!(c&(1U<<31))) break;
|
||||
#endif
|
||||
|
||||
if ((unsigned)*s-0x80 >= 0x40) goto ilseq;
|
||||
if (*s-0x80u >= 0x40) goto ilseq;
|
||||
c = (c<<6) | *s++-0x80;
|
||||
if (!(c&(1U<<31))) break;
|
||||
|
||||
if ((unsigned)*s-0x80 >= 0x40) goto ilseq;
|
||||
if (*s-0x80u >= 0x40) goto ilseq;
|
||||
c = (c<<6) | *s++-0x80;
|
||||
} while (0);
|
||||
|
||||
*ws++ = c; wn--; c = 0;
|
||||
}
|
||||
*src = s;
|
||||
*src = (const void *)s;
|
||||
return ws-wsorig;
|
||||
ilseq:
|
||||
*src = s;
|
||||
*src = (const void *)s;
|
||||
ilseq2:
|
||||
/* enter permanently failing state */
|
||||
*(unsigned *)st = FAILSTATE;
|
||||
|
Loading…
Reference in New Issue
Block a user