60 lines
1.3 KiB
Rust
60 lines
1.3 KiB
Rust
use std::io::Read;
|
|
use std::fs::File;
|
|
use Result;
|
|
use 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
|
|
})
|
|
}
|
|
|
|
pub fn new_from_slice(source: &[u8]) -> IJVMReader {
|
|
IJVMReader {
|
|
pointer: 0,
|
|
source: source.to_vec(),
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
Ok(byte)
|
|
}
|
|
|
|
fn cur(&self) -> usize {
|
|
self.pointer
|
|
}
|
|
|
|
fn len(&self) -> usize {
|
|
self.source.len()
|
|
}
|
|
|
|
fn slice(&mut self, len: usize) -> &[u8] {
|
|
let slice = &self.source[self.pointer..self.pointer+len];
|
|
self.pointer += len;
|
|
slice
|
|
}
|
|
|
|
fn is_empty(&self) -> bool {
|
|
self.source.is_empty()
|
|
}
|
|
}
|