[pypy-commit] pypy default: univ newline support for rfile readline
bdkearns
noreply at buildbot.pypy.org
Tue Sep 9 01:37:25 CEST 2014
Author: Brian Kearns <bdkearns at gmail.com>
Branch:
Changeset: r73386:d2dc19e8a7b4
Date: 2014-09-08 19:01 -0400
http://bitbucket.org/pypy/pypy/changeset/d2dc19e8a7b4/
Log: univ newline support for rfile readline
diff --git a/rpython/rlib/rfile.py b/rpython/rlib/rfile.py
--- a/rpython/rlib/rfile.py
+++ b/rpython/rlib/rfile.py
@@ -359,7 +359,7 @@
self._check_closed()
if size == 0:
return ""
- elif size < 0:
+ elif size < 0 and not self._univ_newline:
with rffi.scoped_alloc_buffer(BASE_LINE_SIZE) as buf:
c = self._readline1(buf.raw)
if c >= 0:
@@ -374,19 +374,50 @@
break
s.append_charpsize(buf.raw, c)
return s.build()
- else: # size > 0
+ else: # size > 0 or self._univ_newline
ll_file = self._ll_file
+ c = 0
s = StringBuilder()
- while s.getlength() < size:
- c = c_getc(ll_file)
+ if self._univ_newline:
+ newlinetypes = self._newlinetypes
+ skipnextlf = self._skipnextlf
+ while size < 0 or s.getlength() < size:
+ c = c_getc(ll_file)
+ if c == EOF:
+ break
+ if skipnextlf:
+ skipnextlf = False
+ if c == ord('\n'):
+ newlinetypes |= NEWLINE_CRLF
+ c = c_getc(ll_file)
+ if c == EOF:
+ break
+ else:
+ newlinetypes |= NEWLINE_CR
+ if c == ord('\r'):
+ skipnextlf = True
+ c = ord('\n')
+ elif c == ord('\n'):
+ newlinetypes |= NEWLINE_LF
+ s.append(chr(c))
+ if c == ord('\n'):
+ break
if c == EOF:
- if c_ferror(ll_file):
- raise _error(ll_file)
- break
- c = chr(c)
- s.append(c)
- if c == '\n':
- break
+ if skipnextlf:
+ newlinetypes |= NEWLINE_CR
+ self._newlinetypes = newlinetypes
+ self._skipnextlf = skipnextlf
+ else:
+ while s.getlength() < size:
+ c = c_getc(ll_file)
+ if c == EOF:
+ break
+ s.append(chr(c))
+ if c == ord('\n'):
+ break
+ if c == EOF:
+ if c_ferror(ll_file):
+ raise _error(ll_file)
return s.build()
@enforceargs(None, str)
diff --git a/rpython/rlib/test/test_rfile.py b/rpython/rlib/test/test_rfile.py
--- a/rpython/rlib/test/test_rfile.py
+++ b/rpython/rlib/test/test_rfile.py
@@ -197,10 +197,16 @@
def f():
f = open(fname, 'U')
assert f.read() == "dupa\ndupb\ndupc"
- f.close()
- f = open(fname, 'U')
+ assert f.read() == ""
+ f.seek(0)
assert f.read(9) == "dupa\ndupb"
assert f.read(42) == "\ndupc"
+ assert f.read(1) == ""
+ f.seek(0)
+ assert f.readline() == "dupa\n"
+ assert f.readline() == "dupb\n"
+ assert f.readline() == "dupc"
+ assert f.readline() == ""
f.close()
f()
More information about the pypy-commit
mailing list