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 $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 $crate::console::Write::write_fmt(&mut console,(core::format_args_nl!($($arg)*))).unwrap()
56 };
57}