From 10ee2acdd26a7f1298c6f6d6b7af9b469fe29b87 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 4 May 2024 14:41:41 +0200 Subject: Merging upstream version 1.70.0+dfsg2. Signed-off-by: Daniel Baumann --- vendor/normalize-line-endings/src/lib.rs | 82 ++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 vendor/normalize-line-endings/src/lib.rs (limited to 'vendor/normalize-line-endings/src/lib.rs') diff --git a/vendor/normalize-line-endings/src/lib.rs b/vendor/normalize-line-endings/src/lib.rs new file mode 100644 index 000000000..955234a7e --- /dev/null +++ b/vendor/normalize-line-endings/src/lib.rs @@ -0,0 +1,82 @@ +#![warn(missing_docs)] +//! +//! Normalize line endings +//! +//! This crate provides a `normalize` method that takes a char iterator and returns +//! a new one with `\n` for all line endings + +/// This struct wraps a `std::io::Chars` to normalize line endings. +/// +/// Implements `Iterator` so can be used in place +struct Normalized { + iter: I, + prev_was_cr: bool, +} + +/// Take a Chars and return similar struct with normalized line endings +/// +/// # Example +/// ``` +/// use std::iter::FromIterator; +/// use normalize_line_endings::normalized; +/// +/// let input = "This is a string \n with \r some \n\r\n random newlines\r\r\n\n"; +/// assert_eq!( +/// &String::from_iter(normalized(input.chars())), +/// "This is a string \n with \n some \n\n random newlines\n\n\n" +/// ); +/// ``` +#[inline] +pub fn normalized(iter: impl Iterator) -> impl Iterator { + Normalized { + iter, + prev_was_cr: false, + } +} + +impl Iterator for Normalized +where + I: Iterator, +{ + type Item = char; + fn next(&mut self) -> Option { + match self.iter.next() { + Some('\n') if self.prev_was_cr => { + self.prev_was_cr = false; + match self.iter.next() { + Some('\r') => { + self.prev_was_cr = true; + Some('\n') + } + any => { + self.prev_was_cr = false; + any + } + } + } + Some('\r') => { + self.prev_was_cr = true; + Some('\n') + } + any => { + self.prev_was_cr = false; + any + } + } + } +} + +// tests +#[cfg(test)] +mod tests { + use std::iter::FromIterator; + + #[test] + fn normalized() { + let input = "This is a string \n with \r some \n\r\n random newlines\r\r\n\n"; + assert_eq!( + &String::from_iter(super::normalized(input.chars())), + "This is a string \n with \n some \n\n random newlines\n\n\n" + ); + } +} -- cgit v1.2.3