atmos/kernel/
uart_line_buf.rs1pub struct LineBuf {
17 buf: [u8; LINE_BUF_LEN],
18 len: usize,
19 truncated: bool,
20}
21
22pub const LINE_BUF_LEN: usize = 512;
24
25impl LineBuf {
26 pub const fn new() -> Self {
27 Self {
28 buf: [0u8; LINE_BUF_LEN],
29 len: 0,
30 truncated: false,
31 }
32 }
33
34 pub fn as_bytes(&self) -> &[u8] {
35 &self.buf[..self.len]
36 }
37
38 pub fn was_truncated(&self) -> bool {
39 self.truncated
40 }
41
42 pub fn trim_to_char_boundary(&mut self) {
47 self.len = self.len.saturating_sub(3);
49 while self.len > 0 && (self.buf[self.len] & 0xC0) == 0x80 {
51 self.len -= 1;
52 }
53 }
54}
55
56impl Default for LineBuf {
57 fn default() -> Self {
58 Self::new()
59 }
60}
61
62impl core::fmt::Write for LineBuf {
63 fn write_str(&mut self, s: &str) -> core::fmt::Result {
64 let src = s.as_bytes();
65 let room = LINE_BUF_LEN - self.len;
66 if src.len() > room {
67 self.buf[self.len..].copy_from_slice(&src[..room]);
68 self.len = LINE_BUF_LEN;
69 self.truncated = true;
70 return Ok(());
72 }
73 self.buf[self.len..self.len + src.len()].copy_from_slice(src);
74 self.len += src.len();
75 Ok(())
76 }
77}