diff --git a/kernel/src/libs/lib_ui/textui_no_alloc.rs b/kernel/src/libs/lib_ui/textui_no_alloc.rs index 42a425b6..9387cdc5 100644 --- a/kernel/src/libs/lib_ui/textui_no_alloc.rs +++ b/kernel/src/libs/lib_ui/textui_no_alloc.rs @@ -30,90 +30,91 @@ pub fn textui_init_no_alloc(video_enabled: bool) { } } +fn next_line() { + NO_ALLOC_OPERATIONS_INDEX.store(0, Ordering::SeqCst); + NO_ALLOC_OPERATIONS_LINE.fetch_add(1, Ordering::SeqCst); + if NO_ALLOC_OPERATIONS_LINE.load(Ordering::SeqCst) >= TRUE_LINE_NUM.load(Ordering::SeqCst) { + NO_ALLOC_OPERATIONS_LINE.store(0, Ordering::SeqCst); + } +} + pub fn no_init_textui_putchar_window( character: char, frcolor: FontColor, bkcolor: FontColor, is_put_to_window: bool, ) -> Result<(), SystemError> { - if NO_ALLOC_OPERATIONS_LINE.load(Ordering::SeqCst) >= TRUE_LINE_NUM.load(Ordering::SeqCst) { - NO_ALLOC_OPERATIONS_LINE.store(0, Ordering::SeqCst); - } //字符'\0'代表ASCII码表中的空字符,表示字符串的结尾 if unlikely(character == '\0') { return Ok(()); } send_to_default_serial8250_port(&[character as u8]); - // 进行换行操作 - if unlikely(character == '\n') { - // 换行时还需要输出\r - send_to_default_serial8250_port(&[b'\r']); - if is_put_to_window { - NO_ALLOC_OPERATIONS_LINE.fetch_add(1, Ordering::SeqCst); - NO_ALLOC_OPERATIONS_INDEX.store(0, Ordering::SeqCst); - } - return Ok(()); - } - // 输出制表符 - else if character == '\t' { - if is_put_to_window { - let char = TextuiCharChromatic::new(Some(' '), frcolor, bkcolor); - - //打印的空格数(注意将每行分成一个个表格,每个表格为8个字符) - let mut space_to_print = 8 - NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst) % 8; - while space_to_print > 0 { - char.no_init_textui_render_chromatic( - LineId::new(NO_ALLOC_OPERATIONS_LINE.load(Ordering::SeqCst)), - LineIndex::new(NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst)), - ); - NO_ALLOC_OPERATIONS_INDEX.fetch_add(1, Ordering::SeqCst); - space_to_print -= 1; - } - return Ok(()); - } - } - // 字符 '\x08' 代表 ASCII 码中的退格字符。它在输出中的作用是将光标向左移动一个位置,并在该位置上输出后续的字符,从而实现字符的删除或替换。 - else if character == '\x08' { - if is_put_to_window { - NO_ALLOC_OPERATIONS_INDEX.fetch_sub(1, Ordering::SeqCst); - let op_char = NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst); - if op_char >= 0 { - let char = TextuiCharChromatic::new(Some(' '), frcolor, bkcolor); - char.no_init_textui_render_chromatic( - LineId::new(NO_ALLOC_OPERATIONS_LINE.load(Ordering::SeqCst)), - LineIndex::new(NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst)), - ); - - NO_ALLOC_OPERATIONS_INDEX.fetch_add(1, Ordering::SeqCst); - } - // 需要向上缩一行 - if op_char < 0 { - // 上缩一行 - NO_ALLOC_OPERATIONS_INDEX.store(0, Ordering::SeqCst); - NO_ALLOC_OPERATIONS_LINE.fetch_sub(1, Ordering::SeqCst); - - if NO_ALLOC_OPERATIONS_LINE.load(Ordering::SeqCst) < 0 { - NO_ALLOC_OPERATIONS_LINE.store(0, Ordering::SeqCst); + if is_put_to_window { + match character { + // 进行换行操作 + '\n' => { + send_to_default_serial8250_port(&[b'\r']); + if is_put_to_window { + next_line(); } } - } - } else if is_put_to_window { - // 输出其他字符 - let char = TextuiCharChromatic::new(Some(character), frcolor, bkcolor); + // 输出制表符 + '\t' => { + let char = TextuiCharChromatic::new(Some(' '), frcolor, bkcolor); + //打印的空格数(注意将每行分成一个个表格,每个表格为8个字符) + let mut space_to_print = 8 - NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst) % 8; + while space_to_print > 0 { + char.no_init_textui_render_chromatic( + LineId::new(NO_ALLOC_OPERATIONS_LINE.load(Ordering::SeqCst)), + LineIndex::new(NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst)), + ); + NO_ALLOC_OPERATIONS_INDEX.fetch_add(1, Ordering::SeqCst); + space_to_print -= 1; + } + } + // 字符 '\x08' 代表 ASCII 码中的退格字符。它在输出中的作用是将光标向左移动一个位置,并在该位置上输出后续的字符,从而实现字符的删除或替换。 + '\x08' => { + NO_ALLOC_OPERATIONS_INDEX.fetch_sub(1, Ordering::SeqCst); + let op_char = NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst); + if op_char >= 0 { + let char = TextuiCharChromatic::new(Some(' '), frcolor, bkcolor); + char.no_init_textui_render_chromatic( + LineId::new(NO_ALLOC_OPERATIONS_LINE.load(Ordering::SeqCst)), + LineIndex::new(NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst)), + ); - if NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst) == CHAR_PER_LINE.load(Ordering::SeqCst) - { - NO_ALLOC_OPERATIONS_INDEX.store(0, Ordering::SeqCst); - NO_ALLOC_OPERATIONS_LINE.fetch_add(1, Ordering::SeqCst); - } - char.no_init_textui_render_chromatic( - LineId::new(NO_ALLOC_OPERATIONS_LINE.load(Ordering::SeqCst)), - LineIndex::new(NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst)), - ); + NO_ALLOC_OPERATIONS_INDEX.fetch_add(1, Ordering::SeqCst); + } + // 需要向上缩一行 + if op_char < 0 { + // 上缩一行 + NO_ALLOC_OPERATIONS_INDEX.store(0, Ordering::SeqCst); + NO_ALLOC_OPERATIONS_LINE.fetch_sub(1, Ordering::SeqCst); - NO_ALLOC_OPERATIONS_INDEX.fetch_add(1, Ordering::SeqCst); + if NO_ALLOC_OPERATIONS_LINE.load(Ordering::SeqCst) < 0 { + NO_ALLOC_OPERATIONS_LINE.store(0, Ordering::SeqCst); + } + } + } + // 输出其他字符 + _ => { + let char = TextuiCharChromatic::new(Some(character), frcolor, bkcolor); + + if NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst) + == CHAR_PER_LINE.load(Ordering::SeqCst) + { + next_line(); + } + + char.no_init_textui_render_chromatic( + LineId::new(NO_ALLOC_OPERATIONS_LINE.load(Ordering::SeqCst)), + LineIndex::new(NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst)), + ); + + NO_ALLOC_OPERATIONS_INDEX.fetch_add(1, Ordering::SeqCst); + } + } } - return Ok(()); }