# HG changeset patch # User Paul Boddie # Date 1481128620 -3600 # Node ID e0879c83a43902b73cedef28f20d7553e13f0a3e # Parent d9053172e0ffd6967bc710f77f052d747e10f9cf Added support for reading to the end of a stream's input, fixing EOFError raising in fread by returning shorter amounts of data when EOF occurs, only raising an exception if no data was read before EOF occurred. Made the test input longer to exercise tests of reading remaining data. diff -r d9053172e0ff -r e0879c83a439 lib/posix/io.py --- a/lib/posix/io.py Wed Dec 07 17:24:39 2016 +0100 +++ b/lib/posix/io.py Wed Dec 07 17:37:00 2016 +0100 @@ -51,18 +51,41 @@ "A system-level stream object." - def __init__(self, fd, mode="r"): + def __init__(self, fd, mode="r", bufsize=1024): "Initialise the stream with the given 'fd' and 'mode'." self.__data__ = fdopen(fd, mode) + self.bufsize = bufsize - def read(self, n): + def read(self, n=0): "Read 'n' bytes from the stream." _check_int(n) - return native._fread(self.__data__, n) + + # Read any indicated number of bytes. + + if n > 0: + return native._fread(self.__data__, n) + + # Read all remaining bytes. + + else: + l = [] + + # Read until end-of-file. + + try: + while True: + l.append(native._fread(self.__data__, self.bufsize)) + + # Handle end-of-file reads. + + except EOFError: + pass + + return "".join(l) def write(self, s): diff -r d9053172e0ff -r e0879c83a439 templates/native.c --- a/templates/native.c Wed Dec 07 17:24:39 2016 +0100 +++ b/templates/native.c Wed Dec 07 17:37:00 2016 +0100 @@ -692,7 +692,7 @@ if (have_read != to_read) { - if (feof(f)) + if (feof(f) && (have_read == 0)) __raise_eof_error(); else if (error = ferror(f)) __raise_io_error(__new_int(error)); diff -r d9053172e0ff -r e0879c83a439 tests/read_stream.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/read_stream.py Wed Dec 07 17:37:00 2016 +0100 @@ -0,0 +1,7 @@ +from sys import stdin + +s = stdin.read(10) +print s + +s = stdin.read() +print s diff -r d9053172e0ff -r e0879c83a439 tests/testinput.txt --- a/tests/testinput.txt Wed Dec 07 17:24:39 2016 +0100 +++ b/tests/testinput.txt Wed Dec 07 17:37:00 2016 +0100 @@ -1,1 +1,3 @@ Hello world! +The rest of the file. +More than one line.