cbvm/reader/
mod.rs

1use crate::{
2    builder::bytes,
3    builder::bytes::*,
4    byte,
5    bytecode::{
6        data::ByteData,
7        ops::ArgType::*,
8        ops::Operations::*,
9        ops::*,
10        types::Types::{self, *},
11    },
12    constant, emits,
13    engine::memory::Heap,
14    op, stream, typed,
15};
16use std::{fs::File, io::Read};
17
18
19
20pub struct Reader {
21    pos: usize,
22    file: File,
23    pub stream: Vec<u8>,
24    pub bytes: ByteStream,
25}
26
27impl Reader {
28    pub fn new(path: &str) -> Reader {
29        Reader {
30            pos: 0,
31            file: File::open(path).unwrap(),
32            stream: Vec::new(),
33            bytes: ByteStream::new(),
34        }
35    }
36    pub fn new_read(data: &Vec<u8>) -> Reader {
37        Reader {
38            pos: 0,
39            file: File::open("temp").unwrap_or(File::create("temp").unwrap()),
40            stream: data.clone(),
41            bytes: ByteStream::new(),
42        }
43    }
44    pub fn read(&mut self) -> () {
45        let mut data = Vec::new();
46        self.file.read_to_end(&mut data).unwrap();
47        self.stream = data;
48    }
49    pub fn group(&mut self) -> ByteStream {
50        while self.pos < self.stream.len() {
51            self.handle(self.stream[self.pos]);
52            self.pos += 1;
53        }
54        self.bytes.clone()
55    }
56    //function to handle a number, take the number of arguments from the contant in ops and add to bytestream
57    fn handle(&mut self, n: u8) {
58        let tp = Types::from(n);
59        self.next();
60        let arg = self.view() as u64;
61        let byte = Byte{
62            data: Box::new(arg),
63            pos: 0,
64            tp: tp,
65        };
66        self.bytes.emit(byte);
67    }
68    //functions to view current item in data, next, and increase counter of position
69    fn view(&self) -> u8 {
70        self.stream[self.pos]
71    }
72    fn next(&mut self) {
73        if self.pos + 1 >= self.stream.len() {
74            return;
75        }
76        self.pos += 1;
77    }
78    fn peek(&self) -> u8 {
79        self.stream[self.pos + 1]
80    }
81}