diff options
| author | bors <bors@rust-lang.org> | 2015-09-04 08:50:56 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-09-04 08:50:56 +0000 |
| commit | b4de424e4175eefb4fda6e3ed634acfab3ec0daf (patch) | |
| tree | 64071602a54a1c9ad7699862ace3d11667dd422a /src/libstd | |
| parent | 9d1f8200e70ade40c12a095c763041bd4cfa9f21 (diff) | |
| parent | 48615a68fb01d09749a5b73816d45e0d0669d1f9 (diff) | |
| download | rust-b4de424e4175eefb4fda6e3ed634acfab3ec0daf.tar.gz rust-b4de424e4175eefb4fda6e3ed634acfab3ec0daf.zip | |
Auto merge of #28034 - alexcrichton:new-lines, r=aturon
This commit is an implementation of [RFC 1212][rfc] which tweaks the behavior of
the `str::lines` and `BufRead::lines` iterators. Both iterators now account for
`\r\n` sequences in addition to `\n`, allowing for less surprising behavior
across platforms (especially in the `BufRead` case). Splitting *only* on the
`\n` character can still be achieved with `split('\n')` in both cases.
The `str::lines_any` function is also now deprecated as `str::lines` is a
drop-in replacement for it.
[rfc]: https://github.com/rust-lang/rfcs/blob/master/text/1212-line-endings.md
Closes #28032
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/io/mod.rs | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/libstd/io/mod.rs b/src/libstd/io/mod.rs index 72a74c23dc8..54869807cac 100644 --- a/src/libstd/io/mod.rs +++ b/src/libstd/io/mod.rs @@ -1439,7 +1439,7 @@ pub trait BufRead: Read { /// /// The iterator returned from this function will yield instances of /// `io::Result<String>`. Each string returned will *not* have a newline - /// byte (the 0xA byte) at the end. + /// byte (the 0xA byte) or CRLF (0xD, 0xA bytes) at the end. /// /// # Examples /// @@ -1763,6 +1763,9 @@ impl<B: BufRead> Iterator for Lines<B> { Ok(_n) => { if buf.ends_with("\n") { buf.pop(); + if buf.ends_with("\r") { + buf.pop(); + } } Some(Ok(buf)) } @@ -1834,12 +1837,12 @@ mod tests { #[test] fn lines() { - let buf = Cursor::new(&b"12"[..]); + let buf = Cursor::new(&b"12\r"[..]); let mut s = buf.lines(); - assert_eq!(s.next().unwrap().unwrap(), "12".to_string()); + assert_eq!(s.next().unwrap().unwrap(), "12\r".to_string()); assert!(s.next().is_none()); - let buf = Cursor::new(&b"12\n\n"[..]); + let buf = Cursor::new(&b"12\r\n\n"[..]); let mut s = buf.lines(); assert_eq!(s.next().unwrap().unwrap(), "12".to_string()); assert_eq!(s.next().unwrap().unwrap(), "".to_string()); |
