aboutsummaryrefslogtreecommitdiff
path: root/cortex-m-semihosting/src/hio.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cortex-m-semihosting/src/hio.rs')
-rw-r--r--cortex-m-semihosting/src/hio.rs39
1 files changed, 10 insertions, 29 deletions
diff --git a/cortex-m-semihosting/src/hio.rs b/cortex-m-semihosting/src/hio.rs
index 61ac749..b0ca2fb 100644
--- a/cortex-m-semihosting/src/hio.rs
+++ b/cortex-m-semihosting/src/hio.rs
@@ -3,64 +3,45 @@
use core::{fmt, slice};
use crate::nr;
-/// Host's standard error
+/// A byte stream to the host (e.g., host's stdout or stderr).
#[derive(Clone, Copy)]
-pub struct HStderr {
+pub struct HostStream {
fd: usize,
}
-impl HStderr {
+impl HostStream {
/// Attempts to write an entire `buffer` into this sink
pub fn write_all(&mut self, buffer: &[u8]) -> Result<(), ()> {
write_all(self.fd, buffer)
}
}
-impl fmt::Write for HStderr {
- fn write_str(&mut self, s: &str) -> fmt::Result {
- self.write_all(s.as_bytes()).map_err(|_| fmt::Error)
- }
-}
-
-/// Host's standard output
-#[derive(Clone, Copy)]
-pub struct HStdout {
- fd: usize,
-}
-
-impl HStdout {
- /// Attempts to write an entire `buffer` into this sink
- pub fn write_all(&mut self, buffer: &[u8]) -> Result<(), ()> {
- write_all(self.fd, buffer)
- }
-}
-
-impl fmt::Write for HStdout {
+impl fmt::Write for HostStream {
fn write_str(&mut self, s: &str) -> fmt::Result {
self.write_all(s.as_bytes()).map_err(|_| fmt::Error)
}
}
/// Construct a new handle to the host's standard error.
-pub fn hstderr() -> Result<HStderr, ()> {
+pub fn hstderr() -> Result<HostStream, ()> {
// There is actually no stderr access in ARM Semihosting documentation. Use
// convention used in libgloss.
// See: libgloss/arm/syscalls.c, line 139.
// https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;a=blob;f=libgloss/arm/syscalls.c#l139
- open(":tt\0", nr::open::W_APPEND).map(|fd| HStderr { fd })
+ open(":tt\0", nr::open::W_APPEND)
}
/// Construct a new handle to the host's standard output.
-pub fn hstdout() -> Result<HStdout, ()> {
- open(":tt\0", nr::open::W_TRUNC).map(|fd| HStdout { fd })
+pub fn hstdout() -> Result<HostStream, ()> {
+ open(":tt\0", nr::open::W_TRUNC)
}
-fn open(name: &str, mode: usize) -> Result<usize, ()> {
+fn open(name: &str, mode: usize) -> Result<HostStream, ()> {
let name = name.as_bytes();
match unsafe { syscall!(OPEN, name.as_ptr(), mode, name.len() - 1) } as
isize {
-1 => Err(()),
- fd => Ok(fd as usize),
+ fd => Ok(HostStream { fd: fd as usize }),
}
}