183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh"""
283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehPython implementation of the io module.
383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh"""
483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom __future__ import (print_function, unicode_literals)
683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport os
883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport abc
983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport codecs
1083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport warnings
1183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport errno
1283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Import thread instead of threading to reduce startup cost
1383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehtry:
1483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    from thread import allocate_lock as Lock
1583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehexcept ImportError:
1683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    from dummy_thread import allocate_lock as Lock
1783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport io
1983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom io import (__all__, SEEK_SET, SEEK_CUR, SEEK_END)
2083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom errno import EINTR
2183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh__metaclass__ = type
2383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# open() uses st_blksize whenever we can
2583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehDEFAULT_BUFFER_SIZE = 8 * 1024  # bytes
2683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# NOTE: Base classes defined here are registered with the "official" ABCs
2883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# defined in io.py. We don't use real inheritance though, because we don't
2983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# want to inherit the C implementations.
3083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass BlockingIOError(IOError):
3383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Exception raised when I/O would block on a non-blocking I/O stream."""
3583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, errno, strerror, characters_written=0):
3783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        super(IOError, self).__init__(errno, strerror)
3883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not isinstance(characters_written, (int, long)):
3983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise TypeError("characters_written must be a integer")
4083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.characters_written = characters_written
4183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef open(file, mode="r", buffering=-1,
4483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh         encoding=None, errors=None,
4583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh         newline=None, closefd=True):
4683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    r"""Open file and return a stream.  Raise IOError upon failure.
4883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    file is either a text or byte string giving the name (and the path
5083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if the file isn't in the current working directory) of the file to
5183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    be opened or an integer file descriptor of the file to be
5283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    wrapped. (If a file descriptor is given, it is closed when the
5383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    returned I/O object is closed, unless closefd is set to False.)
5483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    mode is an optional string that specifies the mode in which the file
5683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    is opened. It defaults to 'r' which means open for reading in text
5783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    mode.  Other common values are 'w' for writing (truncating the file if
5883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    it already exists), and 'a' for appending (which on some Unix systems,
5983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    means that all writes append to the end of the file regardless of the
6083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    current seek position). In text mode, if encoding is not specified the
6183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    encoding used is platform dependent. (For reading and writing raw
6283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    bytes use binary mode and leave encoding unspecified.) The available
6383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    modes are:
6483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
6583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ========= ===============================================================
6683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Character Meaning
6783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    --------- ---------------------------------------------------------------
6883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    'r'       open for reading (default)
6983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    'w'       open for writing, truncating the file first
7083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    'a'       open for writing, appending to the end of the file if it exists
7183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    'b'       binary mode
7283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    't'       text mode (default)
7383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    '+'       open a disk file for updating (reading and writing)
7483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    'U'       universal newline mode (for backwards compatibility; unneeded
7583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh              for new code)
7683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ========= ===============================================================
7783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
7883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    The default mode is 'rt' (open for reading text). For binary random
7983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    access, the mode 'w+b' opens and truncates the file to 0 bytes, while
8083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    'r+b' opens the file without truncation.
8183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Python distinguishes between files opened in binary and text modes,
8383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    even when the underlying operating system doesn't. Files opened in
8483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    binary mode (appending 'b' to the mode argument) return contents as
8583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    bytes objects without any decoding. In text mode (the default, or when
8683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    't' is appended to the mode argument), the contents of the file are
8783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    returned as strings, the bytes having been first decoded using a
8883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    platform-dependent encoding or using the specified encoding if given.
8983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
9083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    buffering is an optional integer used to set the buffering policy.
9183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Pass 0 to switch buffering off (only allowed in binary mode), 1 to select
9283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    line buffering (only usable in text mode), and an integer > 1 to indicate
9383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    the size of a fixed-size chunk buffer.  When no buffering argument is
9483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    given, the default buffering policy works as follows:
9583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
9683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    * Binary files are buffered in fixed-size chunks; the size of the buffer
9783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      is chosen using a heuristic trying to determine the underlying device's
9883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      "block size" and falling back on `io.DEFAULT_BUFFER_SIZE`.
9983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      On many systems, the buffer will typically be 4096 or 8192 bytes long.
10083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    * "Interactive" text files (files for which isatty() returns True)
10283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      use line buffering.  Other text files use the policy described above
10383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      for binary files.
10483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    encoding is the name of the encoding used to decode or encode the
10683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    file. This should only be used in text mode. The default encoding is
10783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    platform dependent, but any encoding supported by Python can be
10883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    passed.  See the codecs module for the list of supported encodings.
10983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    errors is an optional string that specifies how encoding errors are to
11183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    be handled---this argument should not be used in binary mode. Pass
11283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    'strict' to raise a ValueError exception if there is an encoding error
11383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    (the default of None has the same effect), or pass 'ignore' to ignore
11483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    errors. (Note that ignoring encoding errors can lead to data loss.)
11583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    See the documentation for codecs.register for a list of the permitted
11683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    encoding error strings.
11783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    newline controls how universal newlines works (it only applies to text
11983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    mode). It can be None, '', '\n', '\r', and '\r\n'.  It works as
12083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    follows:
12183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
12283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    * On input, if newline is None, universal newlines mode is
12383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      enabled. Lines in the input can end in '\n', '\r', or '\r\n', and
12483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      these are translated into '\n' before being returned to the
12583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      caller. If it is '', universal newline mode is enabled, but line
12683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      endings are returned to the caller untranslated. If it has any of
12783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      the other legal values, input lines are only terminated by the given
12883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      string, and the line ending is returned to the caller untranslated.
12983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
13083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    * On output, if newline is None, any '\n' characters written are
13183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      translated to the system default line separator, os.linesep. If
13283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      newline is '', no translation takes place. If newline is any of the
13383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      other legal values, any '\n' characters written are translated to
13483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      the given string.
13583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
13683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    If closefd is False, the underlying file descriptor will be kept open
13783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    when the file is closed. This does not work when a file name is given
13883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    and must be True in that case.
13983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
14083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    open() returns a file object whose type depends on the mode, and
14183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    through which the standard file operations such as reading and writing
14283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    are performed. When open() is used to open a file in a text mode ('w',
14383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    'r', 'wt', 'rt', etc.), it returns a TextIOWrapper. When used to open
14483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    a file in a binary mode, the returned class varies: in read binary
14583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    mode, it returns a BufferedReader; in write binary and append binary
14683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    modes, it returns a BufferedWriter, and in read/write mode, it returns
14783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    a BufferedRandom.
14883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
14983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    It is also possible to use a string or bytearray as a file for both
15083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    reading and writing. For strings StringIO can be used like a file
15183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    opened in a text mode, and for bytes a BytesIO can be used like a file
15283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    opened in a binary mode.
15383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
15483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if not isinstance(file, (basestring, int, long)):
15583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise TypeError("invalid file: %r" % file)
15683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if not isinstance(mode, basestring):
15783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise TypeError("invalid mode: %r" % mode)
15883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if not isinstance(buffering, (int, long)):
15983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise TypeError("invalid buffering: %r" % buffering)
16083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if encoding is not None and not isinstance(encoding, basestring):
16183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise TypeError("invalid encoding: %r" % encoding)
16283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if errors is not None and not isinstance(errors, basestring):
16383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise TypeError("invalid errors: %r" % errors)
16483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    modes = set(mode)
16583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if modes - set("arwb+tU") or len(mode) > len(modes):
16683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise ValueError("invalid mode: %r" % mode)
16783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    reading = "r" in modes
16883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    writing = "w" in modes
16983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    appending = "a" in modes
17083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    updating = "+" in modes
17183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    text = "t" in modes
17283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    binary = "b" in modes
17383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if "U" in modes:
17483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if writing or appending:
17583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("can't use U and writing mode at once")
17683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        reading = True
17783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if text and binary:
17883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise ValueError("can't have text and binary mode at once")
17983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if reading + writing + appending > 1:
18083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise ValueError("can't have read/write/append mode at once")
18183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if not (reading or writing or appending):
18283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise ValueError("must have exactly one of read/write/append mode")
18383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if binary and encoding is not None:
18483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise ValueError("binary mode doesn't take an encoding argument")
18583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if binary and errors is not None:
18683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise ValueError("binary mode doesn't take an errors argument")
18783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if binary and newline is not None:
18883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise ValueError("binary mode doesn't take a newline argument")
18983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    raw = FileIO(file,
19083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 (reading and "r" or "") +
19183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 (writing and "w" or "") +
19283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 (appending and "a" or "") +
19383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 (updating and "+" or ""),
19483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 closefd)
19583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    line_buffering = False
19683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if buffering == 1 or buffering < 0 and raw.isatty():
19783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        buffering = -1
19883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        line_buffering = True
19983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if buffering < 0:
20083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        buffering = DEFAULT_BUFFER_SIZE
20183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
20283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            bs = os.fstat(raw.fileno()).st_blksize
20383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except (os.error, AttributeError):
20483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pass
20583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
20683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if bs > 1:
20783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                buffering = bs
20883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if buffering < 0:
20983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise ValueError("invalid buffering size")
21083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if buffering == 0:
21183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if binary:
21283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return raw
21383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise ValueError("can't have unbuffered text I/O")
21483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if updating:
21583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        buffer = BufferedRandom(raw, buffering)
21683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    elif writing or appending:
21783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        buffer = BufferedWriter(raw, buffering)
21883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    elif reading:
21983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        buffer = BufferedReader(raw, buffering)
22083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    else:
22183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise ValueError("unknown mode: %r" % mode)
22283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if binary:
22383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return buffer
22483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    text = TextIOWrapper(buffer, encoding, errors, newline, line_buffering)
22583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    text.mode = mode
22683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    return text
22783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
22883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
22983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass DocDescriptor:
23083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Helper for builtins.open.__doc__
23183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
23283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __get__(self, obj, typ):
23383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return (
23483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            "open(file, mode='r', buffering=-1, encoding=None, "
23583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 "errors=None, newline=None, closefd=True)\n\n" +
23683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            open.__doc__)
23783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
23883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass OpenWrapper:
23983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Wrapper for builtins.open
24083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
24183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Trick so that open won't become a bound method when stored
24283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    as a class variable (as dbm.dumb does).
24383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
24483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    See initstdio() in Python/pythonrun.c.
24583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
24683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    __doc__ = DocDescriptor()
24783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
24883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __new__(cls, *args, **kwargs):
24983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return open(*args, **kwargs)
25083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
25183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
25283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass UnsupportedOperation(ValueError, IOError):
25383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    pass
25483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
25583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
25683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass IOBase:
25783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    __metaclass__ = abc.ABCMeta
25883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
25983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """The abstract base class for all I/O classes, acting on streams of
26083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    bytes. There is no public constructor.
26183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
26283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    This class provides dummy implementations for many methods that
26383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    derived classes can override selectively; the default implementations
26483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    represent a file that cannot be read, written or seeked.
26583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
26683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Even though IOBase does not declare read, readinto, or write because
26783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    their signatures will vary, implementations and clients should
26883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    consider those methods part of the interface. Also, implementations
26983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    may raise a IOError when operations they do not support are called.
27083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
27183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    The basic type used for binary data read from or written to a file is
27283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    bytes. bytearrays are accepted too, and in some cases (such as
27383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    readinto) needed. Text I/O classes work with str data.
27483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
27583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Note that calling any method (even inquiries) on a closed stream is
27683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    undefined. Implementations may raise IOError in this case.
27783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
27883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    IOBase (and its subclasses) support the iterator protocol, meaning
27983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    that an IOBase object can be iterated over yielding the lines in a
28083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    stream.
28183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
28283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    IOBase also supports the :keyword:`with` statement. In this example,
28383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    fp is closed after the suite of the with statement is complete:
28483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
28583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    with open('spam.txt', 'r') as fp:
28683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        fp.write('Spam and eggs!')
28783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
28883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
28983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ### Internal ###
29083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
29183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _unsupported(self, name):
29283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Internal: raise an exception for unsupported operations."""
29383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise UnsupportedOperation("%s.%s() not supported" %
29483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                   (self.__class__.__name__, name))
29583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
29683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ### Positioning ###
29783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
29883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def seek(self, pos, whence=0):
29983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Change stream position.
30083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
30183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Change the stream position to byte offset pos. Argument pos is
30283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        interpreted relative to the position indicated by whence.  Values
30383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for whence are:
30483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
30583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        * 0 -- start of stream (the default); offset should be zero or positive
30683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        * 1 -- current stream position; offset may be negative
30783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        * 2 -- end of stream; offset is usually negative
30883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
30983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Return the new absolute position.
31083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
31183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._unsupported("seek")
31283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
31383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def tell(self):
31483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Return current stream position."""
31583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.seek(0, 1)
31683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
31783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def truncate(self, pos=None):
31883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Truncate file to size bytes.
31983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
32083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Size defaults to the current IO position as reported by tell().  Return
32183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        the new size.
32283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
32383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._unsupported("truncate")
32483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
32583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ### Flush and close ###
32683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
32783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def flush(self):
32883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Flush write buffers, if applicable.
32983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
33083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        This is not implemented for read-only and non-blocking streams.
33183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
33283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._checkClosed()
33383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # XXX Should this return the number of bytes written???
33483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
33583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    __closed = False
33683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
33783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def close(self):
33883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Flush and close the IO object.
33983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
34083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        This method has no effect if the file is already closed.
34183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
34283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not self.__closed:
34383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
34483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.flush()
34583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            finally:
34683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.__closed = True
34783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
34883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __del__(self):
34983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Destructor.  Calls close()."""
35083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # The try/except block is in case this is called at program
35183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # exit time, when it's possible that globals have already been
35283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # deleted, and then the close() call might fail.  Since
35383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # there's nothing we can do about such failures and they annoy
35483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # the end users, we suppress the traceback.
35583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
35683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.close()
35783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except:
35883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pass
35983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
36083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ### Inquiries ###
36183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
36283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def seekable(self):
36383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Return whether object supports random access.
36483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
36583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        If False, seek(), tell() and truncate() will raise IOError.
36683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        This method may need to do a test seek().
36783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
36883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return False
36983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
37083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _checkSeekable(self, msg=None):
37183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Internal: raise an IOError if file is not seekable
37283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
37383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not self.seekable():
37483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise IOError("File or stream is not seekable."
37583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                          if msg is None else msg)
37683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
37783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
37883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def readable(self):
37983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Return whether object was opened for reading.
38083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
38183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        If False, read() will raise IOError.
38283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
38383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return False
38483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
38583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _checkReadable(self, msg=None):
38683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Internal: raise an IOError if file is not readable
38783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
38883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not self.readable():
38983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise IOError("File or stream is not readable."
39083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                          if msg is None else msg)
39183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
39283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def writable(self):
39383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Return whether object was opened for writing.
39483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
39583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        If False, write() and truncate() will raise IOError.
39683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
39783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return False
39883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
39983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _checkWritable(self, msg=None):
40083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Internal: raise an IOError if file is not writable
40183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
40283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not self.writable():
40383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise IOError("File or stream is not writable."
40483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                          if msg is None else msg)
40583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
40683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
40783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def closed(self):
40883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """closed: bool.  True iff the file has been closed.
40983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
41083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        For backwards compatibility, this is a property, not a predicate.
41183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
41283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.__closed
41383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
41483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _checkClosed(self, msg=None):
41583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Internal: raise an ValueError if file is closed
41683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
41783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
41883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("I/O operation on closed file."
41983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                             if msg is None else msg)
42083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
42183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ### Context manager ###
42283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
42383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __enter__(self):
42483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Context management protocol.  Returns self."""
42583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._checkClosed()
42683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self
42783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
42883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __exit__(self, *args):
42983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Context management protocol.  Calls close()"""
43083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.close()
43183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
43283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ### Lower-level APIs ###
43383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
43483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # XXX Should these be present even if unimplemented?
43583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
43683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def fileno(self):
43783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Returns underlying file descriptor if one exists.
43883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
43983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        An IOError is raised if the IO object does not use a file descriptor.
44083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
44183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._unsupported("fileno")
44283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
44383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def isatty(self):
44483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Return whether this is an 'interactive' stream.
44583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
44683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Return False if it can't be determined.
44783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
44883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._checkClosed()
44983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return False
45083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
45183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ### Readline[s] and writelines ###
45283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
45383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def readline(self, limit=-1):
45483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        r"""Read and return a line from the stream.
45583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
45683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        If limit is specified, at most limit bytes will be read.
45783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
45883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        The line terminator is always b'\n' for binary files; for text
45983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        files, the newlines argument to open can be used to select the line
46083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        terminator(s) recognized.
46183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
46283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # For backwards compatibility, a (slowish) readline().
46383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if hasattr(self, "peek"):
46483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def nreadahead():
46583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                readahead = self.peek(1)
46683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if not readahead:
46783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    return 1
46883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                n = (readahead.find(b"\n") + 1) or len(readahead)
46983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if limit >= 0:
47083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    n = min(n, limit)
47183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return n
47283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
47383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def nreadahead():
47483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return 1
47583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if limit is None:
47683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            limit = -1
47783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif not isinstance(limit, (int, long)):
47883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise TypeError("limit must be an integer")
47983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        res = bytearray()
48083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        while limit < 0 or len(res) < limit:
48183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            b = self.read(nreadahead())
48283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if not b:
48383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                break
48483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            res += b
48583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if res.endswith(b"\n"):
48683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                break
48783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return bytes(res)
48883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
48983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __iter__(self):
49083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._checkClosed()
49183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self
49283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
49383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def next(self):
49483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        line = self.readline()
49583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not line:
49683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise StopIteration
49783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return line
49883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
49983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def readlines(self, hint=None):
50083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Return a list of lines from the stream.
50183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
50283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        hint can be specified to control the number of lines read: no more
50383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        lines will be read if the total size (in bytes/characters) of all
50483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        lines so far exceeds hint.
50583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
50683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if hint is not None and not isinstance(hint, (int, long)):
50783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise TypeError("integer or None expected")
50883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if hint is None or hint <= 0:
50983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return list(self)
51083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        n = 0
51183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        lines = []
51283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for line in self:
51383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            lines.append(line)
51483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            n += len(line)
51583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if n >= hint:
51683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                break
51783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return lines
51883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
51983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def writelines(self, lines):
52083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._checkClosed()
52183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for line in lines:
52283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.write(line)
52383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
52483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehio.IOBase.register(IOBase)
52583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
52683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
52783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass RawIOBase(IOBase):
52883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
52983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Base class for raw binary I/O."""
53083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
53183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # The read() method is implemented by calling readinto(); derived
53283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # classes that want to support read() only need to implement
53383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # readinto() as a primitive operation.  In general, readinto() can be
53483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # more efficient than read().
53583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
53683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # (It would be tempting to also provide an implementation of
53783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # readinto() in terms of read(), in case the latter is a more suitable
53883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # primitive operation, but that would lead to nasty recursion in case
53983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # a subclass doesn't implement either.)
54083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
54183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def read(self, n=-1):
54283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Read and return up to n bytes.
54383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
54483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Returns an empty bytes object on EOF, or None if the object is
54583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        set not to block and has no data to read.
54683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
54783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if n is None:
54883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            n = -1
54983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if n < 0:
55083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return self.readall()
55183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        b = bytearray(n.__index__())
55283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        n = self.readinto(b)
55383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if n is None:
55483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return None
55583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        del b[n:]
55683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return bytes(b)
55783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
55883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def readall(self):
55983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Read until EOF, using multiple read() call."""
56083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        res = bytearray()
56183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        while True:
56283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            data = self.read(DEFAULT_BUFFER_SIZE)
56383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if not data:
56483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                break
56583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            res += data
56683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if res:
56783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return bytes(res)
56883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
56983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # b'' or None
57083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return data
57183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
57283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def readinto(self, b):
57383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Read up to len(b) bytes into b.
57483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
57583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Returns number of bytes read (0 for EOF), or None if the object
57683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        is set not to block and has no data to read.
57783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
57883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._unsupported("readinto")
57983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
58083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def write(self, b):
58183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Write the given buffer to the IO stream.
58283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
58383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Returns the number of bytes written, which may be less than len(b).
58483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
58583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._unsupported("write")
58683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
58783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehio.RawIOBase.register(RawIOBase)
58883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom _io import FileIO
58983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehRawIOBase.register(FileIO)
59083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
59183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
59283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass BufferedIOBase(IOBase):
59383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
59483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Base class for buffered IO objects.
59583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
59683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    The main difference with RawIOBase is that the read() method
59783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    supports omitting the size argument, and does not have a default
59883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    implementation that defers to readinto().
59983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
60083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    In addition, read(), readinto() and write() may raise
60183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    BlockingIOError if the underlying raw stream is in non-blocking
60283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    mode and not ready; unlike their raw counterparts, they will never
60383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    return None.
60483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
60583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    A typical implementation should not inherit from a RawIOBase
60683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    implementation, but wrap one.
60783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
60883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
60983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def read(self, n=None):
61083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Read and return up to n bytes.
61183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
61283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        If the argument is omitted, None, or negative, reads and
61383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        returns all data until EOF.
61483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
61583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        If the argument is positive, and the underlying raw stream is
61683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        not 'interactive', multiple raw reads may be issued to satisfy
61783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        the byte count (unless EOF is reached first).  But for
61883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        interactive raw streams (XXX and for pipes?), at most one raw
61983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        read will be issued, and a short result does not imply that
62083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        EOF is imminent.
62183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
62283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Returns an empty bytes array on EOF.
62383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
62483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Raises BlockingIOError if the underlying raw stream has no
62583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        data at the moment.
62683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
62783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._unsupported("read")
62883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
62983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def read1(self, n=None):
63083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Read up to n bytes with at most one read() system call."""
63183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._unsupported("read1")
63283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
63383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def readinto(self, b):
63483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Read up to len(b) bytes into b.
63583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
63683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Like read(), this may issue multiple reads to the underlying raw
63783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        stream, unless the latter is 'interactive'.
63883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
63983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Returns the number of bytes read (0 for EOF).
64083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
64183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Raises BlockingIOError if the underlying raw stream has no
64283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        data at the moment.
64383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
64483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # XXX This ought to work with anything that supports the buffer API
64583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        data = self.read(len(b))
64683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        n = len(data)
64783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
64883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            b[:n] = data
64983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except TypeError as err:
65083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            import array
65183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if not isinstance(b, array.array):
65283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise err
65383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            b[:n] = array.array(b'b', data)
65483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return n
65583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
65683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def write(self, b):
65783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Write the given buffer to the IO stream.
65883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
65983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Return the number of bytes written, which is never less than
66083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        len(b).
66183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
66283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Raises BlockingIOError if the buffer is full and the
66383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        underlying raw stream cannot accept more data at the moment.
66483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
66583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._unsupported("write")
66683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
66783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def detach(self):
66883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
66983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Separate the underlying raw stream from the buffer and return it.
67083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
67183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        After the raw stream has been detached, the buffer is in an unusable
67283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        state.
67383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
67483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._unsupported("detach")
67583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
67683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehio.BufferedIOBase.register(BufferedIOBase)
67783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
67883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
67983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass _BufferedIOMixin(BufferedIOBase):
68083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
68183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """A mixin implementation of BufferedIOBase with an underlying raw stream.
68283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
68383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    This passes most requests on to the underlying raw stream.  It
68483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    does *not* provide implementations of read(), readinto() or
68583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    write().
68683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
68783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
68883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, raw):
68983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._raw = raw
69083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
69183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ### Positioning ###
69283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
69383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def seek(self, pos, whence=0):
69483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        new_position = self.raw.seek(pos, whence)
69583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if new_position < 0:
69683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise IOError("seek() returned an invalid position")
69783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return new_position
69883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
69983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def tell(self):
70083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        pos = self.raw.tell()
70183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if pos < 0:
70283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise IOError("tell() returned an invalid position")
70383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return pos
70483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
70583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def truncate(self, pos=None):
70683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Flush the stream.  We're mixing buffered I/O with lower-level I/O,
70783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # and a flush may be necessary to synch both views of the current
70883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # file state.
70983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.flush()
71083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
71183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if pos is None:
71283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pos = self.tell()
71383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # XXX: Should seek() be used, instead of passing the position
71483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # XXX  directly to truncate?
71583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.raw.truncate(pos)
71683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
71783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ### Flush and close ###
71883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
71983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def flush(self):
72083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
72183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("flush of closed file")
72283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.raw.flush()
72383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
72483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def close(self):
72583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.raw is not None and not self.closed:
72683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
72783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # may raise BlockingIOError or BrokenPipeError etc
72883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.flush()
72983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            finally:
73083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.raw.close()
73183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
73283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def detach(self):
73383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.raw is None:
73483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("raw stream already detached")
73583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.flush()
73683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raw = self._raw
73783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._raw = None
73883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return raw
73983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
74083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ### Inquiries ###
74183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
74283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def seekable(self):
74383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.raw.seekable()
74483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
74583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def readable(self):
74683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.raw.readable()
74783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
74883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def writable(self):
74983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.raw.writable()
75083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
75183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
75283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def raw(self):
75383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self._raw
75483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
75583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
75683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def closed(self):
75783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.raw.closed
75883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
75983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
76083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def name(self):
76183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.raw.name
76283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
76383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
76483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def mode(self):
76583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.raw.mode
76683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
76783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __repr__(self):
76883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        clsname = self.__class__.__name__
76983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
77083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            name = self.name
77183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except AttributeError:
77283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return "<_pyio.{0}>".format(clsname)
77383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
77483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return "<_pyio.{0} name={1!r}>".format(clsname, name)
77583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
77683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ### Lower-level APIs ###
77783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
77883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def fileno(self):
77983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.raw.fileno()
78083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
78183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def isatty(self):
78283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.raw.isatty()
78383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
78483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
78583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass BytesIO(BufferedIOBase):
78683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
78783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Buffered I/O implementation using an in-memory bytes buffer."""
78883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
78983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, initial_bytes=None):
79083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        buf = bytearray()
79183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if initial_bytes is not None:
79283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            buf.extend(initial_bytes)
79383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._buffer = buf
79483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._pos = 0
79583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
79683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __getstate__(self):
79783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
79883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("__getstate__ on closed file")
79983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.__dict__.copy()
80083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
80183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def getvalue(self):
80283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Return the bytes value (contents) of the buffer
80383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
80483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
80583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("getvalue on closed file")
80683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return bytes(self._buffer)
80783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
80883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def read(self, n=None):
80983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
81083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("read from closed file")
81183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if n is None:
81283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            n = -1
81383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not isinstance(n, (int, long)):
81483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise TypeError("integer argument expected, got {0!r}".format(
81583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                type(n)))
81683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if n < 0:
81783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            n = len(self._buffer)
81883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if len(self._buffer) <= self._pos:
81983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return b""
82083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        newpos = min(len(self._buffer), self._pos + n)
82183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        b = self._buffer[self._pos : newpos]
82283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._pos = newpos
82383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return bytes(b)
82483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
82583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def read1(self, n):
82683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """This is the same as read.
82783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
82883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.read(n)
82983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
83083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def write(self, b):
83183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
83283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("write to closed file")
83383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if isinstance(b, unicode):
83483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise TypeError("can't write unicode to binary stream")
83583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        n = len(b)
83683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if n == 0:
83783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return 0
83883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        pos = self._pos
83983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if pos > len(self._buffer):
84083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Inserts null bytes between the current end of the file
84183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # and the new write position.
84283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            padding = b'\x00' * (pos - len(self._buffer))
84383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._buffer += padding
84483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._buffer[pos:pos + n] = b
84583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._pos += n
84683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return n
84783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
84883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def seek(self, pos, whence=0):
84983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
85083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("seek on closed file")
85183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
85283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pos.__index__
85383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except AttributeError:
85483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise TypeError("an integer is required")
85583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if whence == 0:
85683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if pos < 0:
85783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise ValueError("negative seek position %r" % (pos,))
85883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._pos = pos
85983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif whence == 1:
86083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._pos = max(0, self._pos + pos)
86183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif whence == 2:
86283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._pos = max(0, len(self._buffer) + pos)
86383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
86483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("invalid whence value")
86583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self._pos
86683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
86783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def tell(self):
86883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
86983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("tell on closed file")
87083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self._pos
87183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
87283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def truncate(self, pos=None):
87383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
87483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("truncate on closed file")
87583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if pos is None:
87683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pos = self._pos
87783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
87883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
87983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pos.__index__
88083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except AttributeError:
88183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise TypeError("an integer is required")
88283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if pos < 0:
88383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise ValueError("negative truncate position %r" % (pos,))
88483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        del self._buffer[pos:]
88583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return pos
88683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
88783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def readable(self):
88883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
88983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("I/O operation on closed file.")
89083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return True
89183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
89283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def writable(self):
89383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
89483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("I/O operation on closed file.")
89583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return True
89683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
89783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def seekable(self):
89883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
89983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("I/O operation on closed file.")
90083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return True
90183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
90283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
90383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass BufferedReader(_BufferedIOMixin):
90483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
90583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """BufferedReader(raw[, buffer_size])
90683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
90783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    A buffer for a readable, sequential BaseRawIO object.
90883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
90983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    The constructor creates a BufferedReader for the given readable raw
91083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    stream and buffer_size. If buffer_size is omitted, DEFAULT_BUFFER_SIZE
91183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    is used.
91283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
91383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
91483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
91583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Create a new buffered reader using the given readable raw IO object.
91683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
91783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not raw.readable():
91883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise IOError('"raw" argument must be readable.')
91983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
92083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        _BufferedIOMixin.__init__(self, raw)
92183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if buffer_size <= 0:
92283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("invalid buffer size")
92383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buffer_size = buffer_size
92483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._reset_read_buf()
92583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._read_lock = Lock()
92683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
92783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _reset_read_buf(self):
92883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._read_buf = b""
92983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._read_pos = 0
93083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
93183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def read(self, n=None):
93283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Read n bytes.
93383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
93483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Returns exactly n bytes of data unless the underlying raw IO
93583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        stream reaches EOF or if the call would block in non-blocking
93683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        mode. If n is negative, read until EOF or until read() would
93783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        block.
93883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
93983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if n is not None and n < -1:
94083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("invalid number of bytes to read")
94183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with self._read_lock:
94283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return self._read_unlocked(n)
94383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
94483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _read_unlocked(self, n=None):
94583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        nodata_val = b""
94683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        empty_values = (b"", None)
94783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        buf = self._read_buf
94883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        pos = self._read_pos
94983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
95083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Special case for when the number of bytes to read is unspecified.
95183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if n is None or n == -1:
95283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._reset_read_buf()
95383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            chunks = [buf[pos:]]  # Strip the consumed bytes.
95483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            current_size = 0
95583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            while True:
95683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # Read until EOF or until read() would block.
95783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                try:
95883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    chunk = self.raw.read()
95983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                except IOError as e:
96083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    if e.errno != EINTR:
96183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        raise
96283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    continue
96383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if chunk in empty_values:
96483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    nodata_val = chunk
96583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    break
96683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                current_size += len(chunk)
96783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                chunks.append(chunk)
96883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return b"".join(chunks) or nodata_val
96983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
97083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # The number of bytes to read is specified, return at most n bytes.
97183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        avail = len(buf) - pos  # Length of the available buffered data.
97283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if n <= avail:
97383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Fast path: the data to read is fully buffered.
97483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._read_pos += n
97583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return buf[pos:pos+n]
97683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Slow path: read from the stream until enough bytes are read,
97783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # or until an EOF occurs or until read() would block.
97883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        chunks = [buf[pos:]]
97983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        wanted = max(self.buffer_size, n)
98083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        while avail < n:
98183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
98283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                chunk = self.raw.read(wanted)
98383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except IOError as e:
98483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if e.errno != EINTR:
98583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    raise
98683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                continue
98783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if chunk in empty_values:
98883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                nodata_val = chunk
98983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                break
99083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            avail += len(chunk)
99183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            chunks.append(chunk)
99283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # n is more then avail only when an EOF occurred or when
99383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # read() would have blocked.
99483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        n = min(n, avail)
99583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        out = b"".join(chunks)
99683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._read_buf = out[n:]  # Save the extra data in the buffer.
99783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._read_pos = 0
99883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return out[:n] if out else nodata_val
99983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
100083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def peek(self, n=0):
100183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Returns buffered bytes without advancing the position.
100283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
100383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        The argument indicates a desired minimal number of bytes; we
100483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        do at most one raw read to satisfy it.  We never return more
100583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        than self.buffer_size.
100683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
100783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with self._read_lock:
100883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return self._peek_unlocked(n)
100983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
101083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _peek_unlocked(self, n=0):
101183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        want = min(n, self.buffer_size)
101283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        have = len(self._read_buf) - self._read_pos
101383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if have < want or have <= 0:
101483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            to_read = self.buffer_size - have
101583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            while True:
101683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                try:
101783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    current = self.raw.read(to_read)
101883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                except IOError as e:
101983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    if e.errno != EINTR:
102083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        raise
102183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    continue
102283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                break
102383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if current:
102483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self._read_buf = self._read_buf[self._read_pos:] + current
102583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self._read_pos = 0
102683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self._read_buf[self._read_pos:]
102783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
102883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def read1(self, n):
102983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Reads up to n bytes, with at most one read() system call."""
103083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Returns up to n bytes.  If at least one byte is buffered, we
103183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # only return buffered bytes.  Otherwise, we do one raw read.
103283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if n < 0:
103383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("number of bytes to read must be positive")
103483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if n == 0:
103583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return b""
103683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with self._read_lock:
103783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._peek_unlocked(1)
103883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return self._read_unlocked(
103983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                min(n, len(self._read_buf) - self._read_pos))
104083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
104183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def tell(self):
104283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return _BufferedIOMixin.tell(self) - len(self._read_buf) + self._read_pos
104383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
104483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def seek(self, pos, whence=0):
104583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not (0 <= whence <= 2):
104683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("invalid whence value")
104783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with self._read_lock:
104883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if whence == 1:
104983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pos -= len(self._read_buf) - self._read_pos
105083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pos = _BufferedIOMixin.seek(self, pos, whence)
105183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._reset_read_buf()
105283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return pos
105383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
105483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass BufferedWriter(_BufferedIOMixin):
105583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
105683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """A buffer for a writeable sequential RawIO object.
105783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
105883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    The constructor creates a BufferedWriter for the given writeable raw
105983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    stream. If the buffer_size is not given, it defaults to
106083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    DEFAULT_BUFFER_SIZE.
106183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
106283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
106383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    _warning_stack_offset = 2
106483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
106583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, raw,
106683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
106783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not raw.writable():
106883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise IOError('"raw" argument must be writable.')
106983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
107083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        _BufferedIOMixin.__init__(self, raw)
107183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if buffer_size <= 0:
107283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("invalid buffer size")
107383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if max_buffer_size is not None:
107483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            warnings.warn("max_buffer_size is deprecated", DeprecationWarning,
107583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                          self._warning_stack_offset)
107683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buffer_size = buffer_size
107783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._write_buf = bytearray()
107883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._write_lock = Lock()
107983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
108083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def write(self, b):
108183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
108283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("write to closed file")
108383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if isinstance(b, unicode):
108483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise TypeError("can't write unicode to binary stream")
108583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with self._write_lock:
108683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # XXX we can implement some more tricks to try and avoid
108783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # partial writes
108883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if len(self._write_buf) > self.buffer_size:
108983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # We're full, so let's pre-flush the buffer.  (This may
109083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # raise BlockingIOError with characters_written == 0.)
109183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self._flush_unlocked()
109283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            before = len(self._write_buf)
109383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._write_buf.extend(b)
109483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            written = len(self._write_buf) - before
109583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if len(self._write_buf) > self.buffer_size:
109683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                try:
109783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self._flush_unlocked()
109883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                except BlockingIOError as e:
109983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    if len(self._write_buf) > self.buffer_size:
110083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        # We've hit the buffer_size. We have to accept a partial
110183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        # write and cut back our buffer.
110283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        overage = len(self._write_buf) - self.buffer_size
110383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        written -= overage
110483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        self._write_buf = self._write_buf[:self.buffer_size]
110583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        raise BlockingIOError(e.errno, e.strerror, written)
110683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return written
110783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
110883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def truncate(self, pos=None):
110983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with self._write_lock:
111083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._flush_unlocked()
111183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if pos is None:
111283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pos = self.raw.tell()
111383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return self.raw.truncate(pos)
111483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
111583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def flush(self):
111683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with self._write_lock:
111783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._flush_unlocked()
111883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
111983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _flush_unlocked(self):
112083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
112183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("flush of closed file")
112283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        while self._write_buf:
112383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
112483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                n = self.raw.write(self._write_buf)
112583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except BlockingIOError:
112683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise RuntimeError("self.raw should implement RawIOBase: it "
112783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                   "should not raise BlockingIOError")
112883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except IOError as e:
112983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if e.errno != EINTR:
113083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    raise
113183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                continue
113283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if n is None:
113383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise BlockingIOError(
113483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    errno.EAGAIN,
113583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    "write could not complete without blocking", 0)
113683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if n > len(self._write_buf) or n < 0:
113783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise IOError("write() returned incorrect number of bytes")
113883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            del self._write_buf[:n]
113983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
114083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def tell(self):
114183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return _BufferedIOMixin.tell(self) + len(self._write_buf)
114283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
114383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def seek(self, pos, whence=0):
114483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not (0 <= whence <= 2):
114583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("invalid whence")
114683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with self._write_lock:
114783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._flush_unlocked()
114883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return _BufferedIOMixin.seek(self, pos, whence)
114983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
115083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
115183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass BufferedRWPair(BufferedIOBase):
115283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
115383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """A buffered reader and writer object together.
115483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
115583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    A buffered reader object and buffered writer object put together to
115683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    form a sequential IO object that can read and write. This is typically
115783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    used with a socket or two-way pipe.
115883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
115983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    reader and writer are RawIOBase objects that are readable and
116083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    writeable respectively. If the buffer_size is omitted it defaults to
116183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    DEFAULT_BUFFER_SIZE.
116283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
116383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
116483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # XXX The usefulness of this (compared to having two separate IO
116583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # objects) is questionable.
116683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
116783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, reader, writer,
116883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
116983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Constructor.
117083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
117183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        The arguments are two RawIO instances.
117283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
117383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if max_buffer_size is not None:
117483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            warnings.warn("max_buffer_size is deprecated", DeprecationWarning, 2)
117583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
117683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not reader.readable():
117783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise IOError('"reader" argument must be readable.')
117883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
117983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not writer.writable():
118083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise IOError('"writer" argument must be writable.')
118183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
118283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.reader = BufferedReader(reader, buffer_size)
118383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.writer = BufferedWriter(writer, buffer_size)
118483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
118583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def read(self, n=None):
118683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if n is None:
118783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            n = -1
118883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.reader.read(n)
118983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
119083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def readinto(self, b):
119183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.reader.readinto(b)
119283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
119383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def write(self, b):
119483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.writer.write(b)
119583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
119683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def peek(self, n=0):
119783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.reader.peek(n)
119883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
119983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def read1(self, n):
120083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.reader.read1(n)
120183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
120283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def readable(self):
120383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.reader.readable()
120483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
120583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def writable(self):
120683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.writer.writable()
120783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
120883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def flush(self):
120983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.writer.flush()
121083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
121183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def close(self):
121283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.writer.close()
121383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.reader.close()
121483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
121583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def isatty(self):
121683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.reader.isatty() or self.writer.isatty()
121783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
121883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
121983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def closed(self):
122083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.writer.closed
122183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
122283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
122383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass BufferedRandom(BufferedWriter, BufferedReader):
122483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
122583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """A buffered interface to random access streams.
122683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
122783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    The constructor creates a reader and writer for a seekable stream,
122883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    raw, given in the first argument. If the buffer_size is omitted it
122983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    defaults to DEFAULT_BUFFER_SIZE.
123083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
123183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
123283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    _warning_stack_offset = 3
123383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
123483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, raw,
123583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
123683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raw._checkSeekable()
123783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        BufferedReader.__init__(self, raw, buffer_size)
123883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        BufferedWriter.__init__(self, raw, buffer_size, max_buffer_size)
123983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
124083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def seek(self, pos, whence=0):
124183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not (0 <= whence <= 2):
124283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("invalid whence")
124383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.flush()
124483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self._read_buf:
124583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Undo read ahead.
124683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            with self._read_lock:
124783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.raw.seek(self._read_pos - len(self._read_buf), 1)
124883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # First do the raw seek, then empty the read buffer, so that
124983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # if the raw seek fails, we don't lose buffered data forever.
125083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        pos = self.raw.seek(pos, whence)
125183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with self._read_lock:
125283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._reset_read_buf()
125383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if pos < 0:
125483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise IOError("seek() returned invalid position")
125583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return pos
125683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
125783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def tell(self):
125883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self._write_buf:
125983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return BufferedWriter.tell(self)
126083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
126183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return BufferedReader.tell(self)
126283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
126383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def truncate(self, pos=None):
126483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if pos is None:
126583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pos = self.tell()
126683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Use seek to flush the read buffer.
126783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return BufferedWriter.truncate(self, pos)
126883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
126983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def read(self, n=None):
127083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if n is None:
127183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            n = -1
127283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.flush()
127383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return BufferedReader.read(self, n)
127483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
127583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def readinto(self, b):
127683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.flush()
127783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return BufferedReader.readinto(self, b)
127883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
127983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def peek(self, n=0):
128083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.flush()
128183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return BufferedReader.peek(self, n)
128283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
128383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def read1(self, n):
128483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.flush()
128583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return BufferedReader.read1(self, n)
128683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
128783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def write(self, b):
128883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self._read_buf:
128983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Undo readahead
129083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            with self._read_lock:
129183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.raw.seek(self._read_pos - len(self._read_buf), 1)
129283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self._reset_read_buf()
129383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return BufferedWriter.write(self, b)
129483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
129583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
129683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TextIOBase(IOBase):
129783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
129883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Base class for text I/O.
129983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
130083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    This class provides a character and line based interface to stream
130183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    I/O. There is no readinto method because Python's character strings
130283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    are immutable. There is no public constructor.
130383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
130483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
130583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def read(self, n=-1):
130683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Read at most n characters from stream.
130783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
130883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Read from underlying buffer until we have n characters or we hit EOF.
130983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        If n is negative or omitted, read until EOF.
131083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
131183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._unsupported("read")
131283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
131383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def write(self, s):
131483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Write string s to stream."""
131583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._unsupported("write")
131683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
131783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def truncate(self, pos=None):
131883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Truncate size to pos."""
131983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._unsupported("truncate")
132083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
132183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def readline(self):
132283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Read until newline or EOF.
132383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
132483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Returns an empty string if EOF is hit immediately.
132583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
132683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._unsupported("readline")
132783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
132883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def detach(self):
132983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
133083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Separate the underlying buffer from the TextIOBase and return it.
133183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
133283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        After the underlying buffer has been detached, the TextIO is in an
133383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        unusable state.
133483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
133583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._unsupported("detach")
133683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
133783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
133883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def encoding(self):
133983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Subclasses should override."""
134083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return None
134183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
134283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
134383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def newlines(self):
134483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Line endings translated so far.
134583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
134683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Only line endings translated during reading are considered.
134783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
134883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Subclasses should override.
134983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
135083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return None
135183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
135283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
135383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def errors(self):
135483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Error setting of the decoder or encoder.
135583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
135683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Subclasses should override."""
135783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return None
135883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
135983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehio.TextIOBase.register(TextIOBase)
136083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
136183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
136283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass IncrementalNewlineDecoder(codecs.IncrementalDecoder):
136383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    r"""Codec used when reading a file in universal newlines mode.  It wraps
136483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    another incremental decoder, translating \r\n and \r into \n.  It also
136583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    records the types of newlines encountered.  When used with
136683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    translate=False, it ensures that the newline sequence is returned in
136783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    one piece.
136883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
136983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, decoder, translate, errors='strict'):
137083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        codecs.IncrementalDecoder.__init__(self, errors=errors)
137183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.translate = translate
137283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.decoder = decoder
137383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.seennl = 0
137483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.pendingcr = False
137583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
137683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def decode(self, input, final=False):
137783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # decode input (with the eventual \r from a previous pass)
137883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.decoder is None:
137983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            output = input
138083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
138183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            output = self.decoder.decode(input, final=final)
138283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.pendingcr and (output or final):
138383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            output = "\r" + output
138483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.pendingcr = False
138583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
138683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # retain last \r even when not translating data:
138783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # then readline() is sure to get \r\n in one pass
138883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if output.endswith("\r") and not final:
138983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            output = output[:-1]
139083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.pendingcr = True
139183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
139283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Record which newlines are read
139383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        crlf = output.count('\r\n')
139483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        cr = output.count('\r') - crlf
139583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        lf = output.count('\n') - crlf
139683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.seennl |= (lf and self._LF) | (cr and self._CR) \
139783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    | (crlf and self._CRLF)
139883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
139983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.translate:
140083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if crlf:
140183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                output = output.replace("\r\n", "\n")
140283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if cr:
140383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                output = output.replace("\r", "\n")
140483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
140583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return output
140683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
140783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def getstate(self):
140883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.decoder is None:
140983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            buf = b""
141083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            flag = 0
141183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
141283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            buf, flag = self.decoder.getstate()
141383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        flag <<= 1
141483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.pendingcr:
141583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            flag |= 1
141683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return buf, flag
141783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
141883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def setstate(self, state):
141983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        buf, flag = state
142083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.pendingcr = bool(flag & 1)
142183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.decoder is not None:
142283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.decoder.setstate((buf, flag >> 1))
142383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
142483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def reset(self):
142583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.seennl = 0
142683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.pendingcr = False
142783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.decoder is not None:
142883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.decoder.reset()
142983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
143083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    _LF = 1
143183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    _CR = 2
143283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    _CRLF = 4
143383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
143483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
143583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def newlines(self):
143683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return (None,
143783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                "\n",
143883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                "\r",
143983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                ("\r", "\n"),
144083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                "\r\n",
144183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                ("\n", "\r\n"),
144283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                ("\r", "\r\n"),
144383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                ("\r", "\n", "\r\n")
144483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh               )[self.seennl]
144583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
144683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
144783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TextIOWrapper(TextIOBase):
144883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
144983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    r"""Character and line based layer over a BufferedIOBase object, buffer.
145083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
145183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    encoding gives the name of the encoding that the stream will be
145283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    decoded or encoded with. It defaults to locale.getpreferredencoding.
145383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
145483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    errors determines the strictness of encoding and decoding (see the
145583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    codecs.register) and defaults to "strict".
145683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
145783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    newline can be None, '', '\n', '\r', or '\r\n'.  It controls the
145883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    handling of line endings. If it is None, universal newlines is
145983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    enabled.  With this enabled, on input, the lines endings '\n', '\r',
146083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    or '\r\n' are translated to '\n' before being returned to the
146183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    caller. Conversely, on output, '\n' is translated to the system
146283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    default line separator, os.linesep. If newline is any other of its
146383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    legal values, that newline becomes the newline when the file is read
146483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    and it is returned untranslated. On output, '\n' is converted to the
146583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    newline.
146683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
146783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    If line_buffering is True, a call to flush is implied when a call to
146883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    write contains a newline character.
146983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
147083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
147183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    _CHUNK_SIZE = 2048
147283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
147383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, buffer, encoding=None, errors=None, newline=None,
147483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 line_buffering=False):
147583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if newline is not None and not isinstance(newline, basestring):
147683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise TypeError("illegal newline type: %r" % (type(newline),))
147783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if newline not in (None, "", "\n", "\r", "\r\n"):
147883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("illegal newline value: %r" % (newline,))
147983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if encoding is None:
148083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
148183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                import locale
148283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except ImportError:
148383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # Importing locale may fail if Python is being built
148483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                encoding = "ascii"
148583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else:
148683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                encoding = locale.getpreferredencoding()
148783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
148883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not isinstance(encoding, basestring):
148983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("invalid encoding: %r" % encoding)
149083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
149183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if errors is None:
149283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            errors = "strict"
149383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
149483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if not isinstance(errors, basestring):
149583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise ValueError("invalid errors: %r" % errors)
149683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
149783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._buffer = buffer
149883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._line_buffering = line_buffering
149983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._encoding = encoding
150083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._errors = errors
150183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._readuniversal = not newline
150283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._readtranslate = newline is None
150383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._readnl = newline
150483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._writetranslate = newline != ''
150583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._writenl = newline or os.linesep
150683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._encoder = None
150783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._decoder = None
150883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._decoded_chars = ''  # buffer for text returned from decoder
150983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._decoded_chars_used = 0  # offset into _decoded_chars for read()
151083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._snapshot = None  # info for reconstructing decoder state
151183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._seekable = self._telling = self.buffer.seekable()
151283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
151383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self._seekable and self.writable():
151483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            position = self.buffer.tell()
151583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if position != 0:
151683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                try:
151783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self._get_encoder().setstate(0)
151883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                except LookupError:
151983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    # Sometimes the encoder doesn't exist
152083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    pass
152183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
152283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # self._snapshot is either None, or a tuple (dec_flags, next_input)
152383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # where dec_flags is the second (integer) item of the decoder state
152483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # and next_input is the chunk of input bytes that comes next after the
152583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # snapshot point.  We use this to reconstruct decoder states in tell().
152683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
152783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Naming convention:
152883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    #   - "bytes_..." for integer variables that count input bytes
152983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    #   - "chars_..." for integer variables that count decoded characters
153083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
153183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __repr__(self):
153283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
153383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            name = self.name
153483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except AttributeError:
153583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return "<_pyio.TextIOWrapper encoding='{0}'>".format(self.encoding)
153683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
153783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return "<_pyio.TextIOWrapper name={0!r} encoding='{1}'>".format(
153883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                name, self.encoding)
153983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
154083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
154183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def encoding(self):
154283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self._encoding
154383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
154483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
154583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def errors(self):
154683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self._errors
154783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
154883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
154983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def line_buffering(self):
155083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self._line_buffering
155183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
155283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
155383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def buffer(self):
155483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self._buffer
155583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
155683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def seekable(self):
155783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
155883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("I/O operation on closed file.")
155983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self._seekable
156083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
156183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def readable(self):
156283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.buffer.readable()
156383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
156483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def writable(self):
156583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.buffer.writable()
156683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
156783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def flush(self):
156883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buffer.flush()
156983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._telling = self._seekable
157083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
157183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def close(self):
157283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.buffer is not None and not self.closed:
157383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
157483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.flush()
157583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            finally:
157683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.buffer.close()
157783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
157883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
157983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def closed(self):
158083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.buffer.closed
158183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
158283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
158383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def name(self):
158483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.buffer.name
158583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
158683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def fileno(self):
158783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.buffer.fileno()
158883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
158983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def isatty(self):
159083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.buffer.isatty()
159183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
159283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def write(self, s):
159383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
159483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("write to closed file")
159583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not isinstance(s, unicode):
159683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise TypeError("can't write %s to text stream" %
159783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                            s.__class__.__name__)
159883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        length = len(s)
159983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        haslf = (self._writetranslate or self._line_buffering) and "\n" in s
160083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if haslf and self._writetranslate and self._writenl != "\n":
160183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            s = s.replace("\n", self._writenl)
160283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        encoder = self._encoder or self._get_encoder()
160383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # XXX What if we were just reading?
160483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        b = encoder.encode(s)
160583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buffer.write(b)
160683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self._line_buffering and (haslf or "\r" in s):
160783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.flush()
160883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._snapshot = None
160983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self._decoder:
161083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._decoder.reset()
161183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return length
161283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
161383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _get_encoder(self):
161483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        make_encoder = codecs.getincrementalencoder(self._encoding)
161583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._encoder = make_encoder(self._errors)
161683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self._encoder
161783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
161883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _get_decoder(self):
161983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        make_decoder = codecs.getincrementaldecoder(self._encoding)
162083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        decoder = make_decoder(self._errors)
162183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self._readuniversal:
162283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            decoder = IncrementalNewlineDecoder(decoder, self._readtranslate)
162383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._decoder = decoder
162483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return decoder
162583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
162683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # The following three methods implement an ADT for _decoded_chars.
162783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Text returned from the decoder is buffered here until the client
162883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # requests it by calling our read() or readline() method.
162983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _set_decoded_chars(self, chars):
163083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Set the _decoded_chars buffer."""
163183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._decoded_chars = chars
163283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._decoded_chars_used = 0
163383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
163483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _get_decoded_chars(self, n=None):
163583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Advance into the _decoded_chars buffer."""
163683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        offset = self._decoded_chars_used
163783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if n is None:
163883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            chars = self._decoded_chars[offset:]
163983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
164083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            chars = self._decoded_chars[offset:offset + n]
164183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._decoded_chars_used += len(chars)
164283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return chars
164383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
164483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _rewind_decoded_chars(self, n):
164583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Rewind the _decoded_chars buffer."""
164683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self._decoded_chars_used < n:
164783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise AssertionError("rewind decoded_chars out of bounds")
164883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._decoded_chars_used -= n
164983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
165083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _read_chunk(self):
165183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
165283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Read and decode the next chunk of data from the BufferedReader.
165383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
165483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
165583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # The return value is True unless EOF was reached.  The decoded
165683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # string is placed in self._decoded_chars (replacing its previous
165783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # value).  The entire input chunk is sent to the decoder, though
165883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # some of it may remain buffered in the decoder, yet to be
165983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # converted.
166083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
166183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self._decoder is None:
166283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("no decoder")
166383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
166483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self._telling:
166583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # To prepare for tell(), we need to snapshot a point in the
166683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # file where the decoder's input buffer is empty.
166783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
166883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            dec_buffer, dec_flags = self._decoder.getstate()
166983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Given this, we know there was a valid snapshot point
167083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # len(dec_buffer) bytes ago with decoder state (b'', dec_flags).
167183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
167283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Read a chunk, decode it, and put the result in self._decoded_chars.
167383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        input_chunk = self.buffer.read1(self._CHUNK_SIZE)
167483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        eof = not input_chunk
167583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._set_decoded_chars(self._decoder.decode(input_chunk, eof))
167683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
167783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self._telling:
167883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # At the snapshot point, len(dec_buffer) bytes before the read,
167983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # the next input to be decoded is dec_buffer + input_chunk.
168083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._snapshot = (dec_flags, dec_buffer + input_chunk)
168183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
168283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return not eof
168383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
168483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _pack_cookie(self, position, dec_flags=0,
168583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                           bytes_to_feed=0, need_eof=0, chars_to_skip=0):
168683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # The meaning of a tell() cookie is: seek to position, set the
168783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # decoder flags to dec_flags, read bytes_to_feed bytes, feed them
168883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # into the decoder with need_eof as the EOF flag, then skip
168983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # chars_to_skip characters of the decoded result.  For most simple
169083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # decoders, tell() will often just give a byte offset in the file.
169183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return (position | (dec_flags<<64) | (bytes_to_feed<<128) |
169283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh               (chars_to_skip<<192) | bool(need_eof)<<256)
169383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
169483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _unpack_cookie(self, bigint):
169583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        rest, position = divmod(bigint, 1<<64)
169683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        rest, dec_flags = divmod(rest, 1<<64)
169783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        rest, bytes_to_feed = divmod(rest, 1<<64)
169883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        need_eof, chars_to_skip = divmod(rest, 1<<64)
169983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return position, dec_flags, bytes_to_feed, need_eof, chars_to_skip
170083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
170183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def tell(self):
170283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not self._seekable:
170383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise IOError("underlying stream is not seekable")
170483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not self._telling:
170583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise IOError("telling position disabled by next() call")
170683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.flush()
170783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        position = self.buffer.tell()
170883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        decoder = self._decoder
170983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if decoder is None or self._snapshot is None:
171083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self._decoded_chars:
171183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # This should never happen.
171283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise AssertionError("pending decoded text")
171383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return position
171483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
171583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Skip backward to the snapshot point (see _read_chunk).
171683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        dec_flags, next_input = self._snapshot
171783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        position -= len(next_input)
171883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
171983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # How many decoded characters have been used up since the snapshot?
172083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        chars_to_skip = self._decoded_chars_used
172183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if chars_to_skip == 0:
172283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # We haven't moved from the snapshot point.
172383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return self._pack_cookie(position, dec_flags)
172483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
172583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Starting from the snapshot position, we will walk the decoder
172683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # forward until it gives us enough decoded characters.
172783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        saved_state = decoder.getstate()
172883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
172983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Note our initial start point.
173083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            decoder.setstate((b'', dec_flags))
173183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            start_pos = position
173283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            start_flags, bytes_fed, chars_decoded = dec_flags, 0, 0
173383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            need_eof = 0
173483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
173583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Feed the decoder one byte at a time.  As we go, note the
173683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # nearest "safe start point" before the current location
173783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # (a point where the decoder has nothing buffered, so seek()
173883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # can safely start from there and advance to this location).
173983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for next_byte in next_input:
174083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                bytes_fed += 1
174183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                chars_decoded += len(decoder.decode(next_byte))
174283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                dec_buffer, dec_flags = decoder.getstate()
174383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if not dec_buffer and chars_decoded <= chars_to_skip:
174483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    # Decoder buffer is empty, so this is a safe start point.
174583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    start_pos += bytes_fed
174683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    chars_to_skip -= chars_decoded
174783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    start_flags, bytes_fed, chars_decoded = dec_flags, 0, 0
174883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if chars_decoded >= chars_to_skip:
174983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    break
175083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else:
175183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # We didn't get enough decoded data; signal EOF to get more.
175283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                chars_decoded += len(decoder.decode(b'', final=True))
175383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                need_eof = 1
175483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if chars_decoded < chars_to_skip:
175583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    raise IOError("can't reconstruct logical file position")
175683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
175783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # The returned cookie corresponds to the last safe start point.
175883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return self._pack_cookie(
175983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                start_pos, start_flags, bytes_fed, need_eof, chars_to_skip)
176083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        finally:
176183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            decoder.setstate(saved_state)
176283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
176383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def truncate(self, pos=None):
176483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.flush()
176583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if pos is None:
176683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pos = self.tell()
176783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.buffer.truncate(pos)
176883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
176983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def detach(self):
177083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.buffer is None:
177183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("buffer is already detached")
177283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.flush()
177383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        buffer = self._buffer
177483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._buffer = None
177583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return buffer
177683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
177783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def seek(self, cookie, whence=0):
177883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
177983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("tell on closed file")
178083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not self._seekable:
178183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise IOError("underlying stream is not seekable")
178283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if whence == 1: # seek relative to current position
178383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if cookie != 0:
178483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise IOError("can't do nonzero cur-relative seeks")
178583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Seeking to the current position should attempt to
178683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # sync the underlying buffer with the current position.
178783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            whence = 0
178883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            cookie = self.tell()
178983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if whence == 2: # seek relative to end of file
179083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if cookie != 0:
179183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise IOError("can't do nonzero end-relative seeks")
179283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.flush()
179383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            position = self.buffer.seek(0, 2)
179483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._set_decoded_chars('')
179583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._snapshot = None
179683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self._decoder:
179783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self._decoder.reset()
179883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return position
179983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if whence != 0:
180083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("invalid whence (%r, should be 0, 1 or 2)" %
180183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                             (whence,))
180283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if cookie < 0:
180383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("negative seek position %r" % (cookie,))
180483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.flush()
180583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
180683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # The strategy of seek() is to go back to the safe start point
180783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # and replay the effect of read(chars_to_skip) from there.
180883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        start_pos, dec_flags, bytes_to_feed, need_eof, chars_to_skip = \
180983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._unpack_cookie(cookie)
181083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
181183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Seek back to the safe start point.
181283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buffer.seek(start_pos)
181383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._set_decoded_chars('')
181483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._snapshot = None
181583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
181683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Restore the decoder to its state from the safe start point.
181783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if cookie == 0 and self._decoder:
181883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._decoder.reset()
181983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif self._decoder or dec_flags or chars_to_skip:
182083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._decoder = self._decoder or self._get_decoder()
182183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._decoder.setstate((b'', dec_flags))
182283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._snapshot = (dec_flags, b'')
182383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
182483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if chars_to_skip:
182583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Just like _read_chunk, feed the decoder and save a snapshot.
182683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            input_chunk = self.buffer.read(bytes_to_feed)
182783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._set_decoded_chars(
182883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self._decoder.decode(input_chunk, need_eof))
182983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._snapshot = (dec_flags, input_chunk)
183083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
183183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Skip chars_to_skip of the decoded characters.
183283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if len(self._decoded_chars) < chars_to_skip:
183383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise IOError("can't restore logical file position")
183483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._decoded_chars_used = chars_to_skip
183583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
183683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Finally, reset the encoder (merely useful for proper BOM handling)
183783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
183883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            encoder = self._encoder or self._get_encoder()
183983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except LookupError:
184083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Sometimes the encoder doesn't exist
184183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pass
184283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
184383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if cookie != 0:
184483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                encoder.setstate(0)
184583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else:
184683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                encoder.reset()
184783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return cookie
184883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
184983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def read(self, n=None):
185083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._checkReadable()
185183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if n is None:
185283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            n = -1
185383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        decoder = self._decoder or self._get_decoder()
185483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
185583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            n.__index__
185683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except AttributeError:
185783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise TypeError("an integer is required")
185883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if n < 0:
185983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Read everything.
186083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            result = (self._get_decoded_chars() +
186183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                      decoder.decode(self.buffer.read(), final=True))
186283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._set_decoded_chars('')
186383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._snapshot = None
186483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return result
186583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
186683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Keep reading chunks until we have n characters to return.
186783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            eof = False
186883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            result = self._get_decoded_chars(n)
186983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            while len(result) < n and not eof:
187083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                eof = not self._read_chunk()
187183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                result += self._get_decoded_chars(n - len(result))
187283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return result
187383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
187483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def next(self):
187583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._telling = False
187683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        line = self.readline()
187783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not line:
187883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._snapshot = None
187983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._telling = self._seekable
188083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise StopIteration
188183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return line
188283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
188383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def readline(self, limit=None):
188483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.closed:
188583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("read from closed file")
188683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if limit is None:
188783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            limit = -1
188883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif not isinstance(limit, (int, long)):
188983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise TypeError("limit must be an integer")
189083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
189183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Grab all the decoded text (we will rewind any extra bits later).
189283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        line = self._get_decoded_chars()
189383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
189483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        start = 0
189583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Make the decoder if it doesn't already exist.
189683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not self._decoder:
189783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._get_decoder()
189883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
189983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        pos = endpos = None
190083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        while True:
190183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self._readtranslate:
190283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # Newlines are already translated, only search for \n
190383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pos = line.find('\n', start)
190483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if pos >= 0:
190583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    endpos = pos + 1
190683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    break
190783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                else:
190883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    start = len(line)
190983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
191083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            elif self._readuniversal:
191183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # Universal newline search. Find any of \r, \r\n, \n
191283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # The decoder ensures that \r\n are not split in two pieces
191383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
191483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # In C we'd look for these in parallel of course.
191583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                nlpos = line.find("\n", start)
191683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                crpos = line.find("\r", start)
191783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if crpos == -1:
191883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    if nlpos == -1:
191983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        # Nothing found
192083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        start = len(line)
192183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    else:
192283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        # Found \n
192383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        endpos = nlpos + 1
192483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        break
192583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                elif nlpos == -1:
192683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    # Found lone \r
192783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    endpos = crpos + 1
192883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    break
192983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                elif nlpos < crpos:
193083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    # Found \n
193183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    endpos = nlpos + 1
193283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    break
193383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                elif nlpos == crpos + 1:
193483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    # Found \r\n
193583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    endpos = crpos + 2
193683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    break
193783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                else:
193883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    # Found \r
193983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    endpos = crpos + 1
194083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    break
194183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else:
194283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # non-universal
194383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                pos = line.find(self._readnl)
194483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if pos >= 0:
194583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    endpos = pos + len(self._readnl)
194683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    break
194783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
194883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if limit >= 0 and len(line) >= limit:
194983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                endpos = limit  # reached length limit
195083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                break
195183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
195283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # No line ending seen yet - get more data'
195383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            while self._read_chunk():
195483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if self._decoded_chars:
195583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    break
195683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self._decoded_chars:
195783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                line += self._get_decoded_chars()
195883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else:
195983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # end of file
196083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self._set_decoded_chars('')
196183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self._snapshot = None
196283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return line
196383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
196483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if limit >= 0 and endpos > limit:
196583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            endpos = limit  # don't exceed limit
196683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
196783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Rewind _decoded_chars to just after the line ending we found.
196883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._rewind_decoded_chars(len(line) - endpos)
196983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return line[:endpos]
197083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
197183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
197283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def newlines(self):
197383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self._decoder.newlines if self._decoder else None
197483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
197583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
197683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass StringIO(TextIOWrapper):
197783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Text I/O implementation using an in-memory buffer.
197883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
197983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    The initial_value argument sets the value of object.  The newline
198083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    argument is like the one of TextIOWrapper's constructor.
198183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
198283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
198383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, initial_value="", newline="\n"):
198483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        super(StringIO, self).__init__(BytesIO(),
198583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                       encoding="utf-8",
198683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                       errors="strict",
198783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                       newline=newline)
198883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Issue #5645: make universal newlines semantics the same as in the
198983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # C version, even under Windows.
199083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if newline is None:
199183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._writetranslate = False
199283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if initial_value:
199383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if not isinstance(initial_value, unicode):
199483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                initial_value = unicode(initial_value)
199583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.write(initial_value)
199683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.seek(0)
199783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
199883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def getvalue(self):
199983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.flush()
200083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.buffer.getvalue().decode(self._encoding, self._errors)
200183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
200283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __repr__(self):
200383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # TextIOWrapper tells the encoding in its repr. In StringIO,
200483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # that's a implementation detail.
200583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return object.__repr__(self)
200683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
200783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
200883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def errors(self):
200983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return None
201083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
201183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
201283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def encoding(self):
201383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return None
201483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
201583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def detach(self):
201683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # This doesn't make sense on StringIO.
201783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._unsupported("detach")
2018