Skip to content

Commit 3b9ce8c

Browse files
committed
Echo entire buffer (if valid UTF8) rather than individual chars.
Means that multi-byte UTF8 input (like £) are now echoed correctly.
1 parent b8131e3 commit 3b9ce8c

File tree

1 file changed

+19
-5
lines changed

1 file changed

+19
-5
lines changed

src/lib.rs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,14 @@ where
6565
used: 0,
6666
context,
6767
};
68-
r.prompt();
68+
r.prompt(true);
6969
r
7070
}
7171

72-
pub fn prompt(&mut self) {
73-
write!(self.context, "\n").unwrap();
72+
pub fn prompt(&mut self, newline: bool) {
73+
if newline {
74+
write!(self.context, "\n").unwrap();
75+
}
7476
if self.depth != 0 {
7577
let mut depth = 1;
7678
while depth <= self.depth {
@@ -156,7 +158,19 @@ where
156158
} else if self.used < self.buffer.len() {
157159
self.buffer[self.used] = input;
158160
self.used += 1;
159-
write!(self.context, "{}", input as char).unwrap();
161+
162+
let valid = if let Ok(_) = core::str::from_utf8(&self.buffer[0..self.used]) {
163+
true
164+
} else {
165+
false
166+
};
167+
if valid {
168+
write!(self.context, "\r").unwrap();
169+
self.prompt(false);
170+
}
171+
if let Ok(s) = core::str::from_utf8(&self.buffer[0..self.used]) {
172+
write!(self.context, "{}", s).unwrap();
173+
}
160174
Outcome::NeedMore
161175
} else {
162176
writeln!(self.context, "Buffer overflow!").unwrap();
@@ -165,7 +179,7 @@ where
165179
match outcome {
166180
Outcome::CommandProcessed => {
167181
self.used = 0;
168-
self.prompt();
182+
self.prompt(true);
169183
}
170184
Outcome::NeedMore => {}
171185
}

0 commit comments

Comments
 (0)