14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""
24adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoPython implementation of the io module.
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom __future__ import (print_function, unicode_literals)
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport abc
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport codecs
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport warnings
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport errno
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Import thread instead of threading to reduce startup cost
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry:
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from thread import allocate_lock as Lock
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept ImportError:
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from dummy_thread import allocate_lock as Lock
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport io
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom io import (__all__, SEEK_SET, SEEK_CUR, SEEK_END)
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom errno import EINTR
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__metaclass__ = type
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# open() uses st_blksize whenever we can
254adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoDEFAULT_BUFFER_SIZE = 8 * 1024  # bytes
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# NOTE: Base classes defined here are registered with the "official" ABCs
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# defined in io.py. We don't use real inheritance though, because we don't
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# want to inherit the C implementations.
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BlockingIOError(IOError):
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Exception raised when I/O would block on a non-blocking I/O stream."""
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, errno, strerror, characters_written=0):
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        super(IOError, self).__init__(errno, strerror)
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not isinstance(characters_written, (int, long)):
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise TypeError("characters_written must be a integer")
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.characters_written = characters_written
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef open(file, mode="r", buffering=-1,
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         encoding=None, errors=None,
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         newline=None, closefd=True):
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    r"""Open file and return a stream.  Raise IOError upon failure.
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    file is either a text or byte string giving the name (and the path
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if the file isn't in the current working directory) of the file to
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    be opened or an integer file descriptor of the file to be
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    wrapped. (If a file descriptor is given, it is closed when the
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    returned I/O object is closed, unless closefd is set to False.)
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    mode is an optional string that specifies the mode in which the file
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    is opened. It defaults to 'r' which means open for reading in text
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    mode.  Other common values are 'w' for writing (truncating the file if
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    it already exists), and 'a' for appending (which on some Unix systems,
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    means that all writes append to the end of the file regardless of the
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    current seek position). In text mode, if encoding is not specified the
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    encoding used is platform dependent. (For reading and writing raw
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    bytes use binary mode and leave encoding unspecified.) The available
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    modes are:
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ========= ===============================================================
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Character Meaning
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    --------- ---------------------------------------------------------------
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'r'       open for reading (default)
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'w'       open for writing, truncating the file first
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'a'       open for writing, appending to the end of the file if it exists
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'b'       binary mode
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    't'       text mode (default)
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '+'       open a disk file for updating (reading and writing)
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'U'       universal newline mode (for backwards compatibility; unneeded
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              for new code)
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ========= ===============================================================
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    The default mode is 'rt' (open for reading text). For binary random
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    access, the mode 'w+b' opens and truncates the file to 0 bytes, while
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'r+b' opens the file without truncation.
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Python distinguishes between files opened in binary and text modes,
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    even when the underlying operating system doesn't. Files opened in
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    binary mode (appending 'b' to the mode argument) return contents as
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    bytes objects without any decoding. In text mode (the default, or when
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    't' is appended to the mode argument), the contents of the file are
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    returned as strings, the bytes having been first decoded using a
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    platform-dependent encoding or using the specified encoding if given.
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    buffering is an optional integer used to set the buffering policy.
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Pass 0 to switch buffering off (only allowed in binary mode), 1 to select
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    line buffering (only usable in text mode), and an integer > 1 to indicate
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    the size of a fixed-size chunk buffer.  When no buffering argument is
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    given, the default buffering policy works as follows:
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    * Binary files are buffered in fixed-size chunks; the size of the buffer
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      is chosen using a heuristic trying to determine the underlying device's
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      "block size" and falling back on `io.DEFAULT_BUFFER_SIZE`.
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      On many systems, the buffer will typically be 4096 or 8192 bytes long.
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    * "Interactive" text files (files for which isatty() returns True)
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      use line buffering.  Other text files use the policy described above
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      for binary files.
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    encoding is the name of the encoding used to decode or encode the
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    file. This should only be used in text mode. The default encoding is
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    platform dependent, but any encoding supported by Python can be
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    passed.  See the codecs module for the list of supported encodings.
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    errors is an optional string that specifies how encoding errors are to
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    be handled---this argument should not be used in binary mode. Pass
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'strict' to raise a ValueError exception if there is an encoding error
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (the default of None has the same effect), or pass 'ignore' to ignore
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    errors. (Note that ignoring encoding errors can lead to data loss.)
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    See the documentation for codecs.register for a list of the permitted
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    encoding error strings.
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    newline controls how universal newlines works (it only applies to text
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    mode). It can be None, '', '\n', '\r', and '\r\n'.  It works as
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    follows:
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    * On input, if newline is None, universal newlines mode is
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      enabled. Lines in the input can end in '\n', '\r', or '\r\n', and
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      these are translated into '\n' before being returned to the
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      caller. If it is '', universal newline mode is enabled, but line
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      endings are returned to the caller untranslated. If it has any of
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      the other legal values, input lines are only terminated by the given
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      string, and the line ending is returned to the caller untranslated.
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    * On output, if newline is None, any '\n' characters written are
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      translated to the system default line separator, os.linesep. If
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      newline is '', no translation takes place. If newline is any of the
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      other legal values, any '\n' characters written are translated to
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      the given string.
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    If closefd is False, the underlying file descriptor will be kept open
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    when the file is closed. This does not work when a file name is given
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    and must be True in that case.
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    open() returns a file object whose type depends on the mode, and
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    through which the standard file operations such as reading and writing
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    are performed. When open() is used to open a file in a text mode ('w',
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'r', 'wt', 'rt', etc.), it returns a TextIOWrapper. When used to open
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    a file in a binary mode, the returned class varies: in read binary
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    mode, it returns a BufferedReader; in write binary and append binary
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    modes, it returns a BufferedWriter, and in read/write mode, it returns
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    a BufferedRandom.
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    It is also possible to use a string or bytearray as a file for both
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    reading and writing. For strings StringIO can be used like a file
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    opened in a text mode, and for bytes a BytesIO can be used like a file
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    opened in a binary mode.
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not isinstance(file, (basestring, int, long)):
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise TypeError("invalid file: %r" % file)
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not isinstance(mode, basestring):
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise TypeError("invalid mode: %r" % mode)
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not isinstance(buffering, (int, long)):
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise TypeError("invalid buffering: %r" % buffering)
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if encoding is not None and not isinstance(encoding, basestring):
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise TypeError("invalid encoding: %r" % encoding)
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if errors is not None and not isinstance(errors, basestring):
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise TypeError("invalid errors: %r" % errors)
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    modes = set(mode)
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if modes - set("arwb+tU") or len(mode) > len(modes):
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise ValueError("invalid mode: %r" % mode)
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    reading = "r" in modes
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    writing = "w" in modes
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    appending = "a" in modes
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    updating = "+" in modes
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    text = "t" in modes
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    binary = "b" in modes
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if "U" in modes:
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if writing or appending:
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("can't use U and writing mode at once")
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        reading = True
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if text and binary:
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise ValueError("can't have text and binary mode at once")
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if reading + writing + appending > 1:
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise ValueError("can't have read/write/append mode at once")
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not (reading or writing or appending):
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise ValueError("must have exactly one of read/write/append mode")
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if binary and encoding is not None:
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise ValueError("binary mode doesn't take an encoding argument")
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if binary and errors is not None:
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise ValueError("binary mode doesn't take an errors argument")
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if binary and newline is not None:
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise ValueError("binary mode doesn't take a newline argument")
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    raw = FileIO(file,
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 (reading and "r" or "") +
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 (writing and "w" or "") +
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 (appending and "a" or "") +
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 (updating and "+" or ""),
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 closefd)
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    line_buffering = False
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if buffering == 1 or buffering < 0 and raw.isatty():
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        buffering = -1
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        line_buffering = True
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if buffering < 0:
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        buffering = DEFAULT_BUFFER_SIZE
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bs = os.fstat(raw.fileno()).st_blksize
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except (os.error, AttributeError):
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if bs > 1:
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                buffering = bs
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if buffering < 0:
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise ValueError("invalid buffering size")
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if buffering == 0:
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if binary:
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return raw
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise ValueError("can't have unbuffered text I/O")
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if updating:
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        buffer = BufferedRandom(raw, buffering)
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    elif writing or appending:
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        buffer = BufferedWriter(raw, buffering)
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    elif reading:
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        buffer = BufferedReader(raw, buffering)
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise ValueError("unknown mode: %r" % mode)
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if binary:
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return buffer
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    text = TextIOWrapper(buffer, encoding, errors, newline, line_buffering)
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    text.mode = mode
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return text
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass DocDescriptor:
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Helper for builtins.open.__doc__
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __get__(self, obj, typ):
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return (
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "open(file, mode='r', buffering=-1, encoding=None, "
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 "errors=None, newline=None, closefd=True)\n\n" +
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            open.__doc__)
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass OpenWrapper:
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Wrapper for builtins.open
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Trick so that open won't become a bound method when stored
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    as a class variable (as dbm.dumb does).
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    See initstdio() in Python/pythonrun.c.
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __doc__ = DocDescriptor()
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __new__(cls, *args, **kwargs):
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return open(*args, **kwargs)
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass UnsupportedOperation(ValueError, IOError):
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass IOBase:
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __metaclass__ = abc.ABCMeta
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """The abstract base class for all I/O classes, acting on streams of
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    bytes. There is no public constructor.
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    This class provides dummy implementations for many methods that
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    derived classes can override selectively; the default implementations
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    represent a file that cannot be read, written or seeked.
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Even though IOBase does not declare read, readinto, or write because
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    their signatures will vary, implementations and clients should
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    consider those methods part of the interface. Also, implementations
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    may raise a IOError when operations they do not support are called.
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    The basic type used for binary data read from or written to a file is
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    bytes. bytearrays are accepted too, and in some cases (such as
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    readinto) needed. Text I/O classes work with str data.
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Note that calling any method (even inquiries) on a closed stream is
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    undefined. Implementations may raise IOError in this case.
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    IOBase (and its subclasses) support the iterator protocol, meaning
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    that an IOBase object can be iterated over yielding the lines in a
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    stream.
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    IOBase also supports the :keyword:`with` statement. In this example,
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    fp is closed after the suite of the with statement is complete:
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    with open('spam.txt', 'r') as fp:
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        fp.write('Spam and eggs!')
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ### Internal ###
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _unsupported(self, name):
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Internal: raise an exception for unsupported operations."""
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise UnsupportedOperation("%s.%s() not supported" %
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                   (self.__class__.__name__, name))
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ### Positioning ###
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def seek(self, pos, whence=0):
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Change stream position.
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Change the stream position to byte offset pos. Argument pos is
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interpreted relative to the position indicated by whence.  Values
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for whence are:
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        * 0 -- start of stream (the default); offset should be zero or positive
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        * 1 -- current stream position; offset may be negative
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        * 2 -- end of stream; offset is usually negative
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Return the new absolute position.
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._unsupported("seek")
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def tell(self):
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Return current stream position."""
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.seek(0, 1)
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def truncate(self, pos=None):
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Truncate file to size bytes.
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Size defaults to the current IO position as reported by tell().  Return
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        the new size.
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._unsupported("truncate")
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ### Flush and close ###
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def flush(self):
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Flush write buffers, if applicable.
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        This is not implemented for read-only and non-blocking streams.
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._checkClosed()
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # XXX Should this return the number of bytes written???
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __closed = False
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def close(self):
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Flush and close the IO object.
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        This method has no effect if the file is already closed.
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not self.__closed:
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.flush()
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            finally:
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.__closed = True
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __del__(self):
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Destructor.  Calls close()."""
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # The try/except block is in case this is called at program
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # exit time, when it's possible that globals have already been
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # deleted, and then the close() call might fail.  Since
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # there's nothing we can do about such failures and they annoy
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # the end users, we suppress the traceback.
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.close()
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except:
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ### Inquiries ###
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def seekable(self):
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Return whether object supports random access.
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        If False, seek(), tell() and truncate() will raise IOError.
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        This method may need to do a test seek().
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return False
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _checkSeekable(self, msg=None):
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Internal: raise an IOError if file is not seekable
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not self.seekable():
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise IOError("File or stream is not seekable."
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          if msg is None else msg)
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def readable(self):
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Return whether object was opened for reading.
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        If False, read() will raise IOError.
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return False
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _checkReadable(self, msg=None):
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Internal: raise an IOError if file is not readable
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not self.readable():
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise IOError("File or stream is not readable."
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          if msg is None else msg)
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def writable(self):
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Return whether object was opened for writing.
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        If False, write() and truncate() will raise IOError.
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return False
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _checkWritable(self, msg=None):
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Internal: raise an IOError if file is not writable
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not self.writable():
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise IOError("File or stream is not writable."
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          if msg is None else msg)
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def closed(self):
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """closed: bool.  True iff the file has been closed.
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        For backwards compatibility, this is a property, not a predicate.
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.__closed
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _checkClosed(self, msg=None):
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Internal: raise an ValueError if file is closed
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("I/O operation on closed file."
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             if msg is None else msg)
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ### Context manager ###
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __enter__(self):
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Context management protocol.  Returns self."""
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._checkClosed()
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __exit__(self, *args):
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Context management protocol.  Calls close()"""
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.close()
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ### Lower-level APIs ###
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # XXX Should these be present even if unimplemented?
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def fileno(self):
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Returns underlying file descriptor if one exists.
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        An IOError is raised if the IO object does not use a file descriptor.
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._unsupported("fileno")
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def isatty(self):
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Return whether this is an 'interactive' stream.
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Return False if it can't be determined.
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._checkClosed()
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return False
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ### Readline[s] and writelines ###
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def readline(self, limit=-1):
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        r"""Read and return a line from the stream.
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        If limit is specified, at most limit bytes will be read.
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        The line terminator is always b'\n' for binary files; for text
4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        files, the newlines argument to open can be used to select the line
4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        terminator(s) recognized.
4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # For backwards compatibility, a (slowish) readline().
4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if hasattr(self, "peek"):
4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def nreadahead():
4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                readahead = self.peek(1)
4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if not readahead:
4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    return 1
4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                n = (readahead.find(b"\n") + 1) or len(readahead)
4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if limit >= 0:
4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    n = min(n, limit)
4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return n
4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def nreadahead():
4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return 1
4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if limit is None:
4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            limit = -1
4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif not isinstance(limit, (int, long)):
4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise TypeError("limit must be an integer")
4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = bytearray()
4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        while limit < 0 or len(res) < limit:
4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b = self.read(nreadahead())
4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not b:
4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                break
4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            res += b
4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if res.endswith(b"\n"):
4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                break
4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return bytes(res)
4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __iter__(self):
4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._checkClosed()
4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self
4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def next(self):
4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        line = self.readline()
4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not line:
4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise StopIteration
4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return line
4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def readlines(self, hint=None):
5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Return a list of lines from the stream.
5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        hint can be specified to control the number of lines read: no more
5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        lines will be read if the total size (in bytes/characters) of all
5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        lines so far exceeds hint.
5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if hint is not None and not isinstance(hint, (int, long)):
5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise TypeError("integer or None expected")
5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if hint is None or hint <= 0:
5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return list(self)
5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        n = 0
5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        lines = []
5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for line in self:
5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            lines.append(line)
5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            n += len(line)
5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if n >= hint:
5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                break
5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return lines
5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def writelines(self, lines):
5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._checkClosed()
5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for line in lines:
5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.write(line)
5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoio.IOBase.register(IOBase)
5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass RawIOBase(IOBase):
5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Base class for raw binary I/O."""
5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # The read() method is implemented by calling readinto(); derived
5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # classes that want to support read() only need to implement
5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # readinto() as a primitive operation.  In general, readinto() can be
5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # more efficient than read().
5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # (It would be tempting to also provide an implementation of
5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # readinto() in terms of read(), in case the latter is a more suitable
5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # primitive operation, but that would lead to nasty recursion in case
5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # a subclass doesn't implement either.)
5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def read(self, n=-1):
5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Read and return up to n bytes.
5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Returns an empty bytes object on EOF, or None if the object is
5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        set not to block and has no data to read.
5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n is None:
5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            n = -1
5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n < 0:
5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self.readall()
5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray(n.__index__())
5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        n = self.readinto(b)
5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n is None:
5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return None
5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del b[n:]
5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return bytes(b)
5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def readall(self):
5594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Read until EOF, using multiple read() call."""
5604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = bytearray()
5614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        while True:
5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            data = self.read(DEFAULT_BUFFER_SIZE)
5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not data:
5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                break
5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            res += data
5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if res:
5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return bytes(res)
5684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # b'' or None
5704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return data
5714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def readinto(self, b):
5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Read up to len(b) bytes into b.
5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Returns number of bytes read (0 for EOF), or None if the object
5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        is set not to block and has no data to read.
5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._unsupported("readinto")
5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def write(self, b):
5814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Write the given buffer to the IO stream.
5824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Returns the number of bytes written, which may be less than len(b).
5844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
5854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._unsupported("write")
5864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoio.RawIOBase.register(RawIOBase)
5884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom _io import FileIO
5894adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoRawIOBase.register(FileIO)
5904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BufferedIOBase(IOBase):
5934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Base class for buffered IO objects.
5954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    The main difference with RawIOBase is that the read() method
5974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    supports omitting the size argument, and does not have a default
5984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    implementation that defers to readinto().
5994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    In addition, read(), readinto() and write() may raise
6014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    BlockingIOError if the underlying raw stream is in non-blocking
6024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    mode and not ready; unlike their raw counterparts, they will never
6034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return None.
6044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    A typical implementation should not inherit from a RawIOBase
6064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    implementation, but wrap one.
6074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
6084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def read(self, n=None):
6104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Read and return up to n bytes.
6114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        If the argument is omitted, None, or negative, reads and
6134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        returns all data until EOF.
6144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        If the argument is positive, and the underlying raw stream is
6164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        not 'interactive', multiple raw reads may be issued to satisfy
6174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        the byte count (unless EOF is reached first).  But for
6184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interactive raw streams (XXX and for pipes?), at most one raw
6194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        read will be issued, and a short result does not imply that
6204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        EOF is imminent.
6214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Returns an empty bytes array on EOF.
6234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Raises BlockingIOError if the underlying raw stream has no
6254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        data at the moment.
6264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
6274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._unsupported("read")
6284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def read1(self, n=None):
6304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Read up to n bytes with at most one read() system call."""
6314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._unsupported("read1")
6324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def readinto(self, b):
6344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Read up to len(b) bytes into b.
6354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Like read(), this may issue multiple reads to the underlying raw
6374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        stream, unless the latter is 'interactive'.
6384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Returns the number of bytes read (0 for EOF).
6404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Raises BlockingIOError if the underlying raw stream has no
6424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        data at the moment.
6434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
6444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # XXX This ought to work with anything that supports the buffer API
6454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        data = self.read(len(b))
6464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        n = len(data)
6474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
6484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b[:n] = data
6494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except TypeError as err:
6504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            import array
6514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not isinstance(b, array.array):
6524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise err
6534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b[:n] = array.array(b'b', data)
6544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return n
6554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def write(self, b):
6574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Write the given buffer to the IO stream.
6584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Return the number of bytes written, which is never less than
6604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        len(b).
6614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Raises BlockingIOError if the buffer is full and the
6634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        underlying raw stream cannot accept more data at the moment.
6644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
6654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._unsupported("write")
6664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def detach(self):
6684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
6694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Separate the underlying raw stream from the buffer and return it.
6704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        After the raw stream has been detached, the buffer is in an unusable
6724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        state.
6734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
6744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._unsupported("detach")
6754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoio.BufferedIOBase.register(BufferedIOBase)
6774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass _BufferedIOMixin(BufferedIOBase):
6804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """A mixin implementation of BufferedIOBase with an underlying raw stream.
6824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    This passes most requests on to the underlying raw stream.  It
6844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    does *not* provide implementations of read(), readinto() or
6854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    write().
6864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
6874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, raw):
6894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._raw = raw
6904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ### Positioning ###
6924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def seek(self, pos, whence=0):
6944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        new_position = self.raw.seek(pos, whence)
6954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if new_position < 0:
6964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise IOError("seek() returned an invalid position")
6974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return new_position
6984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def tell(self):
7004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pos = self.raw.tell()
7014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if pos < 0:
7024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise IOError("tell() returned an invalid position")
7034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return pos
7044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def truncate(self, pos=None):
7064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Flush the stream.  We're mixing buffered I/O with lower-level I/O,
7074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # and a flush may be necessary to synch both views of the current
7084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # file state.
7094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.flush()
7104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if pos is None:
7124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pos = self.tell()
7134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # XXX: Should seek() be used, instead of passing the position
7144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # XXX  directly to truncate?
7154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.raw.truncate(pos)
7164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ### Flush and close ###
7184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def flush(self):
7204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
7214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("flush of closed file")
7224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.raw.flush()
7234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def close(self):
7254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.raw is not None and not self.closed:
7264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
7274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # may raise BlockingIOError or BrokenPipeError etc
7284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.flush()
7294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            finally:
7304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.raw.close()
7314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def detach(self):
7334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.raw is None:
7344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("raw stream already detached")
7354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.flush()
7364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raw = self._raw
7374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._raw = None
7384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return raw
7394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ### Inquiries ###
7414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def seekable(self):
7434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.raw.seekable()
7444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def readable(self):
7464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.raw.readable()
7474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def writable(self):
7494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.raw.writable()
7504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
7524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def raw(self):
7534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._raw
7544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
7564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def closed(self):
7574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.raw.closed
7584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
7604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def name(self):
7614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.raw.name
7624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
7644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def mode(self):
7654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.raw.mode
7664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __repr__(self):
7684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        clsname = self.__class__.__name__
7694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
7704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            name = self.name
7714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except AttributeError:
7724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return "<_pyio.{0}>".format(clsname)
7734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
7744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return "<_pyio.{0} name={1!r}>".format(clsname, name)
7754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ### Lower-level APIs ###
7774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def fileno(self):
7794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.raw.fileno()
7804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def isatty(self):
7824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.raw.isatty()
7834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BytesIO(BufferedIOBase):
7864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Buffered I/O implementation using an in-memory bytes buffer."""
7884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, initial_bytes=None):
7904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        buf = bytearray()
7914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if initial_bytes is not None:
7924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            buf.extend(initial_bytes)
7934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._buffer = buf
7944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._pos = 0
7954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __getstate__(self):
7974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
7984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("__getstate__ on closed file")
7994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.__dict__.copy()
8004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def getvalue(self):
8024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Return the bytes value (contents) of the buffer
8034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
8044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
8054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("getvalue on closed file")
8064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return bytes(self._buffer)
8074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def read(self, n=None):
8094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
8104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("read from closed file")
8114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n is None:
8124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            n = -1
8134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not isinstance(n, (int, long)):
8144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise TypeError("integer argument expected, got {0!r}".format(
8154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                type(n)))
8164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n < 0:
8174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            n = len(self._buffer)
8184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if len(self._buffer) <= self._pos:
8194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return b""
8204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        newpos = min(len(self._buffer), self._pos + n)
8214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self._buffer[self._pos : newpos]
8224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._pos = newpos
8234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return bytes(b)
8244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def read1(self, n):
8264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """This is the same as read.
8274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
8284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.read(n)
8294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def write(self, b):
8314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
8324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("write to closed file")
8334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isinstance(b, unicode):
8344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise TypeError("can't write unicode to binary stream")
8354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        n = len(b)
8364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n == 0:
8374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return 0
8384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pos = self._pos
8394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if pos > len(self._buffer):
8404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Inserts null bytes between the current end of the file
8414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # and the new write position.
8424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            padding = b'\x00' * (pos - len(self._buffer))
8434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._buffer += padding
8444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._buffer[pos:pos + n] = b
8454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._pos += n
8464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return n
8474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def seek(self, pos, whence=0):
8494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
8504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("seek on closed file")
8514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
8524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pos.__index__
8534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except AttributeError:
8544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise TypeError("an integer is required")
8554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if whence == 0:
8564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if pos < 0:
8574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise ValueError("negative seek position %r" % (pos,))
8584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._pos = pos
8594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif whence == 1:
8604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._pos = max(0, self._pos + pos)
8614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif whence == 2:
8624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._pos = max(0, len(self._buffer) + pos)
8634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
8644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("invalid whence value")
8654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._pos
8664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def tell(self):
8684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
8694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("tell on closed file")
8704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._pos
8714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def truncate(self, pos=None):
8734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
8744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("truncate on closed file")
8754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if pos is None:
8764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pos = self._pos
8774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
8784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
8794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pos.__index__
8804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except AttributeError:
8814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise TypeError("an integer is required")
8824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if pos < 0:
8834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise ValueError("negative truncate position %r" % (pos,))
8844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del self._buffer[pos:]
8854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return pos
8864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def readable(self):
8884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
8894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("I/O operation on closed file.")
8904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return True
8914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def writable(self):
8934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
8944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("I/O operation on closed file.")
8954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return True
8964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def seekable(self):
8984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
8994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("I/O operation on closed file.")
9004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return True
9014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BufferedReader(_BufferedIOMixin):
9044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """BufferedReader(raw[, buffer_size])
9064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    A buffer for a readable, sequential BaseRawIO object.
9084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    The constructor creates a BufferedReader for the given readable raw
9104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    stream and buffer_size. If buffer_size is omitted, DEFAULT_BUFFER_SIZE
9114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    is used.
9124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
9134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
9154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Create a new buffered reader using the given readable raw IO object.
9164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
9174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not raw.readable():
9184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise IOError('"raw" argument must be readable.')
9194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        _BufferedIOMixin.__init__(self, raw)
9214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if buffer_size <= 0:
9224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("invalid buffer size")
9234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.buffer_size = buffer_size
9244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._reset_read_buf()
9254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._read_lock = Lock()
9264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _reset_read_buf(self):
9284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._read_buf = b""
9294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._read_pos = 0
9304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def read(self, n=None):
9324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Read n bytes.
9334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Returns exactly n bytes of data unless the underlying raw IO
9354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        stream reaches EOF or if the call would block in non-blocking
9364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mode. If n is negative, read until EOF or until read() would
9374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        block.
9384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
9394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n is not None and n < -1:
9404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("invalid number of bytes to read")
9414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self._read_lock:
9424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._read_unlocked(n)
9434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _read_unlocked(self, n=None):
9454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        nodata_val = b""
9464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        empty_values = (b"", None)
9474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        buf = self._read_buf
9484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pos = self._read_pos
9494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Special case for when the number of bytes to read is unspecified.
9514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n is None or n == -1:
9524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._reset_read_buf()
9534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            chunks = [buf[pos:]]  # Strip the consumed bytes.
9544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            current_size = 0
9554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            while True:
9564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # Read until EOF or until read() would block.
9574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                try:
9584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    chunk = self.raw.read()
9594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                except IOError as e:
9604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if e.errno != EINTR:
9614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        raise
9624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    continue
9634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if chunk in empty_values:
9644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    nodata_val = chunk
9654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    break
9664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                current_size += len(chunk)
9674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                chunks.append(chunk)
9684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return b"".join(chunks) or nodata_val
9694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # The number of bytes to read is specified, return at most n bytes.
9714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        avail = len(buf) - pos  # Length of the available buffered data.
9724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n <= avail:
9734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Fast path: the data to read is fully buffered.
9744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._read_pos += n
9754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return buf[pos:pos+n]
9764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Slow path: read from the stream until enough bytes are read,
9774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # or until an EOF occurs or until read() would block.
9784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        chunks = [buf[pos:]]
9794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        wanted = max(self.buffer_size, n)
9804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        while avail < n:
9814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
9824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                chunk = self.raw.read(wanted)
9834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except IOError as e:
9844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if e.errno != EINTR:
9854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    raise
9864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                continue
9874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if chunk in empty_values:
9884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                nodata_val = chunk
9894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                break
9904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            avail += len(chunk)
9914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            chunks.append(chunk)
9924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # n is more then avail only when an EOF occurred or when
9934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # read() would have blocked.
9944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        n = min(n, avail)
9954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        out = b"".join(chunks)
9964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._read_buf = out[n:]  # Save the extra data in the buffer.
9974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._read_pos = 0
9984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return out[:n] if out else nodata_val
9994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def peek(self, n=0):
10014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Returns buffered bytes without advancing the position.
10024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        The argument indicates a desired minimal number of bytes; we
10044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        do at most one raw read to satisfy it.  We never return more
10054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        than self.buffer_size.
10064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
10074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self._read_lock:
10084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._peek_unlocked(n)
10094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _peek_unlocked(self, n=0):
10114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        want = min(n, self.buffer_size)
10124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        have = len(self._read_buf) - self._read_pos
10134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if have < want or have <= 0:
10144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            to_read = self.buffer_size - have
10154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            while True:
10164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                try:
10174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    current = self.raw.read(to_read)
10184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                except IOError as e:
10194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if e.errno != EINTR:
10204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        raise
10214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    continue
10224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                break
10234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if current:
10244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self._read_buf = self._read_buf[self._read_pos:] + current
10254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self._read_pos = 0
10264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._read_buf[self._read_pos:]
10274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def read1(self, n):
10294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Reads up to n bytes, with at most one read() system call."""
10304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Returns up to n bytes.  If at least one byte is buffered, we
10314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # only return buffered bytes.  Otherwise, we do one raw read.
10324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n < 0:
10334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("number of bytes to read must be positive")
10344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n == 0:
10354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return b""
10364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self._read_lock:
10374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._peek_unlocked(1)
10384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._read_unlocked(
10394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                min(n, len(self._read_buf) - self._read_pos))
10404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def tell(self):
10424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return _BufferedIOMixin.tell(self) - len(self._read_buf) + self._read_pos
10434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def seek(self, pos, whence=0):
10454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not (0 <= whence <= 2):
10464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("invalid whence value")
10474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self._read_lock:
10484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if whence == 1:
10494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pos -= len(self._read_buf) - self._read_pos
10504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pos = _BufferedIOMixin.seek(self, pos, whence)
10514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._reset_read_buf()
10524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return pos
10534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BufferedWriter(_BufferedIOMixin):
10554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """A buffer for a writeable sequential RawIO object.
10574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    The constructor creates a BufferedWriter for the given writeable raw
10594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    stream. If the buffer_size is not given, it defaults to
10604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    DEFAULT_BUFFER_SIZE.
10614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
10624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _warning_stack_offset = 2
10644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, raw,
10664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
10674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not raw.writable():
10684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise IOError('"raw" argument must be writable.')
10694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        _BufferedIOMixin.__init__(self, raw)
10714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if buffer_size <= 0:
10724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("invalid buffer size")
10734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if max_buffer_size is not None:
10744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            warnings.warn("max_buffer_size is deprecated", DeprecationWarning,
10754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          self._warning_stack_offset)
10764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.buffer_size = buffer_size
10774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._write_buf = bytearray()
10784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._write_lock = Lock()
10794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def write(self, b):
10814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
10824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("write to closed file")
10834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isinstance(b, unicode):
10844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise TypeError("can't write unicode to binary stream")
10854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self._write_lock:
10864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # XXX we can implement some more tricks to try and avoid
10874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # partial writes
10884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if len(self._write_buf) > self.buffer_size:
10894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # We're full, so let's pre-flush the buffer.  (This may
10904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # raise BlockingIOError with characters_written == 0.)
10914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self._flush_unlocked()
10924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            before = len(self._write_buf)
10934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._write_buf.extend(b)
10944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            written = len(self._write_buf) - before
10954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if len(self._write_buf) > self.buffer_size:
10964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                try:
10974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self._flush_unlocked()
10984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                except BlockingIOError as e:
10994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if len(self._write_buf) > self.buffer_size:
11004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # We've hit the buffer_size. We have to accept a partial
11014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # write and cut back our buffer.
11024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        overage = len(self._write_buf) - self.buffer_size
11034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        written -= overage
11044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        self._write_buf = self._write_buf[:self.buffer_size]
11054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        raise BlockingIOError(e.errno, e.strerror, written)
11064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return written
11074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def truncate(self, pos=None):
11094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self._write_lock:
11104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._flush_unlocked()
11114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if pos is None:
11124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pos = self.raw.tell()
11134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self.raw.truncate(pos)
11144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def flush(self):
11164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self._write_lock:
11174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._flush_unlocked()
11184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _flush_unlocked(self):
11204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
11214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("flush of closed file")
11224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        while self._write_buf:
11234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
11244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                n = self.raw.write(self._write_buf)
11254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except BlockingIOError:
11264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise RuntimeError("self.raw should implement RawIOBase: it "
11274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                   "should not raise BlockingIOError")
11284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except IOError as e:
11294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if e.errno != EINTR:
11304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    raise
11314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                continue
11324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if n is None:
11334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise BlockingIOError(
11344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    errno.EAGAIN,
11354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    "write could not complete without blocking", 0)
11364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if n > len(self._write_buf) or n < 0:
11374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise IOError("write() returned incorrect number of bytes")
11384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            del self._write_buf[:n]
11394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def tell(self):
11414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return _BufferedIOMixin.tell(self) + len(self._write_buf)
11424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def seek(self, pos, whence=0):
11444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not (0 <= whence <= 2):
11454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("invalid whence")
11464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self._write_lock:
11474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._flush_unlocked()
11484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return _BufferedIOMixin.seek(self, pos, whence)
11494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BufferedRWPair(BufferedIOBase):
11524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """A buffered reader and writer object together.
11544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    A buffered reader object and buffered writer object put together to
11564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    form a sequential IO object that can read and write. This is typically
11574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    used with a socket or two-way pipe.
11584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    reader and writer are RawIOBase objects that are readable and
11604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    writeable respectively. If the buffer_size is omitted it defaults to
11614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    DEFAULT_BUFFER_SIZE.
11624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
11634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # XXX The usefulness of this (compared to having two separate IO
11654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # objects) is questionable.
11664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, reader, writer,
11684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
11694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Constructor.
11704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        The arguments are two RawIO instances.
11724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
11734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if max_buffer_size is not None:
11744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            warnings.warn("max_buffer_size is deprecated", DeprecationWarning, 2)
11754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not reader.readable():
11774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise IOError('"reader" argument must be readable.')
11784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not writer.writable():
11804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise IOError('"writer" argument must be writable.')
11814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.reader = BufferedReader(reader, buffer_size)
11834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.writer = BufferedWriter(writer, buffer_size)
11844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def read(self, n=None):
11864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n is None:
11874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            n = -1
11884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.reader.read(n)
11894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def readinto(self, b):
11914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.reader.readinto(b)
11924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def write(self, b):
11944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.writer.write(b)
11954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def peek(self, n=0):
11974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.reader.peek(n)
11984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def read1(self, n):
12004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.reader.read1(n)
12014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def readable(self):
12034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.reader.readable()
12044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def writable(self):
12064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.writer.writable()
12074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def flush(self):
12094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.writer.flush()
12104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def close(self):
12124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.writer.close()
12134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.reader.close()
12144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def isatty(self):
12164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.reader.isatty() or self.writer.isatty()
12174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
12194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def closed(self):
12204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.writer.closed
12214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BufferedRandom(BufferedWriter, BufferedReader):
12244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """A buffered interface to random access streams.
12264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    The constructor creates a reader and writer for a seekable stream,
12284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    raw, given in the first argument. If the buffer_size is omitted it
12294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    defaults to DEFAULT_BUFFER_SIZE.
12304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
12314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _warning_stack_offset = 3
12334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, raw,
12354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
12364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raw._checkSeekable()
12374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        BufferedReader.__init__(self, raw, buffer_size)
12384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        BufferedWriter.__init__(self, raw, buffer_size, max_buffer_size)
12394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def seek(self, pos, whence=0):
12414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not (0 <= whence <= 2):
12424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("invalid whence")
12434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.flush()
12444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._read_buf:
12454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Undo read ahead.
12464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with self._read_lock:
12474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.raw.seek(self._read_pos - len(self._read_buf), 1)
12484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # First do the raw seek, then empty the read buffer, so that
12494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # if the raw seek fails, we don't lose buffered data forever.
12504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pos = self.raw.seek(pos, whence)
12514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self._read_lock:
12524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._reset_read_buf()
12534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if pos < 0:
12544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise IOError("seek() returned invalid position")
12554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return pos
12564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def tell(self):
12584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._write_buf:
12594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return BufferedWriter.tell(self)
12604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
12614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return BufferedReader.tell(self)
12624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def truncate(self, pos=None):
12644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if pos is None:
12654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pos = self.tell()
12664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Use seek to flush the read buffer.
12674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return BufferedWriter.truncate(self, pos)
12684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def read(self, n=None):
12704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n is None:
12714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            n = -1
12724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.flush()
12734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return BufferedReader.read(self, n)
12744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def readinto(self, b):
12764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.flush()
12774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return BufferedReader.readinto(self, b)
12784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def peek(self, n=0):
12804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.flush()
12814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return BufferedReader.peek(self, n)
12824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def read1(self, n):
12844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.flush()
12854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return BufferedReader.read1(self, n)
12864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def write(self, b):
12884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._read_buf:
12894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Undo readahead
12904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with self._read_lock:
12914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.raw.seek(self._read_pos - len(self._read_buf), 1)
12924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self._reset_read_buf()
12934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return BufferedWriter.write(self, b)
12944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TextIOBase(IOBase):
12974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Base class for text I/O.
12994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    This class provides a character and line based interface to stream
13014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    I/O. There is no readinto method because Python's character strings
13024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    are immutable. There is no public constructor.
13034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
13044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def read(self, n=-1):
13064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Read at most n characters from stream.
13074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Read from underlying buffer until we have n characters or we hit EOF.
13094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        If n is negative or omitted, read until EOF.
13104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
13114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._unsupported("read")
13124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def write(self, s):
13144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Write string s to stream."""
13154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._unsupported("write")
13164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def truncate(self, pos=None):
13184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Truncate size to pos."""
13194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._unsupported("truncate")
13204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def readline(self):
13224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Read until newline or EOF.
13234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Returns an empty string if EOF is hit immediately.
13254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
13264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._unsupported("readline")
13274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def detach(self):
13294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
13304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Separate the underlying buffer from the TextIOBase and return it.
13314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        After the underlying buffer has been detached, the TextIO is in an
13334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        unusable state.
13344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
13354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._unsupported("detach")
13364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
13384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def encoding(self):
13394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Subclasses should override."""
13404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return None
13414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
13434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def newlines(self):
13444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Line endings translated so far.
13454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Only line endings translated during reading are considered.
13474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Subclasses should override.
13494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
13504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return None
13514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
13534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def errors(self):
13544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Error setting of the decoder or encoder.
13554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Subclasses should override."""
13574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return None
13584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoio.TextIOBase.register(TextIOBase)
13604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass IncrementalNewlineDecoder(codecs.IncrementalDecoder):
13634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    r"""Codec used when reading a file in universal newlines mode.  It wraps
13644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    another incremental decoder, translating \r\n and \r into \n.  It also
13654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    records the types of newlines encountered.  When used with
13664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    translate=False, it ensures that the newline sequence is returned in
13674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    one piece.
13684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
13694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, decoder, translate, errors='strict'):
13704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        codecs.IncrementalDecoder.__init__(self, errors=errors)
13714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.translate = translate
13724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.decoder = decoder
13734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.seennl = 0
13744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.pendingcr = False
13754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def decode(self, input, final=False):
13774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # decode input (with the eventual \r from a previous pass)
13784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.decoder is None:
13794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            output = input
13804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
13814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            output = self.decoder.decode(input, final=final)
13824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.pendingcr and (output or final):
13834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            output = "\r" + output
13844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.pendingcr = False
13854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # retain last \r even when not translating data:
13874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # then readline() is sure to get \r\n in one pass
13884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if output.endswith("\r") and not final:
13894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            output = output[:-1]
13904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.pendingcr = True
13914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Record which newlines are read
13934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        crlf = output.count('\r\n')
13944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cr = output.count('\r') - crlf
13954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        lf = output.count('\n') - crlf
13964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.seennl |= (lf and self._LF) | (cr and self._CR) \
13974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    | (crlf and self._CRLF)
13984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.translate:
14004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if crlf:
14014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                output = output.replace("\r\n", "\n")
14024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if cr:
14034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                output = output.replace("\r", "\n")
14044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return output
14064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def getstate(self):
14084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.decoder is None:
14094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            buf = b""
14104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            flag = 0
14114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
14124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            buf, flag = self.decoder.getstate()
14134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        flag <<= 1
14144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.pendingcr:
14154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            flag |= 1
14164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return buf, flag
14174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setstate(self, state):
14194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        buf, flag = state
14204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.pendingcr = bool(flag & 1)
14214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.decoder is not None:
14224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.decoder.setstate((buf, flag >> 1))
14234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def reset(self):
14254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.seennl = 0
14264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.pendingcr = False
14274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.decoder is not None:
14284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.decoder.reset()
14294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _LF = 1
14314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _CR = 2
14324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _CRLF = 4
14334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
14354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def newlines(self):
14364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return (None,
14374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "\n",
14384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "\r",
14394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                ("\r", "\n"),
14404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "\r\n",
14414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                ("\n", "\r\n"),
14424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                ("\r", "\r\n"),
14434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                ("\r", "\n", "\r\n")
14444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao               )[self.seennl]
14454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TextIOWrapper(TextIOBase):
14484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    r"""Character and line based layer over a BufferedIOBase object, buffer.
14504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    encoding gives the name of the encoding that the stream will be
14524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    decoded or encoded with. It defaults to locale.getpreferredencoding.
14534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    errors determines the strictness of encoding and decoding (see the
14554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    codecs.register) and defaults to "strict".
14564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    newline can be None, '', '\n', '\r', or '\r\n'.  It controls the
14584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    handling of line endings. If it is None, universal newlines is
14594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    enabled.  With this enabled, on input, the lines endings '\n', '\r',
14604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    or '\r\n' are translated to '\n' before being returned to the
14614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    caller. Conversely, on output, '\n' is translated to the system
14624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    default line separator, os.linesep. If newline is any other of its
14634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    legal values, that newline becomes the newline when the file is read
14644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    and it is returned untranslated. On output, '\n' is converted to the
14654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    newline.
14664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    If line_buffering is True, a call to flush is implied when a call to
14684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    write contains a newline character.
14694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
14704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _CHUNK_SIZE = 2048
14724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, buffer, encoding=None, errors=None, newline=None,
14744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 line_buffering=False):
14754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if newline is not None and not isinstance(newline, basestring):
14764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise TypeError("illegal newline type: %r" % (type(newline),))
14774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if newline not in (None, "", "\n", "\r", "\r\n"):
14784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("illegal newline value: %r" % (newline,))
14794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if encoding is None:
14804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
14814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                import locale
14824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except ImportError:
14834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # Importing locale may fail if Python is being built
14844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                encoding = "ascii"
14854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
14864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                encoding = locale.getpreferredencoding()
14874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not isinstance(encoding, basestring):
14894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("invalid encoding: %r" % encoding)
14904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if errors is None:
14924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            errors = "strict"
14934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
14944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not isinstance(errors, basestring):
14954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise ValueError("invalid errors: %r" % errors)
14964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._buffer = buffer
14984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._line_buffering = line_buffering
14994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._encoding = encoding
15004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._errors = errors
15014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._readuniversal = not newline
15024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._readtranslate = newline is None
15034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._readnl = newline
15044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._writetranslate = newline != ''
15054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._writenl = newline or os.linesep
15064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._encoder = None
15074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._decoder = None
15084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._decoded_chars = ''  # buffer for text returned from decoder
15094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._decoded_chars_used = 0  # offset into _decoded_chars for read()
15104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._snapshot = None  # info for reconstructing decoder state
15114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._seekable = self._telling = self.buffer.seekable()
15124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._seekable and self.writable():
15144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            position = self.buffer.tell()
15154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if position != 0:
15164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                try:
15174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self._get_encoder().setstate(0)
15184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                except LookupError:
15194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    # Sometimes the encoder doesn't exist
15204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    pass
15214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # self._snapshot is either None, or a tuple (dec_flags, next_input)
15234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # where dec_flags is the second (integer) item of the decoder state
15244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # and next_input is the chunk of input bytes that comes next after the
15254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # snapshot point.  We use this to reconstruct decoder states in tell().
15264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Naming convention:
15284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #   - "bytes_..." for integer variables that count input bytes
15294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #   - "chars_..." for integer variables that count decoded characters
15304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __repr__(self):
15324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
15334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            name = self.name
15344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except AttributeError:
15354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return "<_pyio.TextIOWrapper encoding='{0}'>".format(self.encoding)
15364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
15374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return "<_pyio.TextIOWrapper name={0!r} encoding='{1}'>".format(
15384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                name, self.encoding)
15394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
15414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def encoding(self):
15424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._encoding
15434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
15454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def errors(self):
15464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._errors
15474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
15494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def line_buffering(self):
15504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._line_buffering
15514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
15534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def buffer(self):
15544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._buffer
15554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def seekable(self):
15574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
15584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("I/O operation on closed file.")
15594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._seekable
15604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def readable(self):
15624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.buffer.readable()
15634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def writable(self):
15654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.buffer.writable()
15664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def flush(self):
15684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.buffer.flush()
15694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._telling = self._seekable
15704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def close(self):
15724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.buffer is not None and not self.closed:
15734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
15744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.flush()
15754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            finally:
15764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.buffer.close()
15774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
15794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def closed(self):
15804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.buffer.closed
15814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
15834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def name(self):
15844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.buffer.name
15854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def fileno(self):
15874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.buffer.fileno()
15884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def isatty(self):
15904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.buffer.isatty()
15914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def write(self, s):
15934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
15944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("write to closed file")
15954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not isinstance(s, unicode):
15964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise TypeError("can't write %s to text stream" %
15974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            s.__class__.__name__)
15984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        length = len(s)
15994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        haslf = (self._writetranslate or self._line_buffering) and "\n" in s
16004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if haslf and self._writetranslate and self._writenl != "\n":
16014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            s = s.replace("\n", self._writenl)
16024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        encoder = self._encoder or self._get_encoder()
16034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # XXX What if we were just reading?
16044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = encoder.encode(s)
16054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.buffer.write(b)
16064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._line_buffering and (haslf or "\r" in s):
16074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.flush()
16084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._snapshot = None
16094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._decoder:
16104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._decoder.reset()
16114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return length
16124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _get_encoder(self):
16144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        make_encoder = codecs.getincrementalencoder(self._encoding)
16154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._encoder = make_encoder(self._errors)
16164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._encoder
16174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _get_decoder(self):
16194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        make_decoder = codecs.getincrementaldecoder(self._encoding)
16204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        decoder = make_decoder(self._errors)
16214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._readuniversal:
16224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            decoder = IncrementalNewlineDecoder(decoder, self._readtranslate)
16234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._decoder = decoder
16244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return decoder
16254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # The following three methods implement an ADT for _decoded_chars.
16274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Text returned from the decoder is buffered here until the client
16284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # requests it by calling our read() or readline() method.
16294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _set_decoded_chars(self, chars):
16304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Set the _decoded_chars buffer."""
16314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._decoded_chars = chars
16324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._decoded_chars_used = 0
16334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _get_decoded_chars(self, n=None):
16354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Advance into the _decoded_chars buffer."""
16364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        offset = self._decoded_chars_used
16374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n is None:
16384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            chars = self._decoded_chars[offset:]
16394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
16404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            chars = self._decoded_chars[offset:offset + n]
16414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._decoded_chars_used += len(chars)
16424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return chars
16434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _rewind_decoded_chars(self, n):
16454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Rewind the _decoded_chars buffer."""
16464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._decoded_chars_used < n:
16474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise AssertionError("rewind decoded_chars out of bounds")
16484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._decoded_chars_used -= n
16494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _read_chunk(self):
16514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
16524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Read and decode the next chunk of data from the BufferedReader.
16534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
16544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # The return value is True unless EOF was reached.  The decoded
16564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # string is placed in self._decoded_chars (replacing its previous
16574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # value).  The entire input chunk is sent to the decoder, though
16584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # some of it may remain buffered in the decoder, yet to be
16594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # converted.
16604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._decoder is None:
16624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("no decoder")
16634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._telling:
16654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # To prepare for tell(), we need to snapshot a point in the
16664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # file where the decoder's input buffer is empty.
16674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            dec_buffer, dec_flags = self._decoder.getstate()
16694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Given this, we know there was a valid snapshot point
16704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # len(dec_buffer) bytes ago with decoder state (b'', dec_flags).
16714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Read a chunk, decode it, and put the result in self._decoded_chars.
16734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        input_chunk = self.buffer.read1(self._CHUNK_SIZE)
16744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eof = not input_chunk
16754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._set_decoded_chars(self._decoder.decode(input_chunk, eof))
16764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._telling:
16784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # At the snapshot point, len(dec_buffer) bytes before the read,
16794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # the next input to be decoded is dec_buffer + input_chunk.
16804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._snapshot = (dec_flags, dec_buffer + input_chunk)
16814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return not eof
16834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _pack_cookie(self, position, dec_flags=0,
16854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                           bytes_to_feed=0, need_eof=0, chars_to_skip=0):
16864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # The meaning of a tell() cookie is: seek to position, set the
16874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # decoder flags to dec_flags, read bytes_to_feed bytes, feed them
16884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # into the decoder with need_eof as the EOF flag, then skip
16894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # chars_to_skip characters of the decoded result.  For most simple
16904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # decoders, tell() will often just give a byte offset in the file.
16914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return (position | (dec_flags<<64) | (bytes_to_feed<<128) |
16924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao               (chars_to_skip<<192) | bool(need_eof)<<256)
16934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _unpack_cookie(self, bigint):
16954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        rest, position = divmod(bigint, 1<<64)
16964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        rest, dec_flags = divmod(rest, 1<<64)
16974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        rest, bytes_to_feed = divmod(rest, 1<<64)
16984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        need_eof, chars_to_skip = divmod(rest, 1<<64)
16994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return position, dec_flags, bytes_to_feed, need_eof, chars_to_skip
17004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def tell(self):
17024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not self._seekable:
17034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise IOError("underlying stream is not seekable")
17044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not self._telling:
17054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise IOError("telling position disabled by next() call")
17064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.flush()
17074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        position = self.buffer.tell()
17084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        decoder = self._decoder
17094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if decoder is None or self._snapshot is None:
17104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if self._decoded_chars:
17114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # This should never happen.
17124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise AssertionError("pending decoded text")
17134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return position
17144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Skip backward to the snapshot point (see _read_chunk).
17164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dec_flags, next_input = self._snapshot
17174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        position -= len(next_input)
17184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # How many decoded characters have been used up since the snapshot?
17204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        chars_to_skip = self._decoded_chars_used
17214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if chars_to_skip == 0:
17224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # We haven't moved from the snapshot point.
17234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._pack_cookie(position, dec_flags)
17244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Starting from the snapshot position, we will walk the decoder
17264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # forward until it gives us enough decoded characters.
17274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        saved_state = decoder.getstate()
17284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
17294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Note our initial start point.
17304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            decoder.setstate((b'', dec_flags))
17314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            start_pos = position
17324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            start_flags, bytes_fed, chars_decoded = dec_flags, 0, 0
17334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            need_eof = 0
17344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Feed the decoder one byte at a time.  As we go, note the
17364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # nearest "safe start point" before the current location
17374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # (a point where the decoder has nothing buffered, so seek()
17384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # can safely start from there and advance to this location).
17394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for next_byte in next_input:
17404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                bytes_fed += 1
17414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                chars_decoded += len(decoder.decode(next_byte))
17424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                dec_buffer, dec_flags = decoder.getstate()
17434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if not dec_buffer and chars_decoded <= chars_to_skip:
17444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    # Decoder buffer is empty, so this is a safe start point.
17454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    start_pos += bytes_fed
17464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    chars_to_skip -= chars_decoded
17474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    start_flags, bytes_fed, chars_decoded = dec_flags, 0, 0
17484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if chars_decoded >= chars_to_skip:
17494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    break
17504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
17514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # We didn't get enough decoded data; signal EOF to get more.
17524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                chars_decoded += len(decoder.decode(b'', final=True))
17534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                need_eof = 1
17544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if chars_decoded < chars_to_skip:
17554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    raise IOError("can't reconstruct logical file position")
17564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # The returned cookie corresponds to the last safe start point.
17584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._pack_cookie(
17594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                start_pos, start_flags, bytes_fed, need_eof, chars_to_skip)
17604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        finally:
17614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            decoder.setstate(saved_state)
17624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def truncate(self, pos=None):
17644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.flush()
17654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if pos is None:
17664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pos = self.tell()
17674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.buffer.truncate(pos)
17684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def detach(self):
17704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.buffer is None:
17714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("buffer is already detached")
17724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.flush()
17734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        buffer = self._buffer
17744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._buffer = None
17754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return buffer
17764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def seek(self, cookie, whence=0):
17784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
17794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("tell on closed file")
17804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not self._seekable:
17814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise IOError("underlying stream is not seekable")
17824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if whence == 1: # seek relative to current position
17834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if cookie != 0:
17844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise IOError("can't do nonzero cur-relative seeks")
17854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Seeking to the current position should attempt to
17864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # sync the underlying buffer with the current position.
17874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            whence = 0
17884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cookie = self.tell()
17894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if whence == 2: # seek relative to end of file
17904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if cookie != 0:
17914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise IOError("can't do nonzero end-relative seeks")
17924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.flush()
17934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            position = self.buffer.seek(0, 2)
17944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._set_decoded_chars('')
17954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._snapshot = None
17964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if self._decoder:
17974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self._decoder.reset()
17984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return position
17994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if whence != 0:
18004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("invalid whence (%r, should be 0, 1 or 2)" %
18014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             (whence,))
18024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if cookie < 0:
18034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("negative seek position %r" % (cookie,))
18044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.flush()
18054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # The strategy of seek() is to go back to the safe start point
18074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # and replay the effect of read(chars_to_skip) from there.
18084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        start_pos, dec_flags, bytes_to_feed, need_eof, chars_to_skip = \
18094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._unpack_cookie(cookie)
18104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Seek back to the safe start point.
18124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.buffer.seek(start_pos)
18134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._set_decoded_chars('')
18144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._snapshot = None
18154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Restore the decoder to its state from the safe start point.
18174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if cookie == 0 and self._decoder:
18184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._decoder.reset()
18194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif self._decoder or dec_flags or chars_to_skip:
18204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._decoder = self._decoder or self._get_decoder()
18214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._decoder.setstate((b'', dec_flags))
18224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._snapshot = (dec_flags, b'')
18234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if chars_to_skip:
18254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Just like _read_chunk, feed the decoder and save a snapshot.
18264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            input_chunk = self.buffer.read(bytes_to_feed)
18274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._set_decoded_chars(
18284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self._decoder.decode(input_chunk, need_eof))
18294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._snapshot = (dec_flags, input_chunk)
18304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Skip chars_to_skip of the decoded characters.
18324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if len(self._decoded_chars) < chars_to_skip:
18334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise IOError("can't restore logical file position")
18344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._decoded_chars_used = chars_to_skip
18354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Finally, reset the encoder (merely useful for proper BOM handling)
18374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
18384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            encoder = self._encoder or self._get_encoder()
18394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except LookupError:
18404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Sometimes the encoder doesn't exist
18414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
18424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
18434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if cookie != 0:
18444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                encoder.setstate(0)
18454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
18464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                encoder.reset()
18474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return cookie
18484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def read(self, n=None):
18504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._checkReadable()
18514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n is None:
18524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            n = -1
18534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        decoder = self._decoder or self._get_decoder()
18544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
18554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            n.__index__
18564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except AttributeError:
18574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise TypeError("an integer is required")
18584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n < 0:
18594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Read everything.
18604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            result = (self._get_decoded_chars() +
18614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      decoder.decode(self.buffer.read(), final=True))
18624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._set_decoded_chars('')
18634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._snapshot = None
18644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return result
18654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
18664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Keep reading chunks until we have n characters to return.
18674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            eof = False
18684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            result = self._get_decoded_chars(n)
18694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            while len(result) < n and not eof:
18704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                eof = not self._read_chunk()
18714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                result += self._get_decoded_chars(n - len(result))
18724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return result
18734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def next(self):
18754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._telling = False
18764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        line = self.readline()
18774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not line:
18784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._snapshot = None
18794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._telling = self._seekable
18804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise StopIteration
18814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return line
18824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def readline(self, limit=None):
18844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.closed:
18854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("read from closed file")
18864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if limit is None:
18874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            limit = -1
18884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif not isinstance(limit, (int, long)):
18894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise TypeError("limit must be an integer")
18904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Grab all the decoded text (we will rewind any extra bits later).
18924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        line = self._get_decoded_chars()
18934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        start = 0
18954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Make the decoder if it doesn't already exist.
18964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not self._decoder:
18974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._get_decoder()
18984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
18994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pos = endpos = None
19004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        while True:
19014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if self._readtranslate:
19024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # Newlines are already translated, only search for \n
19034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pos = line.find('\n', start)
19044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if pos >= 0:
19054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    endpos = pos + 1
19064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    break
19074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
19084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    start = len(line)
19094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            elif self._readuniversal:
19114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # Universal newline search. Find any of \r, \r\n, \n
19124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # The decoder ensures that \r\n are not split in two pieces
19134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # In C we'd look for these in parallel of course.
19154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                nlpos = line.find("\n", start)
19164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                crpos = line.find("\r", start)
19174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if crpos == -1:
19184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if nlpos == -1:
19194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # Nothing found
19204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        start = len(line)
19214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    else:
19224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # Found \n
19234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        endpos = nlpos + 1
19244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        break
19254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                elif nlpos == -1:
19264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    # Found lone \r
19274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    endpos = crpos + 1
19284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    break
19294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                elif nlpos < crpos:
19304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    # Found \n
19314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    endpos = nlpos + 1
19324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    break
19334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                elif nlpos == crpos + 1:
19344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    # Found \r\n
19354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    endpos = crpos + 2
19364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    break
19374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
19384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    # Found \r
19394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    endpos = crpos + 1
19404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    break
19414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
19424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # non-universal
19434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pos = line.find(self._readnl)
19444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if pos >= 0:
19454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    endpos = pos + len(self._readnl)
19464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    break
19474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if limit >= 0 and len(line) >= limit:
19494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                endpos = limit  # reached length limit
19504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                break
19514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # No line ending seen yet - get more data'
19534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            while self._read_chunk():
19544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if self._decoded_chars:
19554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    break
19564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if self._decoded_chars:
19574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                line += self._get_decoded_chars()
19584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
19594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # end of file
19604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self._set_decoded_chars('')
19614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self._snapshot = None
19624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return line
19634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if limit >= 0 and endpos > limit:
19654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            endpos = limit  # don't exceed limit
19664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Rewind _decoded_chars to just after the line ending we found.
19684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._rewind_decoded_chars(len(line) - endpos)
19694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return line[:endpos]
19704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
19724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def newlines(self):
19734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._decoder.newlines if self._decoder else None
19744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass StringIO(TextIOWrapper):
19774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Text I/O implementation using an in-memory buffer.
19784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    The initial_value argument sets the value of object.  The newline
19804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    argument is like the one of TextIOWrapper's constructor.
19814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
19824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, initial_value="", newline="\n"):
19844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        super(StringIO, self).__init__(BytesIO(),
19854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                       encoding="utf-8",
19864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                       errors="strict",
19874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                       newline=newline)
19884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Issue #5645: make universal newlines semantics the same as in the
19894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # C version, even under Windows.
19904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if newline is None:
19914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._writetranslate = False
19924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if initial_value:
19934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not isinstance(initial_value, unicode):
19944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                initial_value = unicode(initial_value)
19954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.write(initial_value)
19964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.seek(0)
19974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
19984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def getvalue(self):
19994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.flush()
20004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.buffer.getvalue().decode(self._encoding, self._errors)
20014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __repr__(self):
20034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # TextIOWrapper tells the encoding in its repr. In StringIO,
20044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # that's a implementation detail.
20054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return object.__repr__(self)
20064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
20084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def errors(self):
20094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return None
20104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
20124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def encoding(self):
20134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return None
20144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
20154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def detach(self):
20164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # This doesn't make sense on StringIO.
20174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._unsupported("detach")
2018