diff options
author | Rory Dudley | 2024-09-30 21:55:33 -0600 |
---|---|---|
committer | Rory Dudley | 2024-09-30 23:01:44 -0600 |
commit | c51ad81d3cf5998e9eacf655a704ff21d154ae0a (patch) | |
tree | b79e9a7cf0ba5a96d6b3ba6ee60c03dfadf537a3 | |
parent | 350be1b8869ce9d3a572348104c30f804d44641e (diff) | |
download | dwarvish-c51ad81d3cf5998e9eacf655a704ff21d154ae0a.tar.gz |
Keep track of position in getline()
Keep track of the cursor position in getline(), this way it is not
possible to backspace the prompt.
Signed-off-by: Rory Dudley <rory@netc.lu>
-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); } |