Index: contrib/libc-vis/vis.c =================================================================== --- contrib/libc-vis/vis.c (revision 271241) +++ contrib/libc-vis/vis.c (working copy) @@ -105,6 +105,7 @@ #define XTOA(c) L"0123456789ABCDEF"[c] #define MAXEXTRAS 10 +#define MB_STRZ (-1) #if !HAVE_NBTOOL_CONFIG_H #ifndef __NetBSD__ @@ -345,7 +346,7 @@ * All user-visible functions call this one. */ static int -istrsenvisx(char *mbdst, size_t *dlen, const char *mbsrc, size_t mblength, +istrsenvisx(char *mbdst, size_t *dlen, const char *mbsrc, ssize_t mblength, int flags, const char *mbextra, int *cerr_ptr) { wchar_t *dst, *src, *pdst, *psrc, *start, *extra; @@ -357,8 +358,9 @@ ssize_t mbslength, maxolen; _DIAGASSERT(mbdst != NULL); - _DIAGASSERT(mbsrc != NULL); + _DIAGASSERT(mbsrc != NULL || mblength == 0); _DIAGASSERT(mbextra != NULL); + _DIAGASSERT(mblength >= 0 || mblength == MB_STRZ); /* * Input (mbsrc) is a char string considered to be multibyte @@ -375,7 +377,7 @@ /* Allocate space for the wide char strings */ psrc = pdst = extra = NULL; - if (!mblength) + if (mblength == MB_STRZ) mblength = strlen(mbsrc); if ((psrc = calloc(mblength + 1, sizeof(*psrc))) == NULL) return -1; @@ -394,7 +396,7 @@ * stop at NULs because we may be processing a block of data * that includes NULs. */ - mbslength = (ssize_t)mblength; + mbslength = mblength; /* * When inputing a single character, must also read in the * next character for nextc, the look-ahead character. @@ -431,7 +433,7 @@ * processed two characters, c and nextc. Reset len back to * just a single character. */ - if (mblength < len) + if ((size_t)mblength < len) len = mblength; /* Convert extra argument to list of characters for this mode. */ @@ -571,13 +573,13 @@ int strsvis(char *mbdst, const char *mbsrc, int flags, const char *mbextra) { - return istrsenvisx(mbdst, NULL, mbsrc, 0, flags, mbextra, NULL); + return istrsenvisx(mbdst, NULL, mbsrc, MB_STRZ, flags, mbextra, NULL); } int strsnvis(char *mbdst, size_t dlen, const char *mbsrc, int flags, const char *mbextra) { - return istrsenvisx(mbdst, &dlen, mbsrc, 0, flags, mbextra, NULL); + return istrsenvisx(mbdst, &dlen, mbsrc, MB_STRZ, flags, mbextra, NULL); } int @@ -646,13 +648,13 @@ int strvis(char *mbdst, const char *mbsrc, int flags) { - return istrsenvisx(mbdst, NULL, mbsrc, 0, flags, "", NULL); + return istrsenvisx(mbdst, NULL, mbsrc, MB_STRZ, flags, "", NULL); } int strnvis(char *mbdst, size_t dlen, const char *mbsrc, int flags) { - return istrsenvisx(mbdst, &dlen, mbsrc, 0, flags, "", NULL); + return istrsenvisx(mbdst, &dlen, mbsrc, MB_STRZ, flags, "", NULL); } /*