1.1 --- a/lib/__builtins__/file.py Sat Jan 07 16:23:25 2017 +0100
1.2 +++ b/lib/__builtins__/file.py Sun Jan 08 00:27:02 2017 +0100
1.3 @@ -20,7 +20,7 @@
1.4 """
1.5
1.6 from __builtins__.types import check_int, check_string
1.7 -from native import isinstance as _isinstance, fclose, fopen, fread, fwrite
1.8 +from native import isinstance as _isinstance, fclose, fflush, fopen, fread, fwrite
1.9
1.10 class filestream:
1.11
1.12 @@ -46,6 +46,12 @@
1.13 else:
1.14 return bytes
1.15
1.16 + def flush(self):
1.17 +
1.18 + "Flush the stream."
1.19 +
1.20 + fflush(self.__data__)
1.21 +
1.22 def read(self, n=0):
1.23
1.24 "Read 'n' bytes from the stream."
1.25 @@ -66,7 +72,7 @@
1.26
1.27 try:
1.28 while True:
1.29 - l.append(fread(self.__data__, self.bufsize))
1.30 + self._read_data(l)
1.31
1.32 # Handle end-of-file reads.
1.33
1.34 @@ -97,18 +103,10 @@
1.35 l = []
1.36
1.37 # Read until end-of-line or end-of-file.
1.38 - # NOTE: Only POSIX newlines are supported currently.
1.39
1.40 try:
1.41 - while True:
1.42 - s = fread(self.__data__, 1)
1.43 - l.append(s)
1.44 -
1.45 - # Where a newline has been read, provide the preceding data
1.46 - # plus the newline indicator.
1.47 -
1.48 - if s == "\n":
1.49 - break
1.50 + while not self._read_until_newline(l):
1.51 + pass
1.52
1.53 # Handle end-of-file reads.
1.54
1.55 @@ -119,6 +117,22 @@
1.56
1.57 return self._convert(s)
1.58
1.59 + def _read_data(self, l):
1.60 +
1.61 + "Read data into 'l'."
1.62 +
1.63 + l.append(fread(self.__data__, self.bufsize))
1.64 +
1.65 + def _read_until_newline(self, l):
1.66 +
1.67 + "Read data into 'l', returning whether a newline has been read."
1.68 +
1.69 + # NOTE: Only POSIX newlines are supported currently.
1.70 +
1.71 + s = fread(self.__data__, 1)
1.72 + l.append(s)
1.73 + return s == "\n"
1.74 +
1.75 def readlines(self, n=None): pass
1.76
1.77 def write(self, s):
1.78 @@ -154,5 +168,43 @@
1.79
1.80 get_using(filestream.__init__, self)(encoding, bufsize)
1.81 self.__data__ = fopen(filename, mode)
1.82 + self.buffered = ""
1.83 +
1.84 + def _get_data(self):
1.85 +
1.86 + "Get data from the file."
1.87 +
1.88 + if self.buffered:
1.89 + s = self.buffered
1.90 + self.buffered = ""
1.91 + else:
1.92 + s = fread(self.__data__, self.bufsize)
1.93 +
1.94 + return s
1.95 +
1.96 + def _read_data(self, l):
1.97 +
1.98 + "Read data into 'l'."
1.99 +
1.100 + s = self._get_data()
1.101 + l.append(s)
1.102 +
1.103 + def _read_until_newline(self, l):
1.104 +
1.105 + "Read data into 'l', returning whether a newline has been read."
1.106 +
1.107 + s = self._get_data()
1.108 +
1.109 + # NOTE: Only POSIX newlines are supported currently.
1.110 +
1.111 + i = s.find("\n")
1.112 +
1.113 + if i != -1:
1.114 + l.append(s[:i+1])
1.115 + self.buffered = s[i+1:]
1.116 + return True
1.117 +
1.118 + l.append(s)
1.119 + return False
1.120
1.121 # vim: tabstop=4 expandtab shiftwidth=4