solo5_rs/
console.rs

1use core::cmp::max;
2use core::fmt::Error;
3pub use core::fmt::Write;
4use solo5_sys::solo5_console_write;
5
6pub fn puts(s: &str) {
7    unsafe {
8        solo5_console_write(s.as_ptr() as *const i8, s.len() as u64);
9    }
10}
11
12pub fn put_num(v: u64, radix: u32, least_len: usize) {
13    let mut s = [0_u8; 64];
14    let required_len = match v {
15        0 => 0,
16        _ => v.ilog(radix as u64) as usize,
17    } + 1;
18    let s_len = max(least_len, required_len);
19
20    let mut tmp = v;
21
22    for i in (0..s_len).rev() {
23        let d = tmp as u32 % radix;
24        s[i] = char::from_digit(d, radix).unwrap() as u8;
25        tmp /= radix as u64;
26    }
27
28    unsafe {
29        solo5_console_write(s.as_ptr() as *const i8, s.len() as u64);
30    }
31}
32
33pub struct Console;
34impl Write for Console {
35    fn write_str(&mut self, s: &str) -> Result<(), Error> {
36        puts(s);
37        Ok(())
38    }
39}
40
41#[macro_export]
42macro_rules! console {
43    ($($arg:tt)*) => {
44        let mut console=$crate::console::Console;
45        //FIXME: I don't know hot to handle this unwrap properly
46        $crate::console::Write::write_fmt(&mut console,(core::format_args!($($arg)*))).unwrap()
47    };
48}
49
50#[macro_export]
51macro_rules! consoleln {
52    ($($arg:tt)*) => {
53        let mut console=$crate::console::Console;
54        //FIXME: I don't know hot to handle this unwrap properly
55        $crate::console::Write::write_fmt(&mut console,(core::format_args_nl!($($arg)*))).unwrap()
56    };
57}