Skip to content
This repository was archived by the owner on Dec 2, 2020. It is now read-only.

Merge HStdout and HStderr into the same type #41

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).

## [Unreleased]

- Merge `HStdout` and `HStderr` into one type: `HostStream`

## [v0.3.5] - 2019-08-29

### Added
Expand Down
6 changes: 3 additions & 3 deletions src/export.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ use core::fmt::{self, Write};

use cortex_m::interrupt;

use crate::hio::{self, HStderr, HStdout};
use crate::hio::{self, HostStream};

static mut HSTDOUT: Option<HStdout> = None;
static mut HSTDOUT: Option<HostStream> = None;

pub fn hstdout_str(s: &str) -> Result<(), ()> {
interrupt::free(|_| unsafe {
Expand All @@ -28,7 +28,7 @@ pub fn hstdout_fmt(args: fmt::Arguments) -> Result<(), ()> {
})
}

static mut HSTDERR: Option<HStderr> = None;
static mut HSTDERR: Option<HostStream> = None;

pub fn hstderr_str(s: &str) -> Result<(), ()> {
interrupt::free(|_| unsafe {
Expand Down
38 changes: 10 additions & 28 deletions src/hio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,63 +4,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}),
}
}

Expand Down
7 changes: 2 additions & 5 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
//!
//! # Example
//!
//! ## Using `hio::HStdout`
//! ## Using `hio::hstdout`
//!
//! This example will demonstrate how to print formatted strings.
//!
Expand All @@ -37,10 +37,7 @@
//!
//! // This function will be called by the application
//! fn print() -> Result<(), core::fmt::Error> {
//! let mut stdout = match hio::hstdout() {
//! Ok(fd) => fd,
//! Err(()) => return Err(core::fmt::Error),
//! };
//! let mut stdout = hio::hstdout().map_err(|_| core::fmt::Error)?;
//!
//! let language = "Rust";
//! let ranking = 1;
Expand Down