diff options
| author | Oliver Middleton <olliemail27@gmail.com> | 2016-03-12 04:18:17 +0000 |
|---|---|---|
| committer | Oliver Middleton <olliemail27@gmail.com> | 2016-03-12 04:18:17 +0000 |
| commit | bd80a53407e15f13ce50a07642491680010fa090 (patch) | |
| tree | 001d7db59d77afc6c8cb9253c4a599a651dc2b21 /src/libstd/sys | |
| parent | 69939392425f160055378f190a65094a96c5cdbc (diff) | |
| download | rust-bd80a53407e15f13ce50a07642491680010fa090.tar.gz rust-bd80a53407e15f13ce50a07642491680010fa090.zip | |
Further simplify Windows stdout/stderr
This makes it output as much valid UTF-8 as it can then return failure.
Diffstat (limited to 'src/libstd/sys')
| -rw-r--r-- | src/libstd/sys/windows/stdio.rs | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/src/libstd/sys/windows/stdio.rs b/src/libstd/sys/windows/stdio.rs index a7110044d7f..0a0851ffac3 100644 --- a/src/libstd/sys/windows/stdio.rs +++ b/src/libstd/sys/windows/stdio.rs @@ -13,6 +13,7 @@ use prelude::v1::*; use io::prelude::*; +use cmp; use io::{self, Cursor}; use ptr; use str; @@ -69,19 +70,13 @@ fn write(out: &Output, data: &[u8]) -> io::Result<usize> { // [1]: https://tahoe-lafs.org/trac/tahoe-lafs/ticket/1232 // [2]: http://www.mail-archive.com/log4net-dev@logging.apache.org/msg00661.html const OUT_MAX: usize = 8192; - let (utf16, data_len) = match str::from_utf8(data).ok() { - Some(mut utf8) => { - if utf8.len() > OUT_MAX { - let mut new_len = OUT_MAX; - while !utf8.is_char_boundary(new_len) { - new_len -= 1; - } - utf8 = &utf8[..new_len]; - } - (utf8.encode_utf16().collect::<Vec<u16>>(), utf8.len()) - } - None => return Err(invalid_encoding()), + let len = cmp::min(data.len(), OUT_MAX); + let utf8 = match str::from_utf8(&data[..len]) { + Ok(s) => s, + Err(ref e) if e.valid_up_to() == 0 => return Err(invalid_encoding()), + Err(e) => str::from_utf8(&data[..e.valid_up_to()]).unwrap(), }; + let utf16 = utf8.encode_utf16().collect::<Vec<u16>>(); let mut written = 0; try!(cvt(unsafe { c::WriteConsoleW(handle, @@ -94,7 +89,7 @@ fn write(out: &Output, data: &[u8]) -> io::Result<usize> { // FIXME if this only partially writes the utf16 buffer then we need to // figure out how many bytes of `data` were actually written assert_eq!(written as usize, utf16.len()); - Ok(data_len) + Ok(utf8.len()) } impl Stdin { |
