Changeset View
Changeset View
Standalone View
Standalone View
contrib/libc-vis/vis.c
Show First 20 Lines • Show All 459 Lines • ▼ Show 20 Lines | istrsenvisx(char **mbdstp, size_t *dlen, const char *mbsrc, size_t mblength, | ||||
* Handle up to mblength characters (not bytes). We do not | * Handle up to mblength characters (not bytes). We do not | ||||
* stop at NULs because we may be processing a block of data | * stop at NULs because we may be processing a block of data | ||||
* that includes NULs. | * that includes NULs. | ||||
*/ | */ | ||||
bzero(&mbstate, sizeof(mbstate)); | bzero(&mbstate, sizeof(mbstate)); | ||||
while (mbslength > 0) { | while (mbslength > 0) { | ||||
/* Convert one multibyte character to wchar_t. */ | /* Convert one multibyte character to wchar_t. */ | ||||
if (!cerr) | if (!cerr) | ||||
clen = mbrtowc(src, mbsrc, MB_LEN_MAX, &mbstate); | clen = mbrtowc(src, mbsrc, MIN(mbslength, MB_LEN_MAX), | ||||
&mbstate); | |||||
if (cerr || clen < 0) { | if (cerr || clen < 0) { | ||||
/* Conversion error, process as a byte instead. */ | /* Conversion error, process as a byte instead. */ | ||||
*src = (wint_t)(u_char)*mbsrc; | *src = (wint_t)(u_char)*mbsrc; | ||||
clen = 1; | clen = 1; | ||||
cerr = 1; | cerr = 1; | ||||
} | } | ||||
if (clen == 0) { | if (clen == 0) { | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 294 Lines • Show Last 20 Lines |