summaryrefslogtreecommitdiff
path: root/src/devices
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices')
-rw-r--r--src/devices/file.rs13
-rw-r--r--src/devices/file/buffered_file.rs10
-rw-r--r--src/devices/stream.rs6
3 files changed, 28 insertions, 1 deletions
diff --git a/src/devices/file.rs b/src/devices/file.rs
index 163c10d..d35acf9 100644
--- a/src/devices/file.rs
+++ b/src/devices/file.rs
@@ -53,10 +53,17 @@ impl FileDevice {
}
}
+ pub fn flush_entry(&mut self) {
+ if let Some((Entry::File(buffered_file), _)) = &mut self.entry {
+ buffered_file.flush();
+ }
+ }
+
pub fn close_entry(&mut self) {
self.open_buffer.clear();
self.move_buffer.clear();
self.name_buffer.clear();
+ self.flush_entry();
self.entry = None;
self.new_pointer = 0;
self.new_length = 0;
@@ -255,3 +262,9 @@ impl FileDevice {
}
}
}
+
+impl Drop for FileDevice {
+ fn drop(&mut self) {
+ self.close_entry();
+ }
+}
diff --git a/src/devices/file/buffered_file.rs b/src/devices/file/buffered_file.rs
index 091b5d9..04fefbd 100644
--- a/src/devices/file/buffered_file.rs
+++ b/src/devices/file/buffered_file.rs
@@ -36,6 +36,16 @@ impl BufferedFile {
}
}
+ pub fn flush(&mut self) {
+ if let AccessMode::Write(writer) = &mut self.file {
+ writer.flush().unwrap();
+ }
+ }
+
+ pub fn close(&mut self) {
+ self.file = AccessMode::None;
+ }
+
pub fn read_byte(&mut self) -> u8 {
let mut buffer = [0u8; 1];
diff --git a/src/devices/stream.rs b/src/devices/stream.rs
index 7f69a7a..532df58 100644
--- a/src/devices/stream.rs
+++ b/src/devices/stream.rs
@@ -25,6 +25,10 @@ impl StreamDevice {
}
}
+ pub fn flush_local(&mut self) {
+ self.stdout.flush().unwrap();
+ }
+
pub fn read_queue_len(&self) -> usize {
self.stdin.buffer().len()
}
@@ -44,6 +48,6 @@ impl StreamDevice {
impl Drop for StreamDevice {
fn drop(&mut self) {
- self.stdout.flush().unwrap();
+ self.flush_local();
}
}