From c36c62385b0f5269bafc137c1dd6d21ad75c2402 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Wed, 28 Sep 2016 15:17:37 -0600 Subject: [PATCH] Improvements for cooked mode --- drivers/vesad/src/main.rs | 32 +++++++++++++++++++++++++------- programs/login/src/main.rs | 2 +- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/drivers/vesad/src/main.rs b/drivers/vesad/src/main.rs index 88eafcf..31cb84c 100644 --- a/drivers/vesad/src/main.rs +++ b/drivers/vesad/src/main.rs @@ -27,6 +27,7 @@ struct DisplayScheme { console: RefCell, display: RefCell, input: RefCell>, + cooked: RefCell>, requested: RefCell } @@ -65,13 +66,29 @@ impl Scheme for DisplayScheme { fn write(&self, id: usize, buf: &[u8]) -> Result { if id == 1 { - for &b in buf.iter() { - self.input.borrow_mut().push_back(b); - if ! self.console.borrow().raw_mode { - if b == 0x7F { - self.write(0, b"\x08")?; - } else { - self.write(0, &[b])?; + if self.console.borrow().raw_mode { + for &b in buf.iter() { + self.input.borrow_mut().push_back(b); + } + } else { + for &b in buf.iter() { + match b { + b'\x08' | b'\x7F' => { + if let Some(c) = self.cooked.borrow_mut().pop_back() { + self.write(0, b"\x08")?; + } + }, + b'\n' | b'\r' => { + self.cooked.borrow_mut().push_back(b); + while let Some(c) = self.cooked.borrow_mut().pop_front() { + self.input.borrow_mut().push_back(c); + } + self.write(0, b"\n")?; + }, + _ => { + self.cooked.borrow_mut().push_back(b); + self.write(0, &[b])?; + } } } } @@ -135,6 +152,7 @@ fn main() { unsafe { slice::from_raw_parts_mut(offscreen as *mut u32, size) } )), input: RefCell::new(VecDeque::new()), + cooked: RefCell::new(VecDeque::new()), requested: RefCell::new(0) }; diff --git a/programs/login/src/main.rs b/programs/login/src/main.rs index 5b7fd98..b38dd7d 100644 --- a/programs/login/src/main.rs +++ b/programs/login/src/main.rs @@ -51,7 +51,7 @@ pub fn main() { println!(""); - print!("hash: '{}' ", password); + print!("hash: {}: '{}' ", user, password); for b in output.iter() { print!("{:X} ", b); }