diff --git a/src/vcd/parse.rs b/src/vcd/parse.rs index 4a5e3b0..ef2ec61 100644 --- a/src/vcd/parse.rs +++ b/src/vcd/parse.rs @@ -11,7 +11,7 @@ mod scopes; mod events; -pub fn parse_vcd(file: File) -> Result { +pub fn parse_vcd(file: impl std::io::Read) -> Result { let mut word_gen = super::reader::WordReader::new(file); let header = metadata::parse_metadata(&mut word_gen)?; diff --git a/src/vcd/parse/combinator_atoms.rs b/src/vcd/parse/combinator_atoms.rs index 0473f63..c599f71 100644 --- a/src/vcd/parse/combinator_atoms.rs +++ b/src/vcd/parse/combinator_atoms.rs @@ -69,7 +69,10 @@ pub(super) fn tag<'a>(word: &'a str, pattern: &'a str) -> ParseResult<'a> { }; } -pub(super) fn ident(word_reader: &mut WordReader, keyword: &str) -> Result<(), String> { +pub(super) fn ident( + word_reader: &mut WordReader, + keyword: &str, +) -> Result<(), String> { // let keyword = "module"; let (word, cursor) = next_word!(word_reader)?; diff --git a/src/vcd/parse/events.rs b/src/vcd/parse/events.rs index 49bff94..2246d15 100644 --- a/src/vcd/parse/events.rs +++ b/src/vcd/parse/events.rs @@ -12,8 +12,8 @@ use super::super::reader::{WordReader, Cursor, Line, Word, next_word}; use super::super::types::{SignalIdx, VCD}; -pub(super) fn parse_events<'a>( - word_reader: &mut WordReader, +pub(super) fn parse_events<'a, R: std::io::Read>( + word_reader: &mut WordReader, vcd: &'a mut VCD, signal_map: &mut HashMap, ) -> Result<(), String> { diff --git a/src/vcd/parse/metadata.rs b/src/vcd/parse/metadata.rs index 6d0fffc..b908403 100644 --- a/src/vcd/parse/metadata.rs +++ b/src/vcd/parse/metadata.rs @@ -145,7 +145,7 @@ pub(super) fn parse_date( )) } -pub(super) fn parse_version(word_reader: &mut WordReader) -> Result { +pub(super) fn parse_version(word_reader: &mut WordReader) -> Result { let mut version = String::new(); loop { @@ -162,8 +162,8 @@ pub(super) fn parse_version(word_reader: &mut WordReader) -> Result( + word_reader: &mut WordReader, ) -> Result<(Option, Timescale), String> { // we might see `1ps $end` or `1 ps $end` // first get timescale @@ -220,7 +220,7 @@ pub(super) fn parse_timescale( return Ok(timescale); } -pub(super) fn parse_metadata(word_reader: &mut WordReader) -> Result { +pub(super) fn parse_metadata(word_reader: &mut WordReader) -> Result { let mut metadata = Metadata { date: None, version: None, diff --git a/src/vcd/parse/scopes.rs b/src/vcd/parse/scopes.rs index cb193cf..00a087e 100644 --- a/src/vcd/parse/scopes.rs +++ b/src/vcd/parse/scopes.rs @@ -15,8 +15,8 @@ use super::super::signal::{SigType, SignalEnum}; use super::combinator_atoms::{tag, ident}; use super::types::{ParseResult}; -pub(super) fn parse_var<'a>( - word_reader: &mut WordReader, +pub(super) fn parse_var<'a, R: std::io::Read>( + word_reader: &mut WordReader, parent_scope_idx: ScopeIdx, vcd: &'a mut VCD, signal_map: &mut HashMap, @@ -157,8 +157,8 @@ pub(super) fn parse_var<'a>( /// Sometimes, variables can be listed outside of scopes. /// We call these orphaned vars. -fn parse_orphaned_vars<'a>( - word_reader: &mut WordReader, +fn parse_orphaned_vars<'a, R: std::io::Read>( + word_reader: &mut WordReader, vcd: &'a mut VCD, signal_map: &mut HashMap, ) -> Result<(), String> { @@ -221,8 +221,8 @@ fn parse_orphaned_vars<'a>( Ok(()) } -fn parse_scopes_inner<'a>( - word_reader: &mut WordReader, +fn parse_scopes_inner<'a, R: std::io::Read>( + word_reader: &mut WordReader, parent_scope_idx: Option, vcd: &'a mut VCD, signal_map: &mut HashMap, @@ -328,8 +328,8 @@ fn parse_scopes_inner<'a>( Ok(()) } -pub(super) fn parse_scopes<'a>( - word_reader: &mut WordReader, +pub(super) fn parse_scopes<'a, R: std::io::Read>( + word_reader: &mut WordReader, vcd: &'a mut VCD, signal_map: &mut HashMap, ) -> Result<(), String> { diff --git a/src/vcd/reader.rs b/src/vcd/reader.rs index 9fc32ec..6ef242f 100644 --- a/src/vcd/reader.rs +++ b/src/vcd/reader.rs @@ -3,7 +3,6 @@ // and the YEHOWSHUA license, both of which can be found at // the root of the folder containing the sources for this program. use std::collections::VecDeque; -use std::fs::File; use std::io; use std::io::BufRead; use std::slice; @@ -16,8 +15,8 @@ pub(super) struct Word(pub(super) usize); #[derive(Debug, Clone)] pub(super) struct Cursor(pub(super) Line, pub(super) Word); -pub(super) struct WordReader { - reader: io::BufReader, +pub(super) struct WordReader { + reader: io::BufReader, eof: bool, buffers: Vec, curr_line: usize, @@ -25,11 +24,11 @@ pub(super) struct WordReader { curr_slice: Option<(*const u8, usize, Cursor)>, } -impl WordReader { - pub(super) fn new(file: File) -> WordReader { +impl WordReader { + pub(super) fn new(file: R) -> WordReader { let reader = io::BufReader::new(file); WordReader { - reader: reader, + reader, eof: false, buffers: vec![], curr_line: 0,