diff options
Diffstat (limited to 'src/blocking/input.rs')
-rw-r--r-- | src/blocking/input.rs | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/src/blocking/input.rs b/src/blocking/input.rs index b133e7f..7a35f25 100644 --- a/src/blocking/input.rs +++ b/src/blocking/input.rs @@ -180,30 +180,27 @@ impl Input { } 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.buf)?; - 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.buf)?; + 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.buf[cur..])?; if bytes == 0 { return Ok(false); } cur += bytes; - extra = extra.saturating_sub(bytes); } self.buf.truncate(cur); } |