Skip to content

Commit c634307

Browse files
committed
---
yaml --- r: 95321 b: refs/heads/dist-snap c: ee1e652 h: refs/heads/master i: 95319: 7271f75 v: v3
1 parent 72d9592 commit c634307

File tree

2 files changed

+66
-8
lines changed

2 files changed

+66
-8
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ refs/heads/try: c274a6888410ce3e357e014568b43310ed787d36
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c
9-
refs/heads/dist-snap: facefa7c8d1adf6c851dca88fcf4f5d26f72caa9
9+
refs/heads/dist-snap: ee1e6529bddc4ea262e6453589a8042e0128594e
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503
1212
refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0

branches/dist-snap/src/libstd/rt/io/buffered.rs

Lines changed: 65 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ use prelude::*;
5555

5656
use num;
5757
use vec;
58+
use str;
5859
use super::{Reader, Writer, Stream, Decorator};
5960

6061
// libuv recommends 64k buffers to maximize throughput
@@ -84,23 +85,69 @@ impl<R: Reader> BufferedReader<R> {
8485
pub fn new(inner: R) -> BufferedReader<R> {
8586
BufferedReader::with_capacity(DEFAULT_CAPACITY, inner)
8687
}
87-
}
8888

89-
impl<R: Reader> Reader for BufferedReader<R> {
90-
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
89+
/// Reads the next line of input, interpreted as a sequence of utf-8
90+
/// encoded unicode codepoints. If a newline is encountered, then the
91+
/// newline is contained in the returned string.
92+
pub fn read_line(&mut self) -> ~str {
93+
str::from_utf8_owned(self.read_until('\n' as u8))
94+
}
95+
96+
/// Reads a sequence of bytes leading up to a specified delimeter. Once the
97+
/// specified byte is encountered, reading ceases and the bytes up to and
98+
/// including the delimiter are returned.
99+
pub fn read_until(&mut self, byte: u8) -> ~[u8] {
100+
let mut res = ~[];
101+
let mut used;
102+
loop {
103+
{
104+
let available = self.fill_buffer();
105+
match available.iter().position(|&b| b == byte) {
106+
Some(i) => {
107+
res.push_all(available.slice_to(i + 1));
108+
used = i + 1;
109+
break
110+
}
111+
None => {
112+
res.push_all(available);
113+
used = available.len();
114+
}
115+
}
116+
}
117+
if used == 0 {
118+
break
119+
}
120+
self.pos += used;
121+
}
122+
self.pos += used;
123+
return res;
124+
}
125+
126+
fn fill_buffer<'a>(&'a mut self) -> &'a [u8] {
91127
if self.pos == self.cap {
92128
match self.inner.read(self.buf) {
93129
Some(cap) => {
94130
self.pos = 0;
95131
self.cap = cap;
96132
}
97-
None => return None
133+
None => {}
98134
}
99135
}
136+
return self.buf.slice(self.pos, self.cap);
137+
}
138+
}
100139

101-
let src = self.buf.slice(self.pos, self.cap);
102-
let nread = num::min(src.len(), buf.len());
103-
vec::bytes::copy_memory(buf, src, nread);
140+
impl<R: Reader> Reader for BufferedReader<R> {
141+
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
142+
let nread = {
143+
let available = self.fill_buffer();
144+
if available.len() == 0 {
145+
return None;
146+
}
147+
let nread = num::min(available.len(), buf.len());
148+
vec::bytes::copy_memory(buf, available, nread);
149+
nread
150+
};
104151
self.pos += nread;
105152
Some(nread)
106153
}
@@ -355,4 +402,15 @@ mod test {
355402
stream.write(buf);
356403
stream.flush();
357404
}
405+
406+
#[test]
407+
fn test_read_until() {
408+
let inner = MemReader::new(~[0, 1, 2, 1, 0]);
409+
let mut reader = BufferedReader::with_capacity(2, inner);
410+
assert_eq!(reader.read_until(0), Some(~[0]));
411+
assert_eq!(reader.read_until(2), Some(~[1, 2]));
412+
assert_eq!(reader.read_until(1), Some(~[1]));
413+
assert_eq!(reader.read_until(8), Some(~[0]));
414+
assert_eq!(reader.read_until(9), None);
415+
}
358416
}

0 commit comments

Comments
 (0)