From f44a998fe846b85f299970e23d4b51a1f08ba559 Mon Sep 17 00:00:00 2001 From: Avril Date: Mon, 25 May 2020 06:37:55 +0100 Subject: [PATCH] file to c iters ok --- .gitignore | 1 + generator-native/src/iter/file.rs | 58 +++++------------- generator-native/src/iter/mod.rs | 5 +- generator-native/src/iter/read.rs | 70 ++++++++++++++++++++++ generator-native/src/main.rs | 19 ++++-- generator-native/src/translate/mod.rs | 2 + generator-native/src/translate/sanitise.rs | 22 +++++++ 7 files changed, 128 insertions(+), 49 deletions(-) create mode 100644 generator-native/src/iter/read.rs create mode 100644 generator-native/src/translate/mod.rs create mode 100644 generator-native/src/translate/sanitise.rs diff --git a/.gitignore b/.gitignore index cc39b48..ddd9d5f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ bin/ obj/ sha256_literal/ **/target/ +test.txt diff --git a/generator-native/src/iter/file.rs b/generator-native/src/iter/file.rs index bcd5332..83fdf49 100644 --- a/generator-native/src/iter/file.rs +++ b/generator-native/src/iter/file.rs @@ -3,36 +3,23 @@ use std::{ Read, }, }; -use heaparray::{ - heap, -}; -pub struct BufferedReadIter -where F: Read -{ - iter: F, - buffer: Box<[u8]>, - buffer_len: usize, -} +pub struct ByteIter + (F, [u8; 1]); -impl Iterator for BufferedReadIter +impl Iterator for ByteIter +where T: Read { - type Item = Box<[u8]>; + type Item = u8; fn next(&mut self) -> Option { - if self.buffer_len >= self.buffer.len() { - // Buffer is full. - return Some(self.swap_out()); - } - - if let Ok(read) = self.iter.read(&mut self.buffer[self.buffer_len..]) + if let Ok(read) = self.0.read(&mut self.1[..]) { - self.buffer_len += read; - if self.buffer_len ==0 { + if read < 1 { None } else { - Some(self.swap_out()) + Some(self.1[0]) } } else { None @@ -40,32 +27,19 @@ impl Iterator for BufferedReadIter } } -impl BufferedReadIter +impl ByteIter +where T: Read { - fn swap_out(&mut self) -> Box<[u8]> - { - let len = self.buffer_len; - self.buffer_len=0; - - heaparray::box_slice(&mut self.buffer[..len]) - } - - pub fn new(iter: F, buffer_len: usize) -> Self { - let buffer = heap![u8; buffer_len].into_box(); - Self { - iter, - buffer_len: 0, - buffer, - } + fn new(stream: T) -> Self { + Self(stream, [0u8; 1]) } } -pub trait ReadIterExt: Read + Sized +pub trait ByteIterExt: Read + Sized { - fn into_iter(self, buffer_len: usize) -> BufferedReadIter + fn into_byte_iter(self) -> ByteIter { - BufferedReadIter::new(self, buffer_len) + ByteIter::new(self) } } -impl ReadIterExt for T{} - +impl ByteIterExt for T{} diff --git a/generator-native/src/iter/mod.rs b/generator-native/src/iter/mod.rs index f043b64..fbbc9b5 100644 --- a/generator-native/src/iter/mod.rs +++ b/generator-native/src/iter/mod.rs @@ -1,12 +1,15 @@ mod group; pub use group::*; +mod read; +pub use read::*; + mod file; pub use file::*; pub mod prelude { pub use super::{ - ReadIterExt, GroupExt, + ReadIterExt, GroupExt, ByteIterExt, }; } diff --git a/generator-native/src/iter/read.rs b/generator-native/src/iter/read.rs new file mode 100644 index 0000000..338c0f5 --- /dev/null +++ b/generator-native/src/iter/read.rs @@ -0,0 +1,70 @@ +use std::{ + io::{ + Read, + }, +}; +use heaparray::{ + heap, +}; + +pub struct BufferedReadIter +where F: Read +{ + iter: F, + buffer: Box<[u8]>, + buffer_len: usize, + buffer_push: usize, +} + +impl Iterator for BufferedReadIter +{ + type Item = u8; + + fn next(&mut self) -> Option + { + if self.buffer_len > 0 { + let output = self.buffer[self.buffer_push]; + self.buffer_push += 1; + self.buffer_len -= 1; + + return Some(output); + } + self.buffer_push = 0; + + + if let Ok(read) = self.iter.read(&mut self.buffer[self.buffer_len..]) + { + self.buffer_len += read; + if self.buffer_len == 0 { + None + } else { + self.next() + } + } else { + None + } + } +} + +impl BufferedReadIter +{ + pub fn new(iter: F, buffer_len: usize) -> Self { + let buffer = heap![u8; buffer_len].into_box(); + Self { + iter, + buffer_len: 0, + buffer_push: 0, + buffer, + } + } +} + +pub trait ReadIterExt: Read + Sized +{ + fn into_iter(self, buffer_len: usize) -> BufferedReadIter + { + BufferedReadIter::new(self, buffer_len) + } +} +impl ReadIterExt for T{} + diff --git a/generator-native/src/main.rs b/generator-native/src/main.rs index 0ebb035..02d4a1a 100644 --- a/generator-native/src/main.rs +++ b/generator-native/src/main.rs @@ -1,3 +1,5 @@ +#![allow(dead_code)] + extern crate heaparray; use std::{ @@ -11,18 +13,23 @@ use std::{ mod iter; use iter::prelude::*; +mod translate; + fn main() -> Result<(), Box>{ - /*let file = OpenOptions::new() + let file = OpenOptions::new() .read(true) .open("test.txt")?; - for buf in file.into_iter(2).group_at(2) + println!("{{"); + for buf in file.into_iter(4) + .map(|byte| format!("0x{:02x},", byte)) + .group_at(4) + .map(|strs| format!("\t{}", strs.join(" "))) { - println!("{:?}", buf); -}*/ - - + println!("{}", buf); + } + println!("}}"); Ok(()) } diff --git a/generator-native/src/translate/mod.rs b/generator-native/src/translate/mod.rs new file mode 100644 index 0000000..18130f9 --- /dev/null +++ b/generator-native/src/translate/mod.rs @@ -0,0 +1,2 @@ +mod sanitise; +pub use sanitise::*; diff --git a/generator-native/src/translate/sanitise.rs b/generator-native/src/translate/sanitise.rs new file mode 100644 index 0000000..45146ed --- /dev/null +++ b/generator-native/src/translate/sanitise.rs @@ -0,0 +1,22 @@ +/// Escape text for insertion. +pub fn c_escape(input: T) -> String + where T: AsRef +{ + let input = input.as_ref(); + let mut chr = Vec::new(); + for c in input.chars() { + match c { + '\\' => { + chr.push('\\'); + chr.push('\\'); + }, + '\"' => { + chr.push('\\'); + chr.push('\"'); + }, + _ => chr.push(c), + }; + } + + chr.into_iter().collect() +}