49 lines
1.1 KiB
Rust
49 lines
1.1 KiB
Rust
use std::io::Read;
|
|
use std::fs::File;
|
|
use ijvm::Result;
|
|
use ijvm::binread::BinReadable;
|
|
|
|
pub struct IJVMReader {
|
|
pointer: usize,
|
|
source: Vec<u8>
|
|
}
|
|
|
|
impl IJVMReader {
|
|
pub fn new(path: &str) -> Result<IJVMReader> {
|
|
let file = match File::open(path) {
|
|
Ok(file) => file,
|
|
Err(_) => return Err("Could not open file"),
|
|
};
|
|
let abc: Vec<u8> = file.bytes().map(|e| e.unwrap()).collect();
|
|
Ok(IJVMReader {
|
|
pointer: 0,
|
|
source: abc
|
|
})
|
|
}
|
|
}
|
|
|
|
impl BinReadable for IJVMReader {
|
|
fn get(&mut self) -> Result<u8> {
|
|
if self.pointer >= self.source.len() {
|
|
return Err("EOF reached")
|
|
}
|
|
let byte = self.source[self.pointer];
|
|
self.pointer += 1;
|
|
return Ok(byte)
|
|
}
|
|
|
|
fn len(&self) -> usize {
|
|
return self.source.len()
|
|
}
|
|
|
|
fn cur(&self) -> usize {
|
|
return self.pointer;
|
|
}
|
|
|
|
fn slice(&mut self, len: usize) -> &[u8] {
|
|
let slice = &self.source[self.pointer..self.pointer+len];
|
|
self.pointer += len;
|
|
slice
|
|
}
|
|
}
|