From 320881e0b57d16a4f768a7c8543571e26113e904 Mon Sep 17 00:00:00 2001 From: Mara Bos Date: Wed, 14 Oct 2020 00:50:01 +0100 Subject: Merge HStdout and HStderr into the same type This commit copies https://github.com/rust-embedded/cortex-m-semihosting/pull/41 into the cortex-m repository. --- cortex-m-semihosting/src/hio.rs | 39 ++++++++++----------------------------- 1 file changed, 10 insertions(+), 29 deletions(-) (limited to 'cortex-m-semihosting/src/hio.rs') 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 { +pub fn hstderr() -> Result { // 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 { - open(":tt\0", nr::open::W_TRUNC).map(|fd| HStdout { fd }) +pub fn hstdout() -> Result { + open(":tt\0", nr::open::W_TRUNC) } -fn open(name: &str, mode: usize) -> Result { +fn open(name: &str, mode: usize) -> Result { 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 }), } } -- cgit v1.2.3