use std::error::Error;
use std::io;
use std::io::prelude::*;
use std::fs::File;
use utf8conv::*;
fn read_bytes_without_interrupt(
read_obj: & mut (impl Read + ?Sized), buf: & mut [u8]) -> io::Result<usize> {
loop {
match read_obj.read(buf) {
Ok(num_bytes) => { return Ok(num_bytes); }
Err(er) => {
if er.kind() != io::ErrorKind::Interrupted {
return Err(er);
}
}
}
}
}
fn real_io_slice(
read_obj: & mut (impl Read + ?Sized), buf: & mut [u8]) -> io::Result<()> {
let mut parser = FromUtf8::new();
loop {
match read_bytes_without_interrupt(read_obj, buf) {
Err(er) => { return Err(er); }
Ok(num_bytes) => {
parser.set_is_last_buffer(num_bytes == 0);
let mut buf_slice = & buf[0 .. num_bytes];
loop {
match parser.utf8_to_char(buf_slice) {
Result::Ok((slice_pos, char_val)) => {
buf_slice = slice_pos;
print!("{}", char_val);
}
Result::Err(MoreEnum::More(amt)) => {
if amt == 0 {
return Ok(());
}
else {
break;
}
}
}
}
}
}
}
}
fn main() -> Result<(), Box<dyn Error>> {
let mut buf: [u8; 128] = [0u8; 128];
let mut f = File::open("examples/real_io_slice.rs") ?;
real_io_slice(& mut f, & mut buf[..]) ?;
Ok(())
}