Deleted Added
full compact
28c28
< __FBSDID("$FreeBSD: head/lib/libc/locale/wcsrtombs.c 129179 2004-05-13 11:20:27Z tjr $");
---
> __FBSDID("$FreeBSD: head/lib/libc/locale/wcsrtombs.c 132497 2004-07-21 10:54:57Z tjr $");
44c44
< return (__wcsrtombs(dst, src, len, ps));
---
> return (__wcsnrtombs(dst, src, SIZE_T_MAX, len, ps));
46,111d45
<
< size_t
< __wcsrtombs_std(char * __restrict dst, const wchar_t ** __restrict src,
< size_t len, mbstate_t * __restrict ps)
< {
< mbstate_t mbsbak;
< char buf[MB_LEN_MAX];
< const wchar_t *s;
< size_t nbytes;
< int nb;
<
< s = *src;
< nbytes = 0;
<
< if (dst == NULL) {
< for (;;) {
< if ((nb = (int)__wcrtomb(buf, *s, ps)) < 0)
< /* Invalid character - wcrtomb() sets errno. */
< return ((size_t)-1);
< else if (*s == L'\0')
< return (nbytes + nb - 1);
< s++;
< nbytes += nb;
< }
< /*NOTREACHED*/
< }
<
< while (len > 0) {
< if (len > (size_t)MB_CUR_MAX) {
< /* Enough space to translate in-place. */
< if ((nb = (int)__wcrtomb(dst, *s, ps)) < 0) {
< *src = s;
< return ((size_t)-1);
< }
< } else {
< /*
< * May not be enough space; use temp. buffer.
< *
< * We need to save a copy of the conversion state
< * here so we can restore it if the multibyte
< * character is too long for the buffer.
< */
< mbsbak = *ps;
< if ((nb = (int)__wcrtomb(buf, *s, ps)) < 0) {
< *src = s;
< return ((size_t)-1);
< }
< if (nb > (int)len) {
< /* MB sequence for character won't fit. */
< *ps = mbsbak;
< break;
< }
< memcpy(dst, buf, nb);
< }
< if (*s == L'\0') {
< *src = NULL;
< return (nbytes + nb - 1);
< }
< s++;
< dst += nb;
< len -= nb;
< nbytes += nb;
< }
< *src = s;
< return (nbytes);
< }