pub fn normalize_eol(bytes: &[u8]) -> Vec<u8> {
let mut out = Vec::with_capacity(bytes.len());
let mut i = 0;
while i < bytes.len() {
if bytes[i] == b'\r' {
out.push(b'\n');
if bytes.get(i + 1) == Some(&b'\n') {
i += 1;
}
} else {
out.push(bytes[i]);
}
i += 1;
}
out
}
pub fn eol_eq(a: &[u8], b: &[u8]) -> bool {
normalize_eol(a) == normalize_eol(b)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn normalize_eol_converts_crlf_to_lf() {
assert_eq!(normalize_eol(b"a\r\nb\r\n"), b"a\nb\n");
}
#[test]
fn normalize_eol_converts_lone_cr_to_lf() {
assert_eq!(normalize_eol(b"a\rb\r"), b"a\nb\n");
}
#[test]
fn normalize_eol_handles_mixed_endings() {
assert_eq!(normalize_eol(b"a\r\nb\rc\nd"), b"a\nb\nc\nd");
}
#[test]
fn normalize_eol_is_noop_for_lf_only() {
let input = b"a\nb\nc";
assert_eq!(normalize_eol(input), input);
}
#[test]
fn eol_eq_ignores_line_ending_style() {
assert!(eol_eq(b"a\r\nb\r\n", b"a\nb\n"));
assert!(eol_eq(b"a\rb", b"a\nb"));
assert!(!eol_eq(b"a\r\nb", b"a\r\nc"));
}
}