flexpiler/common/reader/
buf_reader.rs

1// std
2use std::fs::File;
3
4// use internal
5use crate::reader;
6
7
8pub struct BufReader {
9    buf_pointer: usize,
10    buf_len: usize,
11    buffer: [u8; 256],
12
13    buf_reader: std::io::BufReader<File>,
14}
15
16
17impl BufReader {
18    pub fn from_buf_reader(buf_reader: std::io::BufReader<File>) -> BufReader
19    {
20        BufReader {
21            buf_len: 0,
22            buf_pointer: 0,
23            buffer: [0; 256],
24
25            buf_reader,
26        }
27    }
28}
29
30
31impl From<std::io::BufReader<File>> for BufReader {
32    fn from(std_buf_reader: std::io::BufReader<File>) -> Self {
33        return Self::from_buf_reader(std_buf_reader);
34    }
35}
36
37impl reader::Trait for BufReader {
38    fn read(&mut self) -> reader::Result {
39        use std::io::Read;
40
41        if self.buf_pointer >= self.buf_len {
42            let result = self.buf_reader.read(&mut self.buffer);
43
44            match result {
45                Ok(len) => {
46                    if len == 0 {
47                        return reader::Result::EndOfFile;
48                    }
49                    self.buf_len = len;
50                    self.buf_pointer = 0;
51                },
52                Err(error) => {
53                    return reader::Result::Err(
54                        reader::Error::StdIoError(error)
55                    );
56                }
57            }
58        }
59
60        let byte = self.buffer[self.buf_pointer];
61        self.buf_pointer += 1;
62
63        print!("<{}, {}>", byte, byte as char);
64        return reader::Result::Ok(byte);
65    }
66}