X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmultibyte%2Fwcsrtombs.c;h=b5713aeacd84e7c3707926f8916d7ce5636de25a;hb=9432bbd4e880850357fd0a81b429499451eb2084;hp=2582ac2f2d80307560992c46d366f5c86dda9efe;hpb=400c5e5c8307a2ebe44ef1f203f5a15669f20347;p=musl diff --git a/src/multibyte/wcsrtombs.c b/src/multibyte/wcsrtombs.c index 2582ac2f..b5713aea 100644 --- a/src/multibyte/wcsrtombs.c +++ b/src/multibyte/wcsrtombs.c @@ -1,15 +1,4 @@ -/* - * 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 -#include #include -#include - -#include "internal.h" size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstate_t *restrict st) { @@ -18,7 +7,7 @@ size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstat size_t N = n, l; if (!s) { for (n=0, ws2=*ws; *ws2; ws2++) { - if (*ws2 >= 0x80) { + if (*ws2 >= 0x80u) { l = wcrtomb(buf, *ws2, 0); if (!(l+1)) return -1; n += l; @@ -26,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 >= 0x80) { + 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; @@ -38,8 +32,13 @@ size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstat } (*ws)++; } - while (n && **ws) { - if (**ws >= 0x80) { + 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; @@ -52,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; }