parent
0edf5e44d6
commit
f44a998fe8
@ -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,
|
||||
};
|
||||
}
|
||||
|
@ -0,0 +1,70 @@
|
||||
use std::{
|
||||
io::{
|
||||
Read,
|
||||
},
|
||||
};
|
||||
use heaparray::{
|
||||
heap,
|
||||
};
|
||||
|
||||
pub struct BufferedReadIter<F>
|
||||
where F: Read
|
||||
{
|
||||
iter: F,
|
||||
buffer: Box<[u8]>,
|
||||
buffer_len: usize,
|
||||
buffer_push: usize,
|
||||
}
|
||||
|
||||
impl<F: Read> Iterator for BufferedReadIter<F>
|
||||
{
|
||||
type Item = u8;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item>
|
||||
{
|
||||
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<F: Read> BufferedReadIter<F>
|
||||
{
|
||||
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<Self>
|
||||
{
|
||||
BufferedReadIter::new(self, buffer_len)
|
||||
}
|
||||
}
|
||||
impl<T: Read> ReadIterExt for T{}
|
||||
|
@ -0,0 +1,2 @@
|
||||
mod sanitise;
|
||||
pub use sanitise::*;
|
@ -0,0 +1,22 @@
|
||||
/// Escape text for insertion.
|
||||
pub fn c_escape<T>(input: T) -> String
|
||||
where T: AsRef<str>
|
||||
{
|
||||
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()
|
||||
}
|
Loading…
Reference in new issue