aboutsummaryrefslogtreecommitdiffstats
path: root/src/input.rs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2021-03-13 14:15:39 -0500
committerJesse Luehrs <doy@tozt.net>2021-03-13 14:15:39 -0500
commit2fb5b204d83a3da79dc743fed25f9cad81367a13 (patch)
treed4dfd5a87568ed57b2987cd2da2c28ce8ce3ef25 /src/input.rs
parent88cce3303b5b0e0c69604c6d6d9ac603f083a540 (diff)
downloadtextmode-2fb5b204d83a3da79dc743fed25f9cad81367a13.tar.gz
textmode-2fb5b204d83a3da79dc743fed25f9cad81367a13.zip
fix a bunch of utf8 parsing issues
Diffstat (limited to 'src/input.rs')
-rw-r--r--src/input.rs27
1 files changed, 12 insertions, 15 deletions
diff --git a/src/input.rs b/src/input.rs
index e34187e..abcdd7f 100644
--- a/src/input.rs
+++ b/src/input.rs
@@ -192,24 +192,22 @@ impl Input {
}
async fn fill_buf(&mut self) -> Result<bool> {
- if !self.buf_is_empty() {
- return Ok(true);
- }
-
- self.buf.resize(4096, 0);
- self.pos = 0;
- let bytes = read_stdin(&mut self.stdin, &mut self.buf).await?;
- if bytes == 0 {
- return Ok(false);
+ if self.buf_is_empty() {
+ self.buf.resize(4096, 0);
+ self.pos = 0;
+ let bytes = read_stdin(&mut self.stdin, &mut self.buf).await?;
+ if bytes == 0 {
+ return Ok(false);
+ }
+ self.buf.truncate(bytes);
}
- self.buf.truncate(bytes);
if self.parse_utf8 {
- let mut extra = self.find_truncated_utf8();
- if extra > 0 {
+ let expected_bytes = self.expected_leading_utf8_bytes();
+ if self.buf.len() < self.pos + expected_bytes {
let mut cur = self.buf.len();
- self.buf.resize(4096 + extra, 0);
- while extra > 0 {
+ self.buf.resize(4096 + expected_bytes, 0);
+ while cur < self.pos + expected_bytes {
let bytes =
read_stdin(&mut self.stdin, &mut self.buf[cur..])
.await?;
@@ -217,7 +215,6 @@ impl Input {
return Ok(false);
}
cur += bytes;
- extra = extra.saturating_sub(bytes);
}
self.buf.truncate(cur);
}