parent
0edf5e44d6
commit
f44a998fe8
@ -1,12 +1,15 @@
|
|||||||
mod group;
|
mod group;
|
||||||
pub use group::*;
|
pub use group::*;
|
||||||
|
|
||||||
|
mod read;
|
||||||
|
pub use read::*;
|
||||||
|
|
||||||
mod file;
|
mod file;
|
||||||
pub use file::*;
|
pub use file::*;
|
||||||
|
|
||||||
pub mod prelude
|
pub mod prelude
|
||||||
{
|
{
|
||||||
pub use super::{
|
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