Fix feof and ferror

This commit is contained in:
jD91mZM2
2018-10-14 08:24:21 +02:00
parent 057d23908a
commit 23fe526c55
2 changed files with 32 additions and 5 deletions
+28 -5
View File
@@ -93,7 +93,17 @@ impl Read for FILE {
impl BufRead for FILE {
fn fill_buf(&mut self) -> io::Result<&[u8]> {
if self.read_pos == self.read_size {
self.read_size = self.file.read(&mut self.read_buf)?;
self.read_size = match self.file.read(&mut self.read_buf) {
Ok(0) => {
self.flags |= F_EOF;
0
},
Ok(n) => n,
Err(err) => {
self.flags |= F_ERR;
return Err(err);
}
};
self.read_pos = 0;
}
Ok(&self.read_buf[self.read_pos..self.read_size])
@@ -104,10 +114,22 @@ impl BufRead for FILE {
}
impl Write for FILE {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.writer.write(buf)
match self.writer.write(buf) {
Ok(n) => Ok(n),
Err(err) => {
self.flags |= F_ERR;
Err(err)
}
}
}
fn flush(&mut self) -> io::Result<()> {
self.writer.flush()
match self.writer.flush() {
Ok(()) => Ok(()),
Err(err) => {
self.flags |= F_ERR;
Err(err)
}
}
}
}
impl WriteFmt for FILE {
@@ -152,7 +174,8 @@ impl<'a> Drop for LockGuard<'a> {
/// Clears EOF and ERR indicators on a stream
#[no_mangle]
pub extern "C" fn clearerr(stream: &mut FILE) {
pub extern "C" fn clearerr(stream: *mut FILE) {
let mut stream = unsafe { &mut *stream }.lock();
stream.flags &= !(F_EOF | F_ERR);
}
@@ -465,7 +488,7 @@ pub extern "C" fn fseeko(stream: *mut FILE, mut off: off_t, whence: c_int) -> c_
return err as c_int;
}
stream.flags &= !F_EOF;
stream.flags &= !(F_EOF | F_ERR);
stream.read_pos = 0;
stream.read_size = 0;
stream.unget = None;
+4
View File
@@ -10,6 +10,10 @@ int main() {
fputs(line, stdout);
} else {
puts("EOF");
if (!feof(f)) {
puts("feof() not updated!");
return -1;
}
break;
}
}