@@ -601,15 +601,26 @@ fn parse_lines(data: &[u8]) -> Vec<Line> {
601601
602602 for ( i, & byte) in data. iter ( ) . enumerate ( ) {
603603 if byte == b'\n' {
604- let line_data = & data[ start..i] ;
604+ // Handle both Unix (\n) and Windows (\r\n) line endings
605+ let end = if i > 0 && data[ i - 1 ] == b'\r' {
606+ i - 1
607+ } else {
608+ i
609+ } ;
610+ let line_data = & data[ start..end] ;
605611 lines. push ( Line :: new ( line_data) ) ;
606612 start = i + 1 ;
607613 }
608614 }
609615
610616 // Handle last line if it doesn't end with newline
611617 if start < data. len ( ) {
612- let line_data = & data[ start..] ;
618+ let mut end = data. len ( ) ;
619+ // Strip trailing \r if present
620+ if end > start && data[ end - 1 ] == b'\r' {
621+ end -= 1 ;
622+ }
623+ let line_data = & data[ start..end] ;
613624 lines. push ( Line :: new ( line_data) ) ;
614625 }
615626
@@ -899,4 +910,45 @@ mod tests {
899910 assert_eq ! ( parse_int( b"12.34" ) , None ) ; // Not simple
900911 assert_eq ! ( parse_int( b"abc" ) , None ) ; // Not numeric
901912 }
913+
914+ #[ test]
915+ fn test_parse_lines_with_different_endings ( ) {
916+ // Test Unix line endings
917+ let unix_data = b"line1\n line2\n line3" ;
918+ let unix_lines = parse_lines ( unix_data) ;
919+ assert_eq ! ( unix_lines. len( ) , 3 ) ;
920+ unsafe {
921+ assert_eq ! ( unix_lines[ 0 ] . as_bytes( ) , b"line1" ) ;
922+ assert_eq ! ( unix_lines[ 1 ] . as_bytes( ) , b"line2" ) ;
923+ assert_eq ! ( unix_lines[ 2 ] . as_bytes( ) , b"line3" ) ;
924+ }
925+
926+ // Test Windows line endings
927+ let windows_data = b"line1\r \n line2\r \n line3\r \n " ;
928+ let windows_lines = parse_lines ( windows_data) ;
929+ assert_eq ! ( windows_lines. len( ) , 3 ) ;
930+ unsafe {
931+ assert_eq ! ( windows_lines[ 0 ] . as_bytes( ) , b"line1" ) ;
932+ assert_eq ! ( windows_lines[ 1 ] . as_bytes( ) , b"line2" ) ;
933+ assert_eq ! ( windows_lines[ 2 ] . as_bytes( ) , b"line3" ) ;
934+ }
935+
936+ // Test mixed line endings
937+ let mixed_data = b"line1\r \n line2\n line3\r " ;
938+ let mixed_lines = parse_lines ( mixed_data) ;
939+ assert_eq ! ( mixed_lines. len( ) , 3 ) ;
940+ unsafe {
941+ assert_eq ! ( mixed_lines[ 0 ] . as_bytes( ) , b"line1" ) ;
942+ assert_eq ! ( mixed_lines[ 1 ] . as_bytes( ) , b"line2" ) ;
943+ assert_eq ! ( mixed_lines[ 2 ] . as_bytes( ) , b"line3" ) ;
944+ }
945+
946+ // Test single line without ending
947+ let single_data = b"single_line" ;
948+ let single_lines = parse_lines ( single_data) ;
949+ assert_eq ! ( single_lines. len( ) , 1 ) ;
950+ unsafe {
951+ assert_eq ! ( single_lines[ 0 ] . as_bytes( ) , b"single_line" ) ;
952+ }
953+ }
902954}
0 commit comments