ReaderUtil::each_byte shouldn't include EOF byte -- Issue #5056

This commit is contained in:
Stepan Koltsov 2013-07-28 16:53:00 +04:00 committed by User
parent 5842ab36b8
commit b92d1ea723

View file

@ -148,6 +148,9 @@ pub trait Reader {
/**
* Returns a boolean value: are we currently at EOF?
*
* Note that stream position may be already at the end-of-file point,
* but `eof` returns false until an attempt to read at that position.
*
* `eof` is conceptually similar to C's `feof` function.
*
* # Examples
@ -724,15 +727,21 @@ impl<T:Reader> ReaderUtil for T {
}
fn each_byte(&self, it: &fn(int) -> bool) -> bool {
while !self.eof() {
if !it(self.read_byte()) { return false; }
loop {
match self.read_byte() {
-1 => break,
ch => if !it(ch) { return false; }
}
}
return true;
}
fn each_char(&self, it: &fn(char) -> bool) -> bool {
while !self.eof() {
if !it(self.read_char()) { return false; }
loop {
match self.read_char() {
eof if eof == (-1 as char) => break,
ch => if !it(ch) { return false; }
}
}
return true;
}
@ -1858,6 +1867,31 @@ mod tests {
assert_eq!(frood, frood2);
}
#[test]
fn test_each_byte_each_char_file() {
// Issue #5056 -- shouldn't include trailing EOF.
let path = Path("tmp/lib-io-test-each-byte-each-char-file.tmp");
{
// create empty, enough to reproduce a problem
io::file_writer(&path, [io::Create]).unwrap();
}
{
let file = io::file_reader(&path).unwrap();
for file.each_byte() |_| {
fail!("must be empty");
}
}
{
let file = io::file_reader(&path).unwrap();
for file.each_char() |_| {
fail!("must be empty");
}
}
}
#[test]
fn test_readchars_empty() {
do io::with_str_reader("") |inp| {