]> git.lizzy.rs Git - rust.git/blob - src/libstd/io/mod.rs
Auto merge of #36339 - brson:emscripten-new, r=alexcrichton
[rust.git] / src / libstd / io / mod.rs
1 // Copyright 2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 //! Traits, helpers, and type definitions for core I/O functionality.
12 //!
13 //! The `std::io` module contains a number of common things you'll need
14 //! when doing input and output. The most core part of this module is
15 //! the [`Read`][read] and [`Write`][write] traits, which provide the
16 //! most general interface for reading and writing input and output.
17 //!
18 //! [read]: trait.Read.html
19 //! [write]: trait.Write.html
20 //!
21 //! # Read and Write
22 //!
23 //! Because they are traits, `Read` and `Write` are implemented by a number
24 //! of other types, and you can implement them for your types too. As such,
25 //! you'll see a few different types of I/O throughout the documentation in
26 //! this module: `File`s, `TcpStream`s, and sometimes even `Vec<T>`s. For
27 //! example, `Read` adds a `read()` method, which we can use on `File`s:
28 //!
29 //! ```
30 //! use std::io;
31 //! use std::io::prelude::*;
32 //! use std::fs::File;
33 //!
34 //! # fn foo() -> io::Result<()> {
35 //! let mut f = try!(File::open("foo.txt"));
36 //! let mut buffer = [0; 10];
37 //!
38 //! // read up to 10 bytes
39 //! try!(f.read(&mut buffer));
40 //!
41 //! println!("The bytes: {:?}", buffer);
42 //! # Ok(())
43 //! # }
44 //! ```
45 //!
46 //! `Read` and `Write` are so important, implementors of the two traits have a
47 //! nickname: readers and writers. So you'll sometimes see 'a reader' instead
48 //! of 'a type that implements the `Read` trait'. Much easier!
49 //!
50 //! ## Seek and BufRead
51 //!
52 //! Beyond that, there are two important traits that are provided: [`Seek`][seek]
53 //! and [`BufRead`][bufread]. Both of these build on top of a reader to control
54 //! how the reading happens. `Seek` lets you control where the next byte is
55 //! coming from:
56 //!
57 //! ```
58 //! use std::io;
59 //! use std::io::prelude::*;
60 //! use std::io::SeekFrom;
61 //! use std::fs::File;
62 //!
63 //! # fn foo() -> io::Result<()> {
64 //! let mut f = try!(File::open("foo.txt"));
65 //! let mut buffer = [0; 10];
66 //!
67 //! // skip to the last 10 bytes of the file
68 //! try!(f.seek(SeekFrom::End(-10)));
69 //!
70 //! // read up to 10 bytes
71 //! try!(f.read(&mut buffer));
72 //!
73 //! println!("The bytes: {:?}", buffer);
74 //! # Ok(())
75 //! # }
76 //! ```
77 //!
78 //! [seek]: trait.Seek.html
79 //! [bufread]: trait.BufRead.html
80 //!
81 //! `BufRead` uses an internal buffer to provide a number of other ways to read, but
82 //! to show it off, we'll need to talk about buffers in general. Keep reading!
83 //!
84 //! ## BufReader and BufWriter
85 //!
86 //! Byte-based interfaces are unwieldy and can be inefficient, as we'd need to be
87 //! making near-constant calls to the operating system. To help with this,
88 //! `std::io` comes with two structs, `BufReader` and `BufWriter`, which wrap
89 //! readers and writers. The wrapper uses a buffer, reducing the number of
90 //! calls and providing nicer methods for accessing exactly what you want.
91 //!
92 //! For example, `BufReader` works with the `BufRead` trait to add extra
93 //! methods to any reader:
94 //!
95 //! ```
96 //! use std::io;
97 //! use std::io::prelude::*;
98 //! use std::io::BufReader;
99 //! use std::fs::File;
100 //!
101 //! # fn foo() -> io::Result<()> {
102 //! let f = try!(File::open("foo.txt"));
103 //! let mut reader = BufReader::new(f);
104 //! let mut buffer = String::new();
105 //!
106 //! // read a line into buffer
107 //! try!(reader.read_line(&mut buffer));
108 //!
109 //! println!("{}", buffer);
110 //! # Ok(())
111 //! # }
112 //! ```
113 //!
114 //! `BufWriter` doesn't add any new ways of writing; it just buffers every call
115 //! to [`write()`][write()]:
116 //!
117 //! ```
118 //! use std::io;
119 //! use std::io::prelude::*;
120 //! use std::io::BufWriter;
121 //! use std::fs::File;
122 //!
123 //! # fn foo() -> io::Result<()> {
124 //! let f = try!(File::create("foo.txt"));
125 //! {
126 //!     let mut writer = BufWriter::new(f);
127 //!
128 //!     // write a byte to the buffer
129 //!     try!(writer.write(&[42]));
130 //!
131 //! } // the buffer is flushed once writer goes out of scope
132 //!
133 //! # Ok(())
134 //! # }
135 //! ```
136 //!
137 //! [write()]: trait.Write.html#tymethod.write
138 //!
139 //! ## Standard input and output
140 //!
141 //! A very common source of input is standard input:
142 //!
143 //! ```
144 //! use std::io;
145 //!
146 //! # fn foo() -> io::Result<()> {
147 //! let mut input = String::new();
148 //!
149 //! try!(io::stdin().read_line(&mut input));
150 //!
151 //! println!("You typed: {}", input.trim());
152 //! # Ok(())
153 //! # }
154 //! ```
155 //!
156 //! And a very common source of output is standard output:
157 //!
158 //! ```
159 //! use std::io;
160 //! use std::io::prelude::*;
161 //!
162 //! # fn foo() -> io::Result<()> {
163 //! try!(io::stdout().write(&[42]));
164 //! # Ok(())
165 //! # }
166 //! ```
167 //!
168 //! Of course, using `io::stdout()` directly is less common than something like
169 //! `println!`.
170 //!
171 //! ## Iterator types
172 //!
173 //! A large number of the structures provided by `std::io` are for various
174 //! ways of iterating over I/O. For example, `Lines` is used to split over
175 //! lines:
176 //!
177 //! ```
178 //! use std::io;
179 //! use std::io::prelude::*;
180 //! use std::io::BufReader;
181 //! use std::fs::File;
182 //!
183 //! # fn foo() -> io::Result<()> {
184 //! let f = try!(File::open("foo.txt"));
185 //! let reader = BufReader::new(f);
186 //!
187 //! for line in reader.lines() {
188 //!     println!("{}", try!(line));
189 //! }
190 //!
191 //! # Ok(())
192 //! # }
193 //! ```
194 //!
195 //! ## Functions
196 //!
197 //! There are a number of [functions][functions-list] that offer access to various
198 //! features. For example, we can use three of these functions to copy everything
199 //! from standard input to standard output:
200 //!
201 //! ```
202 //! use std::io;
203 //!
204 //! # fn foo() -> io::Result<()> {
205 //! try!(io::copy(&mut io::stdin(), &mut io::stdout()));
206 //! # Ok(())
207 //! # }
208 //! ```
209 //!
210 //! [functions-list]: #functions-1
211 //!
212 //! ## io::Result
213 //!
214 //! Last, but certainly not least, is [`io::Result`][result]. This type is used
215 //! as the return type of many `std::io` functions that can cause an error, and
216 //! can be returned from your own functions as well. Many of the examples in this
217 //! module use the [`try!`][try] macro:
218 //!
219 //! ```
220 //! use std::io;
221 //!
222 //! fn read_input() -> io::Result<()> {
223 //!     let mut input = String::new();
224 //!
225 //!     try!(io::stdin().read_line(&mut input));
226 //!
227 //!     println!("You typed: {}", input.trim());
228 //!
229 //!     Ok(())
230 //! }
231 //! ```
232 //!
233 //! The return type of `read_input()`, `io::Result<()>`, is a very common type
234 //! for functions which don't have a 'real' return value, but do want to return
235 //! errors if they happen. In this case, the only purpose of this function is
236 //! to read the line and print it, so we use `()`.
237 //!
238 //! [result]: type.Result.html
239 //! [try]: ../macro.try.html
240 //!
241 //! ## Platform-specific behavior
242 //!
243 //! Many I/O functions throughout the standard library are documented to indicate
244 //! what various library or syscalls they are delegated to. This is done to help
245 //! applications both understand what's happening under the hood as well as investigate
246 //! any possibly unclear semantics. Note, however, that this is informative, not a binding
247 //! contract. The implementation of many of these functions are subject to change over
248 //! time and may call fewer or more syscalls/library functions.
249
250 #![stable(feature = "rust1", since = "1.0.0")]
251
252 use cmp;
253 use rustc_unicode::str as core_str;
254 use error as std_error;
255 use fmt;
256 use result;
257 use str;
258 use memchr;
259
260 #[stable(feature = "rust1", since = "1.0.0")]
261 pub use self::buffered::{BufReader, BufWriter, LineWriter};
262 #[stable(feature = "rust1", since = "1.0.0")]
263 pub use self::buffered::IntoInnerError;
264 #[stable(feature = "rust1", since = "1.0.0")]
265 pub use self::cursor::Cursor;
266 #[stable(feature = "rust1", since = "1.0.0")]
267 pub use self::error::{Result, Error, ErrorKind};
268 #[stable(feature = "rust1", since = "1.0.0")]
269 pub use self::util::{copy, sink, Sink, empty, Empty, repeat, Repeat};
270 #[stable(feature = "rust1", since = "1.0.0")]
271 pub use self::stdio::{stdin, stdout, stderr, _print, Stdin, Stdout, Stderr};
272 #[stable(feature = "rust1", since = "1.0.0")]
273 pub use self::stdio::{StdoutLock, StderrLock, StdinLock};
274 #[unstable(feature = "libstd_io_internals", issue = "0")]
275 #[doc(no_inline, hidden)]
276 pub use self::stdio::{set_panic, set_print};
277
278 pub mod prelude;
279 mod buffered;
280 mod cursor;
281 mod error;
282 mod impls;
283 mod lazy;
284 mod util;
285 mod stdio;
286
287 const DEFAULT_BUF_SIZE: usize = 8 * 1024;
288
289 // A few methods below (read_to_string, read_line) will append data into a
290 // `String` buffer, but we need to be pretty careful when doing this. The
291 // implementation will just call `.as_mut_vec()` and then delegate to a
292 // byte-oriented reading method, but we must ensure that when returning we never
293 // leave `buf` in a state such that it contains invalid UTF-8 in its bounds.
294 //
295 // To this end, we use an RAII guard (to protect against panics) which updates
296 // the length of the string when it is dropped. This guard initially truncates
297 // the string to the prior length and only after we've validated that the
298 // new contents are valid UTF-8 do we allow it to set a longer length.
299 //
300 // The unsafety in this function is twofold:
301 //
302 // 1. We're looking at the raw bytes of `buf`, so we take on the burden of UTF-8
303 //    checks.
304 // 2. We're passing a raw buffer to the function `f`, and it is expected that
305 //    the function only *appends* bytes to the buffer. We'll get undefined
306 //    behavior if existing bytes are overwritten to have non-UTF-8 data.
307 fn append_to_string<F>(buf: &mut String, f: F) -> Result<usize>
308     where F: FnOnce(&mut Vec<u8>) -> Result<usize>
309 {
310     struct Guard<'a> { s: &'a mut Vec<u8>, len: usize }
311         impl<'a> Drop for Guard<'a> {
312         fn drop(&mut self) {
313             unsafe { self.s.set_len(self.len); }
314         }
315     }
316
317     unsafe {
318         let mut g = Guard { len: buf.len(), s: buf.as_mut_vec() };
319         let ret = f(g.s);
320         if str::from_utf8(&g.s[g.len..]).is_err() {
321             ret.and_then(|_| {
322                 Err(Error::new(ErrorKind::InvalidData,
323                                "stream did not contain valid UTF-8"))
324             })
325         } else {
326             g.len = g.s.len();
327             ret
328         }
329     }
330 }
331
332 // This uses an adaptive system to extend the vector when it fills. We want to
333 // avoid paying to allocate and zero a huge chunk of memory if the reader only
334 // has 4 bytes while still making large reads if the reader does have a ton
335 // of data to return. Simply tacking on an extra DEFAULT_BUF_SIZE space every
336 // time is 4,500 times (!) slower than this if the reader has a very small
337 // amount of data to return.
338 fn read_to_end<R: Read + ?Sized>(r: &mut R, buf: &mut Vec<u8>) -> Result<usize> {
339     let start_len = buf.len();
340     let mut len = start_len;
341     let mut new_write_size = 16;
342     let ret;
343     loop {
344         if len == buf.len() {
345             if new_write_size < DEFAULT_BUF_SIZE {
346                 new_write_size *= 2;
347             }
348             buf.resize(len + new_write_size, 0);
349         }
350
351         match r.read(&mut buf[len..]) {
352             Ok(0) => {
353                 ret = Ok(len - start_len);
354                 break;
355             }
356             Ok(n) => len += n,
357             Err(ref e) if e.kind() == ErrorKind::Interrupted => {}
358             Err(e) => {
359                 ret = Err(e);
360                 break;
361             }
362         }
363     }
364
365     buf.truncate(len);
366     ret
367 }
368
369 /// The `Read` trait allows for reading bytes from a source.
370 ///
371 /// Implementors of the `Read` trait are sometimes called 'readers'.
372 ///
373 /// Readers are defined by one required method, `read()`. Each call to `read`
374 /// will attempt to pull bytes from this source into a provided buffer. A
375 /// number of other methods are implemented in terms of `read()`, giving
376 /// implementors a number of ways to read bytes while only needing to implement
377 /// a single method.
378 ///
379 /// Readers are intended to be composable with one another. Many implementors
380 /// throughout `std::io` take and provide types which implement the `Read`
381 /// trait.
382 ///
383 /// Please note that each call to `read` may involve a system call, and
384 /// therefore, using something that implements [`BufRead`][bufread], such as
385 /// [`BufReader`][bufreader], will be more efficient.
386 ///
387 /// [bufread]: trait.BufRead.html
388 /// [bufreader]: struct.BufReader.html
389 ///
390 /// # Examples
391 ///
392 /// [`File`][file]s implement `Read`:
393 ///
394 /// [file]: ../fs/struct.File.html
395 ///
396 /// ```
397 /// use std::io;
398 /// use std::io::prelude::*;
399 /// use std::fs::File;
400 ///
401 /// # fn foo() -> io::Result<()> {
402 /// let mut f = try!(File::open("foo.txt"));
403 /// let mut buffer = [0; 10];
404 ///
405 /// // read up to 10 bytes
406 /// try!(f.read(&mut buffer));
407 ///
408 /// let mut buffer = vec![0; 10];
409 /// // read the whole file
410 /// try!(f.read_to_end(&mut buffer));
411 ///
412 /// // read into a String, so that you don't need to do the conversion.
413 /// let mut buffer = String::new();
414 /// try!(f.read_to_string(&mut buffer));
415 ///
416 /// // and more! See the other methods for more details.
417 /// # Ok(())
418 /// # }
419 /// ```
420 #[stable(feature = "rust1", since = "1.0.0")]
421 pub trait Read {
422     /// Pull some bytes from this source into the specified buffer, returning
423     /// how many bytes were read.
424     ///
425     /// This function does not provide any guarantees about whether it blocks
426     /// waiting for data, but if an object needs to block for a read but cannot
427     /// it will typically signal this via an `Err` return value.
428     ///
429     /// If the return value of this method is `Ok(n)`, then it must be
430     /// guaranteed that `0 <= n <= buf.len()`. A nonzero `n` value indicates
431     /// that the buffer `buf` has been filled in with `n` bytes of data from this
432     /// source. If `n` is `0`, then it can indicate one of two scenarios:
433     ///
434     /// 1. This reader has reached its "end of file" and will likely no longer
435     ///    be able to produce bytes. Note that this does not mean that the
436     ///    reader will *always* no longer be able to produce bytes.
437     /// 2. The buffer specified was 0 bytes in length.
438     ///
439     /// No guarantees are provided about the contents of `buf` when this
440     /// function is called, implementations cannot rely on any property of the
441     /// contents of `buf` being true. It is recommended that implementations
442     /// only write data to `buf` instead of reading its contents.
443     ///
444     /// # Errors
445     ///
446     /// If this function encounters any form of I/O or other error, an error
447     /// variant will be returned. If an error is returned then it must be
448     /// guaranteed that no bytes were read.
449     ///
450     /// # Examples
451     ///
452     /// [`File`][file]s implement `Read`:
453     ///
454     /// [file]: ../fs/struct.File.html
455     ///
456     /// ```
457     /// use std::io;
458     /// use std::io::prelude::*;
459     /// use std::fs::File;
460     ///
461     /// # fn foo() -> io::Result<()> {
462     /// let mut f = try!(File::open("foo.txt"));
463     /// let mut buffer = [0; 10];
464     ///
465     /// // read 10 bytes
466     /// try!(f.read(&mut buffer[..]));
467     /// # Ok(())
468     /// # }
469     /// ```
470     #[stable(feature = "rust1", since = "1.0.0")]
471     fn read(&mut self, buf: &mut [u8]) -> Result<usize>;
472
473     /// Read all bytes until EOF in this source, placing them into `buf`.
474     ///
475     /// All bytes read from this source will be appended to the specified buffer
476     /// `buf`. This function will continuously call `read` to append more data to
477     /// `buf` until `read` returns either `Ok(0)` or an error of
478     /// non-`ErrorKind::Interrupted` kind.
479     ///
480     /// If successful, this function will return the total number of bytes read.
481     ///
482     /// # Errors
483     ///
484     /// If this function encounters an error of the kind
485     /// `ErrorKind::Interrupted` then the error is ignored and the operation
486     /// will continue.
487     ///
488     /// If any other read error is encountered then this function immediately
489     /// returns. Any bytes which have already been read will be appended to
490     /// `buf`.
491     ///
492     /// # Examples
493     ///
494     /// [`File`][file]s implement `Read`:
495     ///
496     /// [file]: ../fs/struct.File.html
497     ///
498     /// ```
499     /// use std::io;
500     /// use std::io::prelude::*;
501     /// use std::fs::File;
502     ///
503     /// # fn foo() -> io::Result<()> {
504     /// let mut f = try!(File::open("foo.txt"));
505     /// let mut buffer = Vec::new();
506     ///
507     /// // read the whole file
508     /// try!(f.read_to_end(&mut buffer));
509     /// # Ok(())
510     /// # }
511     /// ```
512     #[stable(feature = "rust1", since = "1.0.0")]
513     fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize> {
514         read_to_end(self, buf)
515     }
516
517     /// Read all bytes until EOF in this source, placing them into `buf`.
518     ///
519     /// If successful, this function returns the number of bytes which were read
520     /// and appended to `buf`.
521     ///
522     /// # Errors
523     ///
524     /// If the data in this stream is *not* valid UTF-8 then an error is
525     /// returned and `buf` is unchanged.
526     ///
527     /// See [`read_to_end()`][readtoend] for other error semantics.
528     ///
529     /// [readtoend]: #method.read_to_end
530     ///
531     /// # Examples
532     ///
533     /// [`File`][file]s implement `Read`:
534     ///
535     /// [file]: ../fs/struct.File.html
536     ///
537     /// ```
538     /// use std::io;
539     /// use std::io::prelude::*;
540     /// use std::fs::File;
541     ///
542     /// # fn foo() -> io::Result<()> {
543     /// let mut f = try!(File::open("foo.txt"));
544     /// let mut buffer = String::new();
545     ///
546     /// try!(f.read_to_string(&mut buffer));
547     /// # Ok(())
548     /// # }
549     /// ```
550     #[stable(feature = "rust1", since = "1.0.0")]
551     fn read_to_string(&mut self, buf: &mut String) -> Result<usize> {
552         // Note that we do *not* call `.read_to_end()` here. We are passing
553         // `&mut Vec<u8>` (the raw contents of `buf`) into the `read_to_end`
554         // method to fill it up. An arbitrary implementation could overwrite the
555         // entire contents of the vector, not just append to it (which is what
556         // we are expecting).
557         //
558         // To prevent extraneously checking the UTF-8-ness of the entire buffer
559         // we pass it to our hardcoded `read_to_end` implementation which we
560         // know is guaranteed to only read data into the end of the buffer.
561         append_to_string(buf, |b| read_to_end(self, b))
562     }
563
564     /// Read the exact number of bytes required to fill `buf`.
565     ///
566     /// This function reads as many bytes as necessary to completely fill the
567     /// specified buffer `buf`.
568     ///
569     /// No guarantees are provided about the contents of `buf` when this
570     /// function is called, implementations cannot rely on any property of the
571     /// contents of `buf` being true. It is recommended that implementations
572     /// only write data to `buf` instead of reading its contents.
573     ///
574     /// # Errors
575     ///
576     /// If this function encounters an error of the kind
577     /// `ErrorKind::Interrupted` then the error is ignored and the operation
578     /// will continue.
579     ///
580     /// If this function encounters an "end of file" before completely filling
581     /// the buffer, it returns an error of the kind `ErrorKind::UnexpectedEof`.
582     /// The contents of `buf` are unspecified in this case.
583     ///
584     /// If any other read error is encountered then this function immediately
585     /// returns. The contents of `buf` are unspecified in this case.
586     ///
587     /// If this function returns an error, it is unspecified how many bytes it
588     /// has read, but it will never read more than would be necessary to
589     /// completely fill the buffer.
590     ///
591     /// # Examples
592     ///
593     /// [`File`][file]s implement `Read`:
594     ///
595     /// [file]: ../fs/struct.File.html
596     ///
597     /// ```
598     /// use std::io;
599     /// use std::io::prelude::*;
600     /// use std::fs::File;
601     ///
602     /// # fn foo() -> io::Result<()> {
603     /// let mut f = try!(File::open("foo.txt"));
604     /// let mut buffer = [0; 10];
605     ///
606     /// // read exactly 10 bytes
607     /// try!(f.read_exact(&mut buffer));
608     /// # Ok(())
609     /// # }
610     /// ```
611     #[stable(feature = "read_exact", since = "1.6.0")]
612     fn read_exact(&mut self, mut buf: &mut [u8]) -> Result<()> {
613         while !buf.is_empty() {
614             match self.read(buf) {
615                 Ok(0) => break,
616                 Ok(n) => { let tmp = buf; buf = &mut tmp[n..]; }
617                 Err(ref e) if e.kind() == ErrorKind::Interrupted => {}
618                 Err(e) => return Err(e),
619             }
620         }
621         if !buf.is_empty() {
622             Err(Error::new(ErrorKind::UnexpectedEof,
623                            "failed to fill whole buffer"))
624         } else {
625             Ok(())
626         }
627     }
628
629     /// Creates a "by reference" adaptor for this instance of `Read`.
630     ///
631     /// The returned adaptor also implements `Read` and will simply borrow this
632     /// current reader.
633     ///
634     /// # Examples
635     ///
636     /// [`File`][file]s implement `Read`:
637     ///
638     /// [file]: ../fs/struct.File.html
639     ///
640     /// ```
641     /// use std::io;
642     /// use std::io::Read;
643     /// use std::fs::File;
644     ///
645     /// # fn foo() -> io::Result<()> {
646     /// let mut f = try!(File::open("foo.txt"));
647     /// let mut buffer = Vec::new();
648     /// let mut other_buffer = Vec::new();
649     ///
650     /// {
651     ///     let reference = f.by_ref();
652     ///
653     ///     // read at most 5 bytes
654     ///     try!(reference.take(5).read_to_end(&mut buffer));
655     ///
656     /// } // drop our &mut reference so we can use f again
657     ///
658     /// // original file still usable, read the rest
659     /// try!(f.read_to_end(&mut other_buffer));
660     /// # Ok(())
661     /// # }
662     /// ```
663     #[stable(feature = "rust1", since = "1.0.0")]
664     fn by_ref(&mut self) -> &mut Self where Self: Sized { self }
665
666     /// Transforms this `Read` instance to an `Iterator` over its bytes.
667     ///
668     /// The returned type implements `Iterator` where the `Item` is `Result<u8,
669     /// R::Err>`.  The yielded item is `Ok` if a byte was successfully read and
670     /// `Err` otherwise for I/O errors. EOF is mapped to returning `None` from
671     /// this iterator.
672     ///
673     /// # Examples
674     ///
675     /// [`File`][file]s implement `Read`:
676     ///
677     /// [file]: ../fs/struct.File.html
678     ///
679     /// ```
680     /// use std::io;
681     /// use std::io::prelude::*;
682     /// use std::fs::File;
683     ///
684     /// # fn foo() -> io::Result<()> {
685     /// let mut f = try!(File::open("foo.txt"));
686     ///
687     /// for byte in f.bytes() {
688     ///     println!("{}", byte.unwrap());
689     /// }
690     /// # Ok(())
691     /// # }
692     /// ```
693     #[stable(feature = "rust1", since = "1.0.0")]
694     fn bytes(self) -> Bytes<Self> where Self: Sized {
695         Bytes { inner: self }
696     }
697
698     /// Transforms this `Read` instance to an `Iterator` over `char`s.
699     ///
700     /// This adaptor will attempt to interpret this reader as a UTF-8 encoded
701     /// sequence of characters. The returned iterator will return `None` once
702     /// EOF is reached for this reader. Otherwise each element yielded will be a
703     /// `Result<char, E>` where `E` may contain information about what I/O error
704     /// occurred or where decoding failed.
705     ///
706     /// Currently this adaptor will discard intermediate data read, and should
707     /// be avoided if this is not desired.
708     ///
709     /// # Examples
710     ///
711     /// [`File`][file]s implement `Read`:
712     ///
713     /// [file]: ../fs/struct.File.html
714     ///
715     /// ```
716     /// #![feature(io)]
717     /// use std::io;
718     /// use std::io::prelude::*;
719     /// use std::fs::File;
720     ///
721     /// # fn foo() -> io::Result<()> {
722     /// let mut f = try!(File::open("foo.txt"));
723     ///
724     /// for c in f.chars() {
725     ///     println!("{}", c.unwrap());
726     /// }
727     /// # Ok(())
728     /// # }
729     /// ```
730     #[unstable(feature = "io", reason = "the semantics of a partial read/write \
731                                          of where errors happen is currently \
732                                          unclear and may change",
733                issue = "27802")]
734     fn chars(self) -> Chars<Self> where Self: Sized {
735         Chars { inner: self }
736     }
737
738     /// Creates an adaptor which will chain this stream with another.
739     ///
740     /// The returned `Read` instance will first read all bytes from this object
741     /// until EOF is encountered. Afterwards the output is equivalent to the
742     /// output of `next`.
743     ///
744     /// # Examples
745     ///
746     /// [`File`][file]s implement `Read`:
747     ///
748     /// [file]: ../fs/struct.File.html
749     ///
750     /// ```
751     /// use std::io;
752     /// use std::io::prelude::*;
753     /// use std::fs::File;
754     ///
755     /// # fn foo() -> io::Result<()> {
756     /// let mut f1 = try!(File::open("foo.txt"));
757     /// let mut f2 = try!(File::open("bar.txt"));
758     ///
759     /// let mut handle = f1.chain(f2);
760     /// let mut buffer = String::new();
761     ///
762     /// // read the value into a String. We could use any Read method here,
763     /// // this is just one example.
764     /// try!(handle.read_to_string(&mut buffer));
765     /// # Ok(())
766     /// # }
767     /// ```
768     #[stable(feature = "rust1", since = "1.0.0")]
769     fn chain<R: Read>(self, next: R) -> Chain<Self, R> where Self: Sized {
770         Chain { first: self, second: next, done_first: false }
771     }
772
773     /// Creates an adaptor which will read at most `limit` bytes from it.
774     ///
775     /// This function returns a new instance of `Read` which will read at most
776     /// `limit` bytes, after which it will always return EOF (`Ok(0)`). Any
777     /// read errors will not count towards the number of bytes read and future
778     /// calls to `read` may succeed.
779     ///
780     /// # Examples
781     ///
782     /// [`File`][file]s implement `Read`:
783     ///
784     /// [file]: ../fs/struct.File.html
785     ///
786     /// ```
787     /// use std::io;
788     /// use std::io::prelude::*;
789     /// use std::fs::File;
790     ///
791     /// # fn foo() -> io::Result<()> {
792     /// let mut f = try!(File::open("foo.txt"));
793     /// let mut buffer = [0; 5];
794     ///
795     /// // read at most five bytes
796     /// let mut handle = f.take(5);
797     ///
798     /// try!(handle.read(&mut buffer));
799     /// # Ok(())
800     /// # }
801     /// ```
802     #[stable(feature = "rust1", since = "1.0.0")]
803     fn take(self, limit: u64) -> Take<Self> where Self: Sized {
804         Take { inner: self, limit: limit }
805     }
806 }
807
808 /// A trait for objects which are byte-oriented sinks.
809 ///
810 /// Implementors of the `Write` trait are sometimes called 'writers'.
811 ///
812 /// Writers are defined by two required methods, `write()` and `flush()`:
813 ///
814 /// * The `write()` method will attempt to write some data into the object,
815 ///   returning how many bytes were successfully written.
816 ///
817 /// * The `flush()` method is useful for adaptors and explicit buffers
818 ///   themselves for ensuring that all buffered data has been pushed out to the
819 ///   'true sink'.
820 ///
821 /// Writers are intended to be composable with one another. Many implementors
822 /// throughout `std::io` take and provide types which implement the `Write`
823 /// trait.
824 ///
825 /// # Examples
826 ///
827 /// ```
828 /// use std::io::prelude::*;
829 /// use std::fs::File;
830 ///
831 /// # fn foo() -> std::io::Result<()> {
832 /// let mut buffer = try!(File::create("foo.txt"));
833 ///
834 /// try!(buffer.write(b"some bytes"));
835 /// # Ok(())
836 /// # }
837 /// ```
838 #[stable(feature = "rust1", since = "1.0.0")]
839 pub trait Write {
840     /// Write a buffer into this object, returning how many bytes were written.
841     ///
842     /// This function will attempt to write the entire contents of `buf`, but
843     /// the entire write may not succeed, or the write may also generate an
844     /// error. A call to `write` represents *at most one* attempt to write to
845     /// any wrapped object.
846     ///
847     /// Calls to `write` are not guaranteed to block waiting for data to be
848     /// written, and a write which would otherwise block can be indicated through
849     /// an `Err` variant.
850     ///
851     /// If the return value is `Ok(n)` then it must be guaranteed that
852     /// `0 <= n <= buf.len()`. A return value of `0` typically means that the
853     /// underlying object is no longer able to accept bytes and will likely not
854     /// be able to in the future as well, or that the buffer provided is empty.
855     ///
856     /// # Errors
857     ///
858     /// Each call to `write` may generate an I/O error indicating that the
859     /// operation could not be completed. If an error is returned then no bytes
860     /// in the buffer were written to this writer.
861     ///
862     /// It is **not** considered an error if the entire buffer could not be
863     /// written to this writer.
864     ///
865     /// # Examples
866     ///
867     /// ```
868     /// use std::io::prelude::*;
869     /// use std::fs::File;
870     ///
871     /// # fn foo() -> std::io::Result<()> {
872     /// let mut buffer = try!(File::create("foo.txt"));
873     ///
874     /// try!(buffer.write(b"some bytes"));
875     /// # Ok(())
876     /// # }
877     /// ```
878     #[stable(feature = "rust1", since = "1.0.0")]
879     fn write(&mut self, buf: &[u8]) -> Result<usize>;
880
881     /// Flush this output stream, ensuring that all intermediately buffered
882     /// contents reach their destination.
883     ///
884     /// # Errors
885     ///
886     /// It is considered an error if not all bytes could be written due to
887     /// I/O errors or EOF being reached.
888     ///
889     /// # Examples
890     ///
891     /// ```
892     /// use std::io::prelude::*;
893     /// use std::io::BufWriter;
894     /// use std::fs::File;
895     ///
896     /// # fn foo() -> std::io::Result<()> {
897     /// let mut buffer = BufWriter::new(try!(File::create("foo.txt")));
898     ///
899     /// try!(buffer.write(b"some bytes"));
900     /// try!(buffer.flush());
901     /// # Ok(())
902     /// # }
903     /// ```
904     #[stable(feature = "rust1", since = "1.0.0")]
905     fn flush(&mut self) -> Result<()>;
906
907     /// Attempts to write an entire buffer into this write.
908     ///
909     /// This method will continuously call `write` while there is more data to
910     /// write. This method will not return until the entire buffer has been
911     /// successfully written or an error occurs. The first error generated from
912     /// this method will be returned.
913     ///
914     /// # Errors
915     ///
916     /// This function will return the first error that `write` returns.
917     ///
918     /// # Examples
919     ///
920     /// ```
921     /// use std::io::prelude::*;
922     /// use std::fs::File;
923     ///
924     /// # fn foo() -> std::io::Result<()> {
925     /// let mut buffer = try!(File::create("foo.txt"));
926     ///
927     /// try!(buffer.write_all(b"some bytes"));
928     /// # Ok(())
929     /// # }
930     /// ```
931     #[stable(feature = "rust1", since = "1.0.0")]
932     fn write_all(&mut self, mut buf: &[u8]) -> Result<()> {
933         while !buf.is_empty() {
934             match self.write(buf) {
935                 Ok(0) => return Err(Error::new(ErrorKind::WriteZero,
936                                                "failed to write whole buffer")),
937                 Ok(n) => buf = &buf[n..],
938                 Err(ref e) if e.kind() == ErrorKind::Interrupted => {}
939                 Err(e) => return Err(e),
940             }
941         }
942         Ok(())
943     }
944
945     /// Writes a formatted string into this writer, returning any error
946     /// encountered.
947     ///
948     /// This method is primarily used to interface with the
949     /// [`format_args!`][formatargs] macro, but it is rare that this should
950     /// explicitly be called. The [`write!`][write] macro should be favored to
951     /// invoke this method instead.
952     ///
953     /// [formatargs]: ../macro.format_args.html
954     /// [write]: ../macro.write.html
955     ///
956     /// This function internally uses the [`write_all`][writeall] method on
957     /// this trait and hence will continuously write data so long as no errors
958     /// are received. This also means that partial writes are not indicated in
959     /// this signature.
960     ///
961     /// [writeall]: #method.write_all
962     ///
963     /// # Errors
964     ///
965     /// This function will return any I/O error reported while formatting.
966     ///
967     /// # Examples
968     ///
969     /// ```
970     /// use std::io::prelude::*;
971     /// use std::fs::File;
972     ///
973     /// # fn foo() -> std::io::Result<()> {
974     /// let mut buffer = try!(File::create("foo.txt"));
975     ///
976     /// // this call
977     /// try!(write!(buffer, "{:.*}", 2, 1.234567));
978     /// // turns into this:
979     /// try!(buffer.write_fmt(format_args!("{:.*}", 2, 1.234567)));
980     /// # Ok(())
981     /// # }
982     /// ```
983     #[stable(feature = "rust1", since = "1.0.0")]
984     fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<()> {
985         // Create a shim which translates a Write to a fmt::Write and saves
986         // off I/O errors. instead of discarding them
987         struct Adaptor<'a, T: ?Sized + 'a> {
988             inner: &'a mut T,
989             error: Result<()>,
990         }
991
992         impl<'a, T: Write + ?Sized> fmt::Write for Adaptor<'a, T> {
993             fn write_str(&mut self, s: &str) -> fmt::Result {
994                 match self.inner.write_all(s.as_bytes()) {
995                     Ok(()) => Ok(()),
996                     Err(e) => {
997                         self.error = Err(e);
998                         Err(fmt::Error)
999                     }
1000                 }
1001             }
1002         }
1003
1004         let mut output = Adaptor { inner: self, error: Ok(()) };
1005         match fmt::write(&mut output, fmt) {
1006             Ok(()) => Ok(()),
1007             Err(..) => {
1008                 // check if the error came from the underlying `Write` or not
1009                 if output.error.is_err() {
1010                     output.error
1011                 } else {
1012                     Err(Error::new(ErrorKind::Other, "formatter error"))
1013                 }
1014             }
1015         }
1016     }
1017
1018     /// Creates a "by reference" adaptor for this instance of `Write`.
1019     ///
1020     /// The returned adaptor also implements `Write` and will simply borrow this
1021     /// current writer.
1022     ///
1023     /// # Examples
1024     ///
1025     /// ```
1026     /// use std::io::Write;
1027     /// use std::fs::File;
1028     ///
1029     /// # fn foo() -> std::io::Result<()> {
1030     /// let mut buffer = try!(File::create("foo.txt"));
1031     ///
1032     /// let reference = buffer.by_ref();
1033     ///
1034     /// // we can use reference just like our original buffer
1035     /// try!(reference.write_all(b"some bytes"));
1036     /// # Ok(())
1037     /// # }
1038     /// ```
1039     #[stable(feature = "rust1", since = "1.0.0")]
1040     fn by_ref(&mut self) -> &mut Self where Self: Sized { self }
1041 }
1042
1043 /// The `Seek` trait provides a cursor which can be moved within a stream of
1044 /// bytes.
1045 ///
1046 /// The stream typically has a fixed size, allowing seeking relative to either
1047 /// end or the current offset.
1048 ///
1049 /// # Examples
1050 ///
1051 /// [`File`][file]s implement `Seek`:
1052 ///
1053 /// [file]: ../fs/struct.File.html
1054 ///
1055 /// ```
1056 /// use std::io;
1057 /// use std::io::prelude::*;
1058 /// use std::fs::File;
1059 /// use std::io::SeekFrom;
1060 ///
1061 /// # fn foo() -> io::Result<()> {
1062 /// let mut f = try!(File::open("foo.txt"));
1063 ///
1064 /// // move the cursor 42 bytes from the start of the file
1065 /// try!(f.seek(SeekFrom::Start(42)));
1066 /// # Ok(())
1067 /// # }
1068 /// ```
1069 #[stable(feature = "rust1", since = "1.0.0")]
1070 pub trait Seek {
1071     /// Seek to an offset, in bytes, in a stream.
1072     ///
1073     /// A seek beyond the end of a stream is allowed, but implementation
1074     /// defined.
1075     ///
1076     /// If the seek operation completed successfully,
1077     /// this method returns the new position from the start of the stream.
1078     /// That position can be used later with [`SeekFrom::Start`].
1079     ///
1080     /// # Errors
1081     ///
1082     /// Seeking to a negative offset is considered an error.
1083     ///
1084     /// [`SeekFrom::Start`]: enum.SeekFrom.html#variant.Start
1085     #[stable(feature = "rust1", since = "1.0.0")]
1086     fn seek(&mut self, pos: SeekFrom) -> Result<u64>;
1087 }
1088
1089 /// Enumeration of possible methods to seek within an I/O object.
1090 ///
1091 /// It is used by the [`Seek`] trait.
1092 ///
1093 /// [`Seek`]: trait.Seek.html
1094 #[derive(Copy, PartialEq, Eq, Clone, Debug)]
1095 #[stable(feature = "rust1", since = "1.0.0")]
1096 pub enum SeekFrom {
1097     /// Set the offset to the provided number of bytes.
1098     #[stable(feature = "rust1", since = "1.0.0")]
1099     Start(#[stable(feature = "rust1", since = "1.0.0")] u64),
1100
1101     /// Set the offset to the size of this object plus the specified number of
1102     /// bytes.
1103     ///
1104     /// It is possible to seek beyond the end of an object, but it's an error to
1105     /// seek before byte 0.
1106     #[stable(feature = "rust1", since = "1.0.0")]
1107     End(#[stable(feature = "rust1", since = "1.0.0")] i64),
1108
1109     /// Set the offset to the current position plus the specified number of
1110     /// bytes.
1111     ///
1112     /// It is possible to seek beyond the end of an object, but it's an error to
1113     /// seek before byte 0.
1114     #[stable(feature = "rust1", since = "1.0.0")]
1115     Current(#[stable(feature = "rust1", since = "1.0.0")] i64),
1116 }
1117
1118 fn read_until<R: BufRead + ?Sized>(r: &mut R, delim: u8, buf: &mut Vec<u8>)
1119                                    -> Result<usize> {
1120     let mut read = 0;
1121     loop {
1122         let (done, used) = {
1123             let available = match r.fill_buf() {
1124                 Ok(n) => n,
1125                 Err(ref e) if e.kind() == ErrorKind::Interrupted => continue,
1126                 Err(e) => return Err(e)
1127             };
1128             match memchr::memchr(delim, available) {
1129                 Some(i) => {
1130                     buf.extend_from_slice(&available[..i + 1]);
1131                     (true, i + 1)
1132                 }
1133                 None => {
1134                     buf.extend_from_slice(available);
1135                     (false, available.len())
1136                 }
1137             }
1138         };
1139         r.consume(used);
1140         read += used;
1141         if done || used == 0 {
1142             return Ok(read);
1143         }
1144     }
1145 }
1146
1147 /// A `BufRead` is a type of `Read`er which has an internal buffer, allowing it
1148 /// to perform extra ways of reading.
1149 ///
1150 /// For example, reading line-by-line is inefficient without using a buffer, so
1151 /// if you want to read by line, you'll need `BufRead`, which includes a
1152 /// [`read_line()`][readline] method as well as a [`lines()`][lines] iterator.
1153 ///
1154 /// [readline]: #method.read_line
1155 /// [lines]: #method.lines
1156 ///
1157 /// # Examples
1158 ///
1159 /// A locked standard input implements `BufRead`:
1160 ///
1161 /// ```
1162 /// use std::io;
1163 /// use std::io::prelude::*;
1164 ///
1165 /// let stdin = io::stdin();
1166 /// for line in stdin.lock().lines() {
1167 ///     println!("{}", line.unwrap());
1168 /// }
1169 /// ```
1170 ///
1171 /// If you have something that implements `Read`, you can use the [`BufReader`
1172 /// type][bufreader] to turn it into a `BufRead`.
1173 ///
1174 /// For example, [`File`][file] implements `Read`, but not `BufRead`.
1175 /// `BufReader` to the rescue!
1176 ///
1177 /// [bufreader]: struct.BufReader.html
1178 /// [file]: ../fs/struct.File.html
1179 ///
1180 /// ```
1181 /// use std::io::{self, BufReader};
1182 /// use std::io::prelude::*;
1183 /// use std::fs::File;
1184 ///
1185 /// # fn foo() -> io::Result<()> {
1186 /// let f = try!(File::open("foo.txt"));
1187 /// let f = BufReader::new(f);
1188 ///
1189 /// for line in f.lines() {
1190 ///     println!("{}", line.unwrap());
1191 /// }
1192 ///
1193 /// # Ok(())
1194 /// # }
1195 /// ```
1196 ///
1197 #[stable(feature = "rust1", since = "1.0.0")]
1198 pub trait BufRead: Read {
1199     /// Fills the internal buffer of this object, returning the buffer contents.
1200     ///
1201     /// This function is a lower-level call. It needs to be paired with the
1202     /// [`consume`][consume] method to function properly. When calling this
1203     /// method, none of the contents will be "read" in the sense that later
1204     /// calling `read` may return the same contents. As such, `consume` must be
1205     /// called with the number of bytes that are consumed from this buffer to
1206     /// ensure that the bytes are never returned twice.
1207     ///
1208     /// [consume]: #tymethod.consume
1209     ///
1210     /// An empty buffer returned indicates that the stream has reached EOF.
1211     ///
1212     /// # Errors
1213     ///
1214     /// This function will return an I/O error if the underlying reader was
1215     /// read, but returned an error.
1216     ///
1217     /// # Examples
1218     ///
1219     /// A locked standard input implements `BufRead`:
1220     ///
1221     /// ```
1222     /// use std::io;
1223     /// use std::io::prelude::*;
1224     ///
1225     /// let stdin = io::stdin();
1226     /// let mut stdin = stdin.lock();
1227     ///
1228     /// // we can't have two `&mut` references to `stdin`, so use a block
1229     /// // to end the borrow early.
1230     /// let length = {
1231     ///     let buffer = stdin.fill_buf().unwrap();
1232     ///
1233     ///     // work with buffer
1234     ///     println!("{:?}", buffer);
1235     ///
1236     ///     buffer.len()
1237     /// };
1238     ///
1239     /// // ensure the bytes we worked with aren't returned again later
1240     /// stdin.consume(length);
1241     /// ```
1242     #[stable(feature = "rust1", since = "1.0.0")]
1243     fn fill_buf(&mut self) -> Result<&[u8]>;
1244
1245     /// Tells this buffer that `amt` bytes have been consumed from the buffer,
1246     /// so they should no longer be returned in calls to `read`.
1247     ///
1248     /// This function is a lower-level call. It needs to be paired with the
1249     /// [`fill_buf`][fillbuf] method to function properly. This function does
1250     /// not perform any I/O, it simply informs this object that some amount of
1251     /// its buffer, returned from `fill_buf`, has been consumed and should no
1252     /// longer be returned. As such, this function may do odd things if
1253     /// `fill_buf` isn't called before calling it.
1254     ///
1255     /// [fillbuf]: #tymethod.fill_buf
1256     ///
1257     /// The `amt` must be `<=` the number of bytes in the buffer returned by
1258     /// `fill_buf`.
1259     ///
1260     /// # Examples
1261     ///
1262     /// Since `consume()` is meant to be used with [`fill_buf()`][fillbuf],
1263     /// that method's example includes an example of `consume()`.
1264     #[stable(feature = "rust1", since = "1.0.0")]
1265     fn consume(&mut self, amt: usize);
1266
1267     /// Read all bytes into `buf` until the delimiter `byte` or EOF is reached.
1268     ///
1269     /// This function will read bytes from the underlying stream until the
1270     /// delimiter or EOF is found. Once found, all bytes up to, and including,
1271     /// the delimiter (if found) will be appended to `buf`.
1272     ///
1273     /// If successful, this function will return the total number of bytes read.
1274     ///
1275     /// # Errors
1276     ///
1277     /// This function will ignore all instances of `ErrorKind::Interrupted` and
1278     /// will otherwise return any errors returned by `fill_buf`.
1279     ///
1280     /// If an I/O error is encountered then all bytes read so far will be
1281     /// present in `buf` and its length will have been adjusted appropriately.
1282     ///
1283     /// # Examples
1284     ///
1285     /// A locked standard input implements `BufRead`. In this example, we'll
1286     /// read from standard input until we see an `a` byte.
1287     ///
1288     /// ```
1289     /// use std::io;
1290     /// use std::io::prelude::*;
1291     ///
1292     /// fn foo() -> io::Result<()> {
1293     /// let stdin = io::stdin();
1294     /// let mut stdin = stdin.lock();
1295     /// let mut buffer = Vec::new();
1296     ///
1297     /// try!(stdin.read_until(b'a', &mut buffer));
1298     ///
1299     /// println!("{:?}", buffer);
1300     /// # Ok(())
1301     /// # }
1302     /// ```
1303     #[stable(feature = "rust1", since = "1.0.0")]
1304     fn read_until(&mut self, byte: u8, buf: &mut Vec<u8>) -> Result<usize> {
1305         read_until(self, byte, buf)
1306     }
1307
1308     /// Read all bytes until a newline (the 0xA byte) is reached, and append
1309     /// them to the provided buffer.
1310     ///
1311     /// This function will read bytes from the underlying stream until the
1312     /// newline delimiter (the 0xA byte) or EOF is found. Once found, all bytes
1313     /// up to, and including, the delimiter (if found) will be appended to
1314     /// `buf`.
1315     ///
1316     /// If successful, this function will return the total number of bytes read.
1317     ///
1318     /// # Errors
1319     ///
1320     /// This function has the same error semantics as `read_until` and will also
1321     /// return an error if the read bytes are not valid UTF-8. If an I/O error
1322     /// is encountered then `buf` may contain some bytes already read in the
1323     /// event that all data read so far was valid UTF-8.
1324     ///
1325     /// # Examples
1326     ///
1327     /// A locked standard input implements `BufRead`. In this example, we'll
1328     /// read all of the lines from standard input. If we were to do this in
1329     /// an actual project, the [`lines()`][lines] method would be easier, of
1330     /// course.
1331     ///
1332     /// [lines]: #method.lines
1333     ///
1334     /// ```
1335     /// use std::io;
1336     /// use std::io::prelude::*;
1337     ///
1338     /// let stdin = io::stdin();
1339     /// let mut stdin = stdin.lock();
1340     /// let mut buffer = String::new();
1341     ///
1342     /// while stdin.read_line(&mut buffer).unwrap() > 0 {
1343     ///     // work with buffer
1344     ///     println!("{:?}", buffer);
1345     ///
1346     ///     buffer.clear();
1347     /// }
1348     /// ```
1349     #[stable(feature = "rust1", since = "1.0.0")]
1350     fn read_line(&mut self, buf: &mut String) -> Result<usize> {
1351         // Note that we are not calling the `.read_until` method here, but
1352         // rather our hardcoded implementation. For more details as to why, see
1353         // the comments in `read_to_end`.
1354         append_to_string(buf, |b| read_until(self, b'\n', b))
1355     }
1356
1357     /// Returns an iterator over the contents of this reader split on the byte
1358     /// `byte`.
1359     ///
1360     /// The iterator returned from this function will return instances of
1361     /// `io::Result<Vec<u8>>`. Each vector returned will *not* have the
1362     /// delimiter byte at the end.
1363     ///
1364     /// This function will yield errors whenever `read_until` would have also
1365     /// yielded an error.
1366     ///
1367     /// # Examples
1368     ///
1369     /// A locked standard input implements `BufRead`. In this example, we'll
1370     /// read some input from standard input, splitting on commas.
1371     ///
1372     /// ```
1373     /// use std::io;
1374     /// use std::io::prelude::*;
1375     ///
1376     /// let stdin = io::stdin();
1377     ///
1378     /// for content in stdin.lock().split(b',') {
1379     ///     println!("{:?}", content.unwrap());
1380     /// }
1381     /// ```
1382     #[stable(feature = "rust1", since = "1.0.0")]
1383     fn split(self, byte: u8) -> Split<Self> where Self: Sized {
1384         Split { buf: self, delim: byte }
1385     }
1386
1387     /// Returns an iterator over the lines of this reader.
1388     ///
1389     /// The iterator returned from this function will yield instances of
1390     /// `io::Result<String>`. Each string returned will *not* have a newline
1391     /// byte (the 0xA byte) or CRLF (0xD, 0xA bytes) at the end.
1392     ///
1393     /// # Examples
1394     ///
1395     /// A locked standard input implements `BufRead`:
1396     ///
1397     /// ```
1398     /// use std::io;
1399     /// use std::io::prelude::*;
1400     ///
1401     /// let stdin = io::stdin();
1402     ///
1403     /// for line in stdin.lock().lines() {
1404     ///     println!("{}", line.unwrap());
1405     /// }
1406     /// ```
1407     #[stable(feature = "rust1", since = "1.0.0")]
1408     fn lines(self) -> Lines<Self> where Self: Sized {
1409         Lines { buf: self }
1410     }
1411 }
1412
1413 /// Adaptor to chain together two readers.
1414 ///
1415 /// This struct is generally created by calling [`chain()`][chain] on a reader.
1416 /// Please see the documentation of `chain()` for more details.
1417 ///
1418 /// [chain]: trait.Read.html#method.chain
1419 #[stable(feature = "rust1", since = "1.0.0")]
1420 pub struct Chain<T, U> {
1421     first: T,
1422     second: U,
1423     done_first: bool,
1424 }
1425
1426 #[stable(feature = "rust1", since = "1.0.0")]
1427 impl<T: Read, U: Read> Read for Chain<T, U> {
1428     fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
1429         if !self.done_first {
1430             match self.first.read(buf)? {
1431                 0 if buf.len() != 0 => { self.done_first = true; }
1432                 n => return Ok(n),
1433             }
1434         }
1435         self.second.read(buf)
1436     }
1437 }
1438
1439 #[stable(feature = "chain_bufread", since = "1.9.0")]
1440 impl<T: BufRead, U: BufRead> BufRead for Chain<T, U> {
1441     fn fill_buf(&mut self) -> Result<&[u8]> {
1442         if !self.done_first {
1443             match self.first.fill_buf()? {
1444                 buf if buf.len() == 0 => { self.done_first = true; }
1445                 buf => return Ok(buf),
1446             }
1447         }
1448         self.second.fill_buf()
1449     }
1450
1451     fn consume(&mut self, amt: usize) {
1452         if !self.done_first {
1453             self.first.consume(amt)
1454         } else {
1455             self.second.consume(amt)
1456         }
1457     }
1458 }
1459
1460 /// Reader adaptor which limits the bytes read from an underlying reader.
1461 ///
1462 /// This struct is generally created by calling [`take()`][take] on a reader.
1463 /// Please see the documentation of `take()` for more details.
1464 ///
1465 /// [take]: trait.Read.html#method.take
1466 #[stable(feature = "rust1", since = "1.0.0")]
1467 pub struct Take<T> {
1468     inner: T,
1469     limit: u64,
1470 }
1471
1472 impl<T> Take<T> {
1473     /// Returns the number of bytes that can be read before this instance will
1474     /// return EOF.
1475     ///
1476     /// # Note
1477     ///
1478     /// This instance may reach EOF after reading fewer bytes than indicated by
1479     /// this method if the underlying `Read` instance reaches EOF.
1480     ///
1481     /// # Examples
1482     ///
1483     /// ```
1484     /// use std::io;
1485     /// use std::io::prelude::*;
1486     /// use std::fs::File;
1487     ///
1488     /// # fn foo() -> io::Result<()> {
1489     /// let f = try!(File::open("foo.txt"));
1490     ///
1491     /// // read at most five bytes
1492     /// let handle = f.take(5);
1493     ///
1494     /// println!("limit: {}", handle.limit());
1495     /// # Ok(())
1496     /// # }
1497     /// ```
1498     #[stable(feature = "rust1", since = "1.0.0")]
1499     pub fn limit(&self) -> u64 { self.limit }
1500
1501     /// Consumes the `Take`, returning the wrapped reader.
1502     ///
1503     /// # Examples
1504     ///
1505     /// ```
1506     /// #![feature(io_take_into_inner)]
1507     ///
1508     /// use std::io;
1509     /// use std::io::prelude::*;
1510     /// use std::fs::File;
1511     ///
1512     /// # fn foo() -> io::Result<()> {
1513     /// let mut file = try!(File::open("foo.txt"));
1514     ///
1515     /// let mut buffer = [0; 5];
1516     /// let mut handle = file.take(5);
1517     /// try!(handle.read(&mut buffer));
1518     ///
1519     /// let file = handle.into_inner();
1520     /// # Ok(())
1521     /// # }
1522     /// ```
1523     #[unstable(feature = "io_take_into_inner", issue = "0")]
1524     pub fn into_inner(self) -> T {
1525         self.inner
1526     }
1527 }
1528
1529 #[stable(feature = "rust1", since = "1.0.0")]
1530 impl<T: Read> Read for Take<T> {
1531     fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
1532         // Don't call into inner reader at all at EOF because it may still block
1533         if self.limit == 0 {
1534             return Ok(0);
1535         }
1536
1537         let max = cmp::min(buf.len() as u64, self.limit) as usize;
1538         let n = self.inner.read(&mut buf[..max])?;
1539         self.limit -= n as u64;
1540         Ok(n)
1541     }
1542 }
1543
1544 #[stable(feature = "rust1", since = "1.0.0")]
1545 impl<T: BufRead> BufRead for Take<T> {
1546     fn fill_buf(&mut self) -> Result<&[u8]> {
1547         // Don't call into inner reader at all at EOF because it may still block
1548         if self.limit == 0 {
1549             return Ok(&[]);
1550         }
1551
1552         let buf = self.inner.fill_buf()?;
1553         let cap = cmp::min(buf.len() as u64, self.limit) as usize;
1554         Ok(&buf[..cap])
1555     }
1556
1557     fn consume(&mut self, amt: usize) {
1558         // Don't let callers reset the limit by passing an overlarge value
1559         let amt = cmp::min(amt as u64, self.limit) as usize;
1560         self.limit -= amt as u64;
1561         self.inner.consume(amt);
1562     }
1563 }
1564
1565 fn read_one_byte(reader: &mut Read) -> Option<Result<u8>> {
1566     let mut buf = [0];
1567     loop {
1568         return match reader.read(&mut buf) {
1569             Ok(0) => None,
1570             Ok(..) => Some(Ok(buf[0])),
1571             Err(ref e) if e.kind() == ErrorKind::Interrupted => continue,
1572             Err(e) => Some(Err(e)),
1573         };
1574     }
1575 }
1576
1577 /// An iterator over `u8` values of a reader.
1578 ///
1579 /// This struct is generally created by calling [`bytes()`][bytes] on a reader.
1580 /// Please see the documentation of `bytes()` for more details.
1581 ///
1582 /// [bytes]: trait.Read.html#method.bytes
1583 #[stable(feature = "rust1", since = "1.0.0")]
1584 pub struct Bytes<R> {
1585     inner: R,
1586 }
1587
1588 #[stable(feature = "rust1", since = "1.0.0")]
1589 impl<R: Read> Iterator for Bytes<R> {
1590     type Item = Result<u8>;
1591
1592     fn next(&mut self) -> Option<Result<u8>> {
1593         read_one_byte(&mut self.inner)
1594     }
1595 }
1596
1597 /// An iterator over the `char`s of a reader.
1598 ///
1599 /// This struct is generally created by calling [`chars()`][chars] on a reader.
1600 /// Please see the documentation of `chars()` for more details.
1601 ///
1602 /// [chars]: trait.Read.html#method.chars
1603 #[unstable(feature = "io", reason = "awaiting stability of Read::chars",
1604            issue = "27802")]
1605 pub struct Chars<R> {
1606     inner: R,
1607 }
1608
1609 /// An enumeration of possible errors that can be generated from the `Chars`
1610 /// adapter.
1611 #[derive(Debug)]
1612 #[unstable(feature = "io", reason = "awaiting stability of Read::chars",
1613            issue = "27802")]
1614 pub enum CharsError {
1615     /// Variant representing that the underlying stream was read successfully
1616     /// but it did not contain valid utf8 data.
1617     NotUtf8,
1618
1619     /// Variant representing that an I/O error occurred.
1620     Other(Error),
1621 }
1622
1623 #[unstable(feature = "io", reason = "awaiting stability of Read::chars",
1624            issue = "27802")]
1625 impl<R: Read> Iterator for Chars<R> {
1626     type Item = result::Result<char, CharsError>;
1627
1628     fn next(&mut self) -> Option<result::Result<char, CharsError>> {
1629         let first_byte = match read_one_byte(&mut self.inner) {
1630             None => return None,
1631             Some(Ok(b)) => b,
1632             Some(Err(e)) => return Some(Err(CharsError::Other(e))),
1633         };
1634         let width = core_str::utf8_char_width(first_byte);
1635         if width == 1 { return Some(Ok(first_byte as char)) }
1636         if width == 0 { return Some(Err(CharsError::NotUtf8)) }
1637         let mut buf = [first_byte, 0, 0, 0];
1638         {
1639             let mut start = 1;
1640             while start < width {
1641                 match self.inner.read(&mut buf[start..width]) {
1642                     Ok(0) => return Some(Err(CharsError::NotUtf8)),
1643                     Ok(n) => start += n,
1644                     Err(ref e) if e.kind() == ErrorKind::Interrupted => continue,
1645                     Err(e) => return Some(Err(CharsError::Other(e))),
1646                 }
1647             }
1648         }
1649         Some(match str::from_utf8(&buf[..width]).ok() {
1650             Some(s) => Ok(s.chars().next().unwrap()),
1651             None => Err(CharsError::NotUtf8),
1652         })
1653     }
1654 }
1655
1656 #[unstable(feature = "io", reason = "awaiting stability of Read::chars",
1657            issue = "27802")]
1658 impl std_error::Error for CharsError {
1659     fn description(&self) -> &str {
1660         match *self {
1661             CharsError::NotUtf8 => "invalid utf8 encoding",
1662             CharsError::Other(ref e) => std_error::Error::description(e),
1663         }
1664     }
1665     fn cause(&self) -> Option<&std_error::Error> {
1666         match *self {
1667             CharsError::NotUtf8 => None,
1668             CharsError::Other(ref e) => e.cause(),
1669         }
1670     }
1671 }
1672
1673 #[unstable(feature = "io", reason = "awaiting stability of Read::chars",
1674            issue = "27802")]
1675 impl fmt::Display for CharsError {
1676     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1677         match *self {
1678             CharsError::NotUtf8 => {
1679                 "byte stream did not contain valid utf8".fmt(f)
1680             }
1681             CharsError::Other(ref e) => e.fmt(f),
1682         }
1683     }
1684 }
1685
1686 /// An iterator over the contents of an instance of `BufRead` split on a
1687 /// particular byte.
1688 ///
1689 /// This struct is generally created by calling [`split()`][split] on a
1690 /// `BufRead`. Please see the documentation of `split()` for more details.
1691 ///
1692 /// [split]: trait.BufRead.html#method.split
1693 #[stable(feature = "rust1", since = "1.0.0")]
1694 pub struct Split<B> {
1695     buf: B,
1696     delim: u8,
1697 }
1698
1699 #[stable(feature = "rust1", since = "1.0.0")]
1700 impl<B: BufRead> Iterator for Split<B> {
1701     type Item = Result<Vec<u8>>;
1702
1703     fn next(&mut self) -> Option<Result<Vec<u8>>> {
1704         let mut buf = Vec::new();
1705         match self.buf.read_until(self.delim, &mut buf) {
1706             Ok(0) => None,
1707             Ok(_n) => {
1708                 if buf[buf.len() - 1] == self.delim {
1709                     buf.pop();
1710                 }
1711                 Some(Ok(buf))
1712             }
1713             Err(e) => Some(Err(e))
1714         }
1715     }
1716 }
1717
1718 /// An iterator over the lines of an instance of `BufRead`.
1719 ///
1720 /// This struct is generally created by calling [`lines()`][lines] on a
1721 /// `BufRead`. Please see the documentation of `lines()` for more details.
1722 ///
1723 /// [lines]: trait.BufRead.html#method.lines
1724 #[stable(feature = "rust1", since = "1.0.0")]
1725 pub struct Lines<B> {
1726     buf: B,
1727 }
1728
1729 #[stable(feature = "rust1", since = "1.0.0")]
1730 impl<B: BufRead> Iterator for Lines<B> {
1731     type Item = Result<String>;
1732
1733     fn next(&mut self) -> Option<Result<String>> {
1734         let mut buf = String::new();
1735         match self.buf.read_line(&mut buf) {
1736             Ok(0) => None,
1737             Ok(_n) => {
1738                 if buf.ends_with("\n") {
1739                     buf.pop();
1740                     if buf.ends_with("\r") {
1741                         buf.pop();
1742                     }
1743                 }
1744                 Some(Ok(buf))
1745             }
1746             Err(e) => Some(Err(e))
1747         }
1748     }
1749 }
1750
1751 #[cfg(test)]
1752 mod tests {
1753     use io::prelude::*;
1754     use io;
1755     use super::Cursor;
1756     use test;
1757     use super::repeat;
1758
1759     #[test]
1760     #[cfg_attr(target_os = "emscripten", ignore)]
1761     fn read_until() {
1762         let mut buf = Cursor::new(&b"12"[..]);
1763         let mut v = Vec::new();
1764         assert_eq!(buf.read_until(b'3', &mut v).unwrap(), 2);
1765         assert_eq!(v, b"12");
1766
1767         let mut buf = Cursor::new(&b"1233"[..]);
1768         let mut v = Vec::new();
1769         assert_eq!(buf.read_until(b'3', &mut v).unwrap(), 3);
1770         assert_eq!(v, b"123");
1771         v.truncate(0);
1772         assert_eq!(buf.read_until(b'3', &mut v).unwrap(), 1);
1773         assert_eq!(v, b"3");
1774         v.truncate(0);
1775         assert_eq!(buf.read_until(b'3', &mut v).unwrap(), 0);
1776         assert_eq!(v, []);
1777     }
1778
1779     #[test]
1780     fn split() {
1781         let buf = Cursor::new(&b"12"[..]);
1782         let mut s = buf.split(b'3');
1783         assert_eq!(s.next().unwrap().unwrap(), vec![b'1', b'2']);
1784         assert!(s.next().is_none());
1785
1786         let buf = Cursor::new(&b"1233"[..]);
1787         let mut s = buf.split(b'3');
1788         assert_eq!(s.next().unwrap().unwrap(), vec![b'1', b'2']);
1789         assert_eq!(s.next().unwrap().unwrap(), vec![]);
1790         assert!(s.next().is_none());
1791     }
1792
1793     #[test]
1794     fn read_line() {
1795         let mut buf = Cursor::new(&b"12"[..]);
1796         let mut v = String::new();
1797         assert_eq!(buf.read_line(&mut v).unwrap(), 2);
1798         assert_eq!(v, "12");
1799
1800         let mut buf = Cursor::new(&b"12\n\n"[..]);
1801         let mut v = String::new();
1802         assert_eq!(buf.read_line(&mut v).unwrap(), 3);
1803         assert_eq!(v, "12\n");
1804         v.truncate(0);
1805         assert_eq!(buf.read_line(&mut v).unwrap(), 1);
1806         assert_eq!(v, "\n");
1807         v.truncate(0);
1808         assert_eq!(buf.read_line(&mut v).unwrap(), 0);
1809         assert_eq!(v, "");
1810     }
1811
1812     #[test]
1813     fn lines() {
1814         let buf = Cursor::new(&b"12\r"[..]);
1815         let mut s = buf.lines();
1816         assert_eq!(s.next().unwrap().unwrap(), "12\r".to_string());
1817         assert!(s.next().is_none());
1818
1819         let buf = Cursor::new(&b"12\r\n\n"[..]);
1820         let mut s = buf.lines();
1821         assert_eq!(s.next().unwrap().unwrap(), "12".to_string());
1822         assert_eq!(s.next().unwrap().unwrap(), "".to_string());
1823         assert!(s.next().is_none());
1824     }
1825
1826     #[test]
1827     fn read_to_end() {
1828         let mut c = Cursor::new(&b""[..]);
1829         let mut v = Vec::new();
1830         assert_eq!(c.read_to_end(&mut v).unwrap(), 0);
1831         assert_eq!(v, []);
1832
1833         let mut c = Cursor::new(&b"1"[..]);
1834         let mut v = Vec::new();
1835         assert_eq!(c.read_to_end(&mut v).unwrap(), 1);
1836         assert_eq!(v, b"1");
1837
1838         let cap = 1024 * 1024;
1839         let data = (0..cap).map(|i| (i / 3) as u8).collect::<Vec<_>>();
1840         let mut v = Vec::new();
1841         let (a, b) = data.split_at(data.len() / 2);
1842         assert_eq!(Cursor::new(a).read_to_end(&mut v).unwrap(), a.len());
1843         assert_eq!(Cursor::new(b).read_to_end(&mut v).unwrap(), b.len());
1844         assert_eq!(v, data);
1845     }
1846
1847     #[test]
1848     fn read_to_string() {
1849         let mut c = Cursor::new(&b""[..]);
1850         let mut v = String::new();
1851         assert_eq!(c.read_to_string(&mut v).unwrap(), 0);
1852         assert_eq!(v, "");
1853
1854         let mut c = Cursor::new(&b"1"[..]);
1855         let mut v = String::new();
1856         assert_eq!(c.read_to_string(&mut v).unwrap(), 1);
1857         assert_eq!(v, "1");
1858
1859         let mut c = Cursor::new(&b"\xff"[..]);
1860         let mut v = String::new();
1861         assert!(c.read_to_string(&mut v).is_err());
1862     }
1863
1864     #[test]
1865     fn read_exact() {
1866         let mut buf = [0; 4];
1867
1868         let mut c = Cursor::new(&b""[..]);
1869         assert_eq!(c.read_exact(&mut buf).unwrap_err().kind(),
1870                    io::ErrorKind::UnexpectedEof);
1871
1872         let mut c = Cursor::new(&b"123"[..]).chain(Cursor::new(&b"456789"[..]));
1873         c.read_exact(&mut buf).unwrap();
1874         assert_eq!(&buf, b"1234");
1875         c.read_exact(&mut buf).unwrap();
1876         assert_eq!(&buf, b"5678");
1877         assert_eq!(c.read_exact(&mut buf).unwrap_err().kind(),
1878                    io::ErrorKind::UnexpectedEof);
1879     }
1880
1881     #[test]
1882     fn read_exact_slice() {
1883         let mut buf = [0; 4];
1884
1885         let mut c = &b""[..];
1886         assert_eq!(c.read_exact(&mut buf).unwrap_err().kind(),
1887                    io::ErrorKind::UnexpectedEof);
1888
1889         let mut c = &b"123"[..];
1890         assert_eq!(c.read_exact(&mut buf).unwrap_err().kind(),
1891                    io::ErrorKind::UnexpectedEof);
1892         // make sure the optimized (early returning) method is being used
1893         assert_eq!(&buf, &[0; 4]);
1894
1895         let mut c = &b"1234"[..];
1896         c.read_exact(&mut buf).unwrap();
1897         assert_eq!(&buf, b"1234");
1898
1899         let mut c = &b"56789"[..];
1900         c.read_exact(&mut buf).unwrap();
1901         assert_eq!(&buf, b"5678");
1902         assert_eq!(c, b"9");
1903     }
1904
1905     #[test]
1906     fn take_eof() {
1907         struct R;
1908
1909         impl Read for R {
1910             fn read(&mut self, _: &mut [u8]) -> io::Result<usize> {
1911                 Err(io::Error::new(io::ErrorKind::Other, ""))
1912             }
1913         }
1914         impl BufRead for R {
1915             fn fill_buf(&mut self) -> io::Result<&[u8]> {
1916                 Err(io::Error::new(io::ErrorKind::Other, ""))
1917             }
1918             fn consume(&mut self, _amt: usize) { }
1919         }
1920
1921         let mut buf = [0; 1];
1922         assert_eq!(0, R.take(0).read(&mut buf).unwrap());
1923         assert_eq!(b"", R.take(0).fill_buf().unwrap());
1924     }
1925
1926     fn cmp_bufread<Br1: BufRead, Br2: BufRead>(mut br1: Br1, mut br2: Br2, exp: &[u8]) {
1927         let mut cat = Vec::new();
1928         loop {
1929             let consume = {
1930                 let buf1 = br1.fill_buf().unwrap();
1931                 let buf2 = br2.fill_buf().unwrap();
1932                 let minlen = if buf1.len() < buf2.len() { buf1.len() } else { buf2.len() };
1933                 assert_eq!(buf1[..minlen], buf2[..minlen]);
1934                 cat.extend_from_slice(&buf1[..minlen]);
1935                 minlen
1936             };
1937             if consume == 0 {
1938                 break;
1939             }
1940             br1.consume(consume);
1941             br2.consume(consume);
1942         }
1943         assert_eq!(br1.fill_buf().unwrap().len(), 0);
1944         assert_eq!(br2.fill_buf().unwrap().len(), 0);
1945         assert_eq!(&cat[..], &exp[..])
1946     }
1947
1948     #[test]
1949     fn chain_bufread() {
1950         let testdata = b"ABCDEFGHIJKL";
1951         let chain1 = (&testdata[..3]).chain(&testdata[3..6])
1952                                      .chain(&testdata[6..9])
1953                                      .chain(&testdata[9..]);
1954         let chain2 = (&testdata[..4]).chain(&testdata[4..8])
1955                                      .chain(&testdata[8..]);
1956         cmp_bufread(chain1, chain2, &testdata[..]);
1957     }
1958
1959     #[test]
1960     fn chain_zero_length_read_is_not_eof() {
1961         let a = b"A";
1962         let b = b"B";
1963         let mut s = String::new();
1964         let mut chain = (&a[..]).chain(&b[..]);
1965         chain.read(&mut []).unwrap();
1966         chain.read_to_string(&mut s).unwrap();
1967         assert_eq!("AB", s);
1968     }
1969
1970     #[bench]
1971     #[cfg_attr(target_os = "emscripten", ignore)]
1972     fn bench_read_to_end(b: &mut test::Bencher) {
1973         b.iter(|| {
1974             let mut lr = repeat(1).take(10000000);
1975             let mut vec = Vec::with_capacity(1024);
1976             super::read_to_end(&mut lr, &mut vec)
1977         });
1978     }
1979 }