diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buffer.rs | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/buffer.rs b/src/buffer.rs index 48e2d85..eedb694 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -24,6 +24,10 @@ fn getchar() -> u8 { /// that (ICANON and ECHO) are off. See the beginning of [crate::repl] /// for more details. pub fn getline(buffer: &mut Arc<Mutex<Vec<u8>>>) -> usize { + // Keep track of position for backspaces + let mut pos: usize = 0; + + // Loop over characters until there is a newline loop { let c = getchar(); match c { @@ -32,6 +36,7 @@ pub fn getline(buffer: &mut Arc<Mutex<Vec<u8>>>) -> usize { // tab b'\t' => { + pos += 1; print!(" "); buffer.lock().unwrap().push(b' '); } @@ -41,12 +46,17 @@ pub fn getline(buffer: &mut Arc<Mutex<Vec<u8>>>) -> usize { // backspace 127 => { + if pos == 0 { + continue; + } + pos -= 1; buffer.lock().unwrap().pop(); print!("\u{8} \u{8}"); } // everything else _ => { + pos += 1; print!("{}", c as char); buffer.lock().unwrap().push(c); } |