console.rs 926 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. use crate::sbi::*;
  2. use core::fmt::{self, Write};
  3. use spin::Mutex;
  4. struct Stdout;
  5. impl Write for Stdout {
  6. fn write_str(&mut self, s: &str) -> fmt::Result {
  7. let mut buffer = [0u8; 4];
  8. for c in s.chars() {
  9. for code_point in c.encode_utf8(&mut buffer).as_bytes().iter() {
  10. console_putchar(*code_point as usize);
  11. }
  12. }
  13. Ok(())
  14. }
  15. }
  16. #[allow(unused)]
  17. pub fn print(args: fmt::Arguments) {
  18. STDOUT.lock().write_fmt(args).unwrap();
  19. }
  20. lazy_static::lazy_static! {
  21. static ref STDOUT: Mutex<Stdout> = Mutex::new(Stdout);
  22. }
  23. #[macro_export]
  24. macro_rules! print {
  25. ($fmt: literal $(, $($arg: tt)+)?) => {
  26. $crate::console::print(format_args!($fmt $(, $($arg)+)?));
  27. }
  28. }
  29. #[macro_export]
  30. macro_rules! println {
  31. ($fmt: literal $(, $($arg: tt)+)?) => {
  32. $crate::console::print(format_args!(concat!($fmt, "\n") $(, $($arg)+)?));
  33. }
  34. }