Implement __fpurge

This commit is contained in:
Jeremy Soller
2023-03-10 08:37:54 -07:00
parent 9c055142cf
commit cc0ac982c4
+34 -3
View File
@@ -85,10 +85,20 @@ impl<W: core_io::Write> Pending for LineWriter<W> {
}
}
pub trait Writer: Write + Pending {}
pub trait Writer: Write + Pending {
fn purge(&mut self);
}
impl<W: core_io::Write> Writer for BufWriter<W> {}
impl<W: core_io::Write> Writer for LineWriter<W> {}
impl<W: core_io::Write> Writer for BufWriter<W> {
fn purge(&mut self) {
self.buf.clear();
}
}
impl<W: core_io::Write> Writer for LineWriter<W> {
fn purge(&mut self) {
self.inner.buf.clear();
}
}
/// This struct gets exposed to the C API.
pub struct FILE {
@@ -216,6 +226,16 @@ impl FILE {
x => Err(x),
}
}
pub fn purge(&mut self) {
// Purge read buffer
self.read_pos = 0;
self.read_size = 0;
// Purge unget
self.unget.clear();
// Purge write buffer
self.writer.purge();
}
}
pub struct LockGuard<'a>(&'a mut FILE);
@@ -473,6 +493,17 @@ pub unsafe extern "C" fn fopen(filename: *const c_char, mode: *const c_char) ->
}
}
/// Clear the buffers of a stream
/// Ensure the file is unlocked before calling this function, as it will attempt to lock the file
/// itself.
#[no_mangle]
pub unsafe extern "C" fn __fpurge(stream: *mut FILE) {
if ! stream.is_null() {
let mut stream = (*stream).lock();
stream.purge();
}
}
/// Insert a character into the stream
#[no_mangle]
pub unsafe extern "C" fn fputc(c: c_int, stream: *mut FILE) -> c_int {