[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 02/11] Keep track of position in getline()
[Thread Prev] | [Thread Next]
- Subject: [PATCH 02/11] Keep track of position in getline()
- From: Rory Dudley <rory@xxxxxxx>
- Reply-to: rory@xxxxxxx
- Date: Mon, 30 Sep 2024 21:55:33 -0600
- To: lore@xxxxxxxxxxxx
Keep track of the cursor position in getline(), this way it is not possible to backspace the prompt. --- src/buffer.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) 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); } -- 2.46.2
[PATCH 00/11] Add filepath autcomplete | Rory Dudley <rory@xxxxxxx> |