X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmultibyte%2Fmbsnrtowcs.c;h=931192e2d83c4291059a9c6e18ee58d6fdf50592;hb=8910efd0e474fab85bf00657a6eeae4d69a87f63;hp=33457f95bdccd6e68b56123f88e84522c7d9bad7;hpb=400c5e5c8307a2ebe44ef1f203f5a15669f20347;p=musl diff --git a/src/multibyte/mbsnrtowcs.c b/src/multibyte/mbsnrtowcs.c index 33457f95..931192e2 100644 --- a/src/multibyte/mbsnrtowcs.c +++ b/src/multibyte/mbsnrtowcs.c @@ -1,22 +1,11 @@ -/* - * 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 - -#include "internal.h" size_t mbsnrtowcs(wchar_t *restrict wcs, const char **restrict src, size_t n, size_t wn, mbstate_t *restrict st) { size_t l, cnt=0, n2; wchar_t *ws, wbuf[256]; const char *s = *src; + const char *tmp_s; if (!wcs) ws = wbuf, wn = sizeof wbuf / sizeof *wbuf; else ws = wcs; @@ -27,7 +16,7 @@ size_t mbsnrtowcs(wchar_t *restrict wcs, const char **restrict src, size_t n, si while ( s && wn && ( (n2=n/4)>=wn || n2>32 ) ) { if (n2>=wn) n2=wn; - n -= n2; + tmp_s = s; l = mbsrtowcs(ws, &s, n2, st); if (!(l+1)) { cnt = l; @@ -38,6 +27,7 @@ size_t mbsnrtowcs(wchar_t *restrict wcs, const char **restrict src, size_t n, si ws += l; wn -= l; } + n = s ? n - (s - tmp_s) : 0; cnt += l; } if (s) while (wn && n) {