Mercurial > hg > toybox
changeset 724:9499e4cf830f
Felix Janda pointed out that the r in mbrtowc() stands for "restartable" so it's already buffering the partial data we feed it, so rolling back most of the last commit to wc.
author | Rob Landley <rob@landley.net> |
---|---|
date | Sat, 01 Dec 2012 00:42:01 -0600 |
parents | 2818724bb8be |
children | e7c14db739c1 |
files | toys/posix/wc.c |
diffstat | 1 files changed, 11 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/toys/posix/wc.c Sat Dec 01 00:21:37 2012 -0600 +++ b/toys/posix/wc.c Sat Dec 01 00:42:01 2012 -0600 @@ -51,30 +51,25 @@ unsigned long word=0, lengths[]={0,0,0}; for (;;) { - i = 0; -again: - len = i+read(fd, toybuf+i, sizeof(toybuf)-i); - if (len < i) { + len = read(fd, toybuf, sizeof(toybuf)); + if (len<0) { perror_msg("%s",name); toys.exitval = 1; } - if (!len) break; + if (len<1) break; for (i=0; i<len; i+=clen) { + wchar_t wchar; + if (CFG_TOYBOX_I18N && (toys.optflags&FLAG_m)) { - wchar_t wchar = 0; - clen = mbrtowc(&wchar, toybuf+i, len-i, 0); - if (clen < 1) { - // If the problem might be buffer wrap, move and read more data - if (i) { - memmove(toybuf, toybuf+i, sizeof(toybuf)-i); - i = len - i; - goto again; - } else { - clen=1; + if (clen == -1) { + if (i != len-1) { + clen = 1; continue; - } + } else break; } + if (clen == -2) break; + if (clen == 0) clen=1; space = iswspace(wchar); } else space = isspace(toybuf[i]);