Changeset View
Changeset View
Standalone View
Standalone View
lib/libc/locale/euc.c
Show First 20 Lines • Show All 312 Lines • ▼ Show 20 Lines | |||||
*/ | */ | ||||
static size_t | static size_t | ||||
_EUC_mbrtowc_impl(wchar_t * __restrict pwc, const char * __restrict s, | _EUC_mbrtowc_impl(wchar_t * __restrict pwc, const char * __restrict s, | ||||
size_t n, mbstate_t * __restrict ps, | size_t n, mbstate_t * __restrict ps, | ||||
uint8_t cs2, uint8_t cs2width, uint8_t cs3, uint8_t cs3width) | uint8_t cs2, uint8_t cs2width, uint8_t cs3, uint8_t cs3width) | ||||
{ | { | ||||
_EucState *es; | _EucState *es; | ||||
int i, want; | int i; | ||||
size_t want; | |||||
wchar_t wc = 0; | wchar_t wc = 0; | ||||
unsigned char ch, chs; | unsigned char ch, chs; | ||||
es = (_EucState *)ps; | es = (_EucState *)ps; | ||||
if (es->want < 0 || es->want > MB_CUR_MAX) { | if (es->want < 0 || (size_t)es->want > MB_CUR_MAX) { | ||||
errno = EINVAL; | errno = EINVAL; | ||||
return ((size_t)-1); | return ((size_t)-1); | ||||
} | } | ||||
if (s == NULL) { | if (s == NULL) { | ||||
s = ""; | s = ""; | ||||
n = 1; | n = 1; | ||||
pwc = NULL; | pwc = NULL; | ||||
Show All 26 Lines | if (es->want == 0) { | ||||
es->want = want; | es->want = want; | ||||
es->ch = 0; | es->ch = 0; | ||||
} else { | } else { | ||||
want = es->want; | want = es->want; | ||||
wc = es->ch; | wc = es->ch; | ||||
} | } | ||||
for (i = 0; i < MIN(want, n); i++) { | for (i = 0; (size_t)i < MIN(want, n); i++) { | ||||
wc <<= 8; | wc <<= 8; | ||||
chs = *s; | chs = *s; | ||||
wc |= chs; | wc |= chs; | ||||
s++; | s++; | ||||
} | } | ||||
if (i < want) { | if ((size_t)i < want) { | ||||
/* Incomplete multibyte sequence */ | /* Incomplete multibyte sequence */ | ||||
es->want = want - i; | es->want = want - i; | ||||
es->ch = wc; | es->ch = wc; | ||||
errno = EILSEQ; | errno = EILSEQ; | ||||
return ((size_t)-2); | return ((size_t)-2); | ||||
} | } | ||||
if (pwc != NULL) | if (pwc != NULL) | ||||
*pwc = wc; | *pwc = wc; | ||||
es->want = 0; | es->want = 0; | ||||
return (wc == L'\0' ? 0 : want); | return (wc == L'\0' ? 0 : want); | ||||
} | } | ||||
static size_t | static size_t | ||||
_EUC_wcrtomb_impl(char * __restrict s, wchar_t wc, | _EUC_wcrtomb_impl(char * __restrict s, wchar_t wc, | ||||
mbstate_t * __restrict ps, | mbstate_t * __restrict ps, | ||||
uint8_t cs2, uint8_t cs2width, uint8_t cs3, uint8_t cs3width) | uint8_t cs2, uint8_t cs2width, uint8_t cs3, uint8_t cs3width) | ||||
{ | { | ||||
_EucState *es; | _EucState *es; | ||||
int i, len; | int i; | ||||
size_t len; | |||||
wchar_t nm; | wchar_t nm; | ||||
es = (_EucState *)ps; | es = (_EucState *)ps; | ||||
if (es->want != 0) { | if (es->want != 0) { | ||||
errno = EINVAL; | errno = EINVAL; | ||||
return ((size_t)-1); | return ((size_t)-1); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 54 Lines • Show Last 20 Lines |