xref: /DragonOS/kernel/src/libs/printk.rs (revision abe3a6ea3c543425e2cad12722e8a658b324d515)
1*abe3a6eaShanjiezhou use core::fmt::{self, Write};
26cb769c4Slogin 
3*abe3a6eaShanjiezhou use super::lib_ui::textui::{textui_putchar, FontColor};
46cb769c4Slogin 
56cb769c4Slogin #[macro_export]
66cb769c4Slogin macro_rules! print {
76cb769c4Slogin     ($($arg:tt)*) => ($crate::libs::printk::__printk(format_args!($($arg)*)));
86cb769c4Slogin }
96cb769c4Slogin 
106cb769c4Slogin #[macro_export]
116cb769c4Slogin macro_rules! println {
126cb769c4Slogin     () => {
136cb769c4Slogin         $crate::print!("\n");
146cb769c4Slogin     };
156cb769c4Slogin     ($($arg:tt)*) => ($crate::print!("{}\n", format_args!($($arg)*)));
166cb769c4Slogin }
176cb769c4Slogin 
186cb769c4Slogin /// 指定颜色,彩色输出
196cb769c4Slogin /// @param FRcolor 前景色
206cb769c4Slogin /// @param BKcolor 背景色
216cb769c4Slogin #[macro_export]
226cb769c4Slogin macro_rules! printk_color {
236cb769c4Slogin 
246cb769c4Slogin     ($FRcolor:expr, $BKcolor:expr, $($arg:tt)*) => {
256cb769c4Slogin         use alloc;
266cb769c4Slogin         $crate::libs::printk::PrintkWriter.__write_string_color($FRcolor, $BKcolor, alloc::fmt::format(format_args!($($arg)*)).as_str())
276cb769c4Slogin     };
286cb769c4Slogin }
296cb769c4Slogin 
306cb769c4Slogin #[macro_export]
316cb769c4Slogin macro_rules! kdebug {
326cb769c4Slogin     ($($arg:tt)*) => {
3340fe15e0SLoGin         $crate::libs::printk::PrintkWriter.__write_fmt(format_args!("[ DEBUG ] ({}:{})\t{}\n", file!(), line!(),format_args!($($arg)*)))
3440fe15e0SLoGin 
356cb769c4Slogin     }
366cb769c4Slogin }
376cb769c4Slogin 
386cb769c4Slogin #[macro_export]
396cb769c4Slogin macro_rules! kinfo {
406cb769c4Slogin     ($($arg:tt)*) => {
4140fe15e0SLoGin         $crate::libs::printk::PrintkWriter.__write_fmt(format_args!("[ INFO ] ({}:{})\t{}\n", file!(), line!(),format_args!($($arg)*)))
426cb769c4Slogin     }
436cb769c4Slogin }
446cb769c4Slogin 
456cb769c4Slogin #[macro_export]
466cb769c4Slogin macro_rules! kwarn {
476cb769c4Slogin     ($($arg:tt)*) => {
48*abe3a6eaShanjiezhou         $crate::libs::printk::PrintkWriter.__write_string_color($crate::libs::lib_ui::textui::FontColor::YELLOW, $crate::libs::lib_ui::textui::FontColor::BLACK, "[ WARN ] ");
4940fe15e0SLoGin         $crate::libs::printk::PrintkWriter.__write_fmt(format_args!("({}:{})\t{}\n", file!(), line!(),format_args!($($arg)*)));
506cb769c4Slogin     }
516cb769c4Slogin }
526cb769c4Slogin 
536cb769c4Slogin #[macro_export]
546cb769c4Slogin macro_rules! kerror {
556cb769c4Slogin     ($($arg:tt)*) => {
56*abe3a6eaShanjiezhou         $crate::libs::printk::PrintkWriter.__write_string_color($crate::libs::lib_ui::textui::FontColor::RED, $crate::libs::lib_ui::textui::FontColor::BLACK, "[ ERROR ] ");
5740fe15e0SLoGin         $crate::libs::printk::PrintkWriter.__write_fmt(format_args!("({}:{})\t{}\n", file!(), line!(),format_args!($($arg)*)));
586cb769c4Slogin     }
596cb769c4Slogin }
606cb769c4Slogin 
616cb769c4Slogin #[macro_export]
626cb769c4Slogin macro_rules! kBUG {
636cb769c4Slogin     ($($arg:tt)*) => {
64*abe3a6eaShanjiezhou         $crate::libs::printk::PrintkWriter.__write_string_color($crate::libs::lib_ui::textui::FontColor::RED, $crate::libs::lib_ui::textui::FontColor::BLACK, "[ BUG ] ");
6540fe15e0SLoGin         $crate::libs::printk::PrintkWriter.__write_fmt(format_args!("({}:{})\t{}\n", file!(), line!(),format_args!($($arg)*)));
666cb769c4Slogin     }
676cb769c4Slogin }
686cb769c4Slogin 
69fb6c29d0Slogin pub struct PrintkWriter;
70fb6c29d0Slogin 
71fb6c29d0Slogin impl PrintkWriter {
7240fe15e0SLoGin     #[inline]
7340fe15e0SLoGin     pub fn __write_fmt(&mut self, args: fmt::Arguments) {
74*abe3a6eaShanjiezhou         self.write_fmt(args).ok();
7540fe15e0SLoGin     }
7640fe15e0SLoGin 
77*abe3a6eaShanjiezhou     /// 并输出白底黑字
78fb6c29d0Slogin     /// @param str: 要写入的字符
79fb6c29d0Slogin     pub fn __write_string(&mut self, s: &str) {
80*abe3a6eaShanjiezhou         for c in s.chars() {
81*abe3a6eaShanjiezhou             textui_putchar(c, FontColor::WHITE, FontColor::BLACK).ok();
82fb6c29d0Slogin         }
83fb6c29d0Slogin     }
84fb6c29d0Slogin 
85*abe3a6eaShanjiezhou     pub fn __write_string_color(&self, fr_color: FontColor, bk_color: FontColor, s: &str) {
86*abe3a6eaShanjiezhou         for c in s.chars() {
87*abe3a6eaShanjiezhou             textui_putchar(c, fr_color, bk_color).ok();
8840fe15e0SLoGin         }
8940fe15e0SLoGin     }
90fb6c29d0Slogin }
91fb6c29d0Slogin 
92fb6c29d0Slogin /// 为Printk Writer实现core::fmt::Write, 使得能够借助Rust自带的格式化组件,格式化字符并输出
93fb6c29d0Slogin impl fmt::Write for PrintkWriter {
94fb6c29d0Slogin     fn write_str(&mut self, s: &str) -> fmt::Result {
95fb6c29d0Slogin         self.__write_string(s);
96fb6c29d0Slogin         Ok(())
97fb6c29d0Slogin     }
98fb6c29d0Slogin }
99fb6c29d0Slogin 
100fb6c29d0Slogin #[doc(hidden)]
101fb6c29d0Slogin pub fn __printk(args: fmt::Arguments) {
102fb6c29d0Slogin     PrintkWriter.write_fmt(args).unwrap();
103fb6c29d0Slogin }
104