Skip to content
Snippets Groups Projects
Commit 4deb2e5f authored by Eemeli's avatar Eemeli
Browse files

libstd Write trait write_fmt

parent eedad194
Branches
Tags
No related merge requests found
...@@ -4,8 +4,6 @@ use core_alloc::{boxed::Box, string::String, vec::Vec}; ...@@ -4,8 +4,6 @@ use core_alloc::{boxed::Box, string::String, vec::Vec};
use hyperion_syscall::err::{Error, Result}; use hyperion_syscall::err::{Error, Result};
pub use stdio::*; pub use stdio::*;
use crate::fs::File;
// //
mod stdio; mod stdio;
...@@ -48,14 +46,11 @@ impl<T: Read> Read for &mut T { ...@@ -48,14 +46,11 @@ impl<T: Read> Read for &mut T {
pub trait Write { pub trait Write {
fn write(&mut self, buf: &[u8]) -> Result<usize>; fn write(&mut self, buf: &[u8]) -> Result<usize>;
fn write_exact(&mut self, mut buf: &[u8], bytes_written: &mut usize) -> Result<()> { fn write_all(&mut self, mut buf: &[u8]) -> Result<()> {
while !buf.is_empty() { while !buf.is_empty() {
match self.write(buf) { match self.write(buf) {
Ok(0) => return Err(Error::WRITE_ZERO), Ok(0) => return Err(Error::WRITE_ZERO),
Ok(n) => { Ok(n) => buf = &buf[n..],
buf = &buf[n..];
*bytes_written += n;
}
Err(Error::INTERRUPTED) => {} Err(Error::INTERRUPTED) => {}
Err(err) => return Err(err), Err(err) => return Err(err),
} }
...@@ -64,38 +59,41 @@ pub trait Write { ...@@ -64,38 +59,41 @@ pub trait Write {
} }
fn flush(&mut self) -> Result<()>; fn flush(&mut self) -> Result<()>;
}
impl<T: Write> Write for &mut T { fn write_fmt(&mut self, args: fmt::Arguments) -> Result<()> {
fn write(&mut self, buf: &[u8]) -> Result<usize> { struct FmtWrite<'a, T: ?Sized> {
(**self).write(buf) inner: &'a mut T,
err: Result<()>,
} }
fn flush(&mut self) -> Result<()> { impl<T: ?Sized + Write> fmt::Write for FmtWrite<'_, T> {
(**self).flush()
}
}
impl fmt::Write for File {
fn write_str(&mut self, s: &str) -> fmt::Result { fn write_str(&mut self, s: &str) -> fmt::Result {
self.write(s.as_bytes()).map_err(|_| fmt::Error)?; self.err = self.inner.write_all(s.as_bytes());
if self.err.is_err() {
Err(fmt::Error)
} else {
Ok(()) Ok(())
} }
} }
}
impl<T: Write> fmt::Write for BufWriter<T> { let mut writer = FmtWrite {
fn write_str(&mut self, s: &str) -> fmt::Result { inner: self,
self.write(s.as_bytes()).map_err(|_| fmt::Error)?; err: Ok(()),
if s.contains('\n') { };
self.flush().map_err(|_| fmt::Error)?; _ = fmt::write(&mut writer, args);
writer.err
} }
Ok(())
} }
fn write_fmt(mut self: &mut Self, args: fmt::Arguments) -> fmt::Result { impl<T: Write> Write for &mut T {
fmt::write(&mut self, args)?; fn write(&mut self, buf: &[u8]) -> Result<usize> {
// self.flush().map_err(|_| fmt::Error)?; (**self).write(buf)
Ok(()) }
fn flush(&mut self) -> Result<()> {
(**self).flush()
} }
} }
... ...
......
...@@ -10,9 +10,9 @@ ...@@ -10,9 +10,9 @@
// //
use core::fmt::{self, Write}; use core::fmt;
use self::io::{stderr, stdout}; use self::io::{stderr, stdout, Write};
// //
... ...
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment