X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmultibyte%2Fwcsrtombs.c;h=b5713aeacd84e7c3707926f8916d7ce5636de25a;hb=cee88b76f72c826cc3d3360b853a3cf2ec472fd2;hp=5cf8f3eb704753d60b2a778966dd4ae8c28057a4;hpb=571744447c23f91feb6439948f3a619aca850dfb;p=musl diff --git a/src/multibyte/wcsrtombs.c b/src/multibyte/wcsrtombs.c index 5cf8f3eb..b5713aea 100644 --- a/src/multibyte/wcsrtombs.c +++ b/src/multibyte/wcsrtombs.c @@ -1,9 +1,3 @@ -/* - * This code was written by Rich Felker in 2010; no copyright is claimed. - * This code is in the public domain. Attribution is appreciated but - * unnecessary. - */ - #include size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstate_t *restrict st) @@ -21,8 +15,13 @@ size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstat } return n; } - while (n>=4 && **ws) { - if (**ws >= 0x80u) { + while (n>=4) { + if (**ws-1u >= 0x7fu) { + if (!**ws) { + *s = 0; + *ws = 0; + return N-n; + } l = wcrtomb(s, **ws, 0); if (!(l+1)) return -1; s += l; @@ -33,8 +32,13 @@ size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstat } (*ws)++; } - while (n && **ws) { - if (**ws >= 0x80u) { + while (n) { + if (**ws-1u >= 0x7fu) { + if (!**ws) { + *s = 0; + *ws = 0; + return N-n; + } l = wcrtomb(buf, **ws, 0); if (!(l+1)) return -1; if (l>n) return N-n; @@ -47,7 +51,5 @@ size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstat } (*ws)++; } - if (n) *s = 0; - *ws = 0; - return N-n; + return N; }