diff --git a/src/libstd/io/buffered.rs b/src/libstd/io/buffered.rs index fa85f286af7ff..47213e3943473 100644 --- a/src/libstd/io/buffered.rs +++ b/src/libstd/io/buffered.rs @@ -322,7 +322,7 @@ mod test { use io; use prelude::*; use super::*; - use super::super::mem::{MemReader, MemWriter}; + use super::super::mem::{MemReader, MemWriter, BufReader}; use Harness = extra::test::BenchHarness; /// A type, free to create, primarily intended for benchmarking creation of wrappers that, just @@ -526,6 +526,12 @@ mod test { assert_eq!(reader.read(buf), None); } + #[test] + fn read_char_buffered() { + let buf = [195u8, 159u8]; + let mut reader = BufferedReader::with_capacity(1, BufReader::new(buf)); + assert_eq!(reader.read_char(), Some('ß')); + } #[bench] fn bench_buffered_reader(bh: &mut Harness) { diff --git a/src/libstd/io/mod.rs b/src/libstd/io/mod.rs index 823ca80a8a176..5f5978470570b 100644 --- a/src/libstd/io/mod.rs +++ b/src/libstd/io/mod.rs @@ -1212,9 +1212,15 @@ pub trait Buffer: Reader { }; if width == 0 { return None } // not uf8 let mut buf = [0, ..4]; - match self.read(buf.mut_slice_to(width)) { - Some(n) if n == width => {} - Some(..) | None => return None // read error + { + let mut start = 0; + loop { + match self.read(buf.mut_slice(start, width)) { + Some(n) if n == width - start => break, + Some(n) if n < width - start => { start += n; } + Some(..) | None => return None // read error + } + } } match str::from_utf8_opt(buf.slice_to(width)) { Some(s) => Some(s.char_at(0)),