diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2008-12-14 17:40:51 +0000 |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2008-12-14 17:40:51 +0000 |
commit | 655fbf18068626c86f487ce94771fdd22b784ae8 (patch) | |
tree | c7777112566161057a8b3380ddb0ece67ac87410 /Lib/io.py | |
parent | 3e1c67e86660c17a9860470947bf460f298e5b5e (diff) | |
download | cpython-git-655fbf18068626c86f487ce94771fdd22b784ae8.tar.gz |
Backport r67759 (fix io.IncrementalNewlineDecoder for UTF-16 et al.).
Diffstat (limited to 'Lib/io.py')
-rw-r--r-- | Lib/io.py | 27 |
1 files changed, 12 insertions, 15 deletions
@@ -1292,25 +1292,23 @@ class IncrementalNewlineDecoder(codecs.IncrementalDecoder): """ def __init__(self, decoder, translate, errors='strict'): codecs.IncrementalDecoder.__init__(self, errors=errors) - self.buffer = b'' self.translate = translate self.decoder = decoder self.seennl = 0 + self.pendingcr = False def decode(self, input, final=False): # decode input (with the eventual \r from a previous pass) - if self.buffer: - input = self.buffer + input - output = self.decoder.decode(input, final=final) + if self.pendingcr and (output or final): + output = "\r" + output + self.pendingcr = False # retain last \r even when not translating data: # then readline() is sure to get \r\n in one pass if output.endswith("\r") and not final: output = output[:-1] - self.buffer = b'\r' - else: - self.buffer = b'' + self.pendingcr = True # Record which newlines are read crlf = output.count('\r\n') @@ -1329,20 +1327,19 @@ class IncrementalNewlineDecoder(codecs.IncrementalDecoder): def getstate(self): buf, flag = self.decoder.getstate() - return buf + self.buffer, flag + flag <<= 1 + if self.pendingcr: + flag |= 1 + return buf, flag def setstate(self, state): buf, flag = state - if buf.endswith(b'\r'): - self.buffer = b'\r' - buf = buf[:-1] - else: - self.buffer = b'' - self.decoder.setstate((buf, flag)) + self.pendingcr = bool(flag & 1) + self.decoder.setstate((buf, flag >> 1)) def reset(self): self.seennl = 0 - self.buffer = b'' + self.pendingcr = False self.decoder.reset() _LF = 1 |