diff options
author | Walter Dörwald <walter@livinglogic.de> | 2005-03-14 19:20:19 +0000 |
---|---|---|
committer | Walter Dörwald <walter@livinglogic.de> | 2005-03-14 19:20:19 +0000 |
commit | 473a7717b5472797b7ed71f7781f3669f4bc6b79 (patch) | |
tree | c3246cf6c83b3bcfab4e0746aa22dc4bf9424ac4 | |
parent | b606ff3d88f04ca0b338d0b2c11264aa0b134aa0 (diff) | |
download | cpython-473a7717b5472797b7ed71f7781f3669f4bc6b79.tar.gz |
Backport checkin:
Reset internal buffers when seek() is called. This fixes SF bug #1156259.
-rw-r--r-- | Lib/codecs.py | 12 | ||||
-rw-r--r-- | Lib/encodings/utf_16.py | 7 | ||||
-rw-r--r-- | Lib/test/test_codecs.py | 11 |
3 files changed, 29 insertions, 1 deletions
diff --git a/Lib/codecs.py b/Lib/codecs.py index b4103fb6e4..092da0c7d7 100644 --- a/Lib/codecs.py +++ b/Lib/codecs.py @@ -356,7 +356,17 @@ class StreamReader(Codec): from decoding errors. """ - pass + self.bytebuffer = "" + self.charbuffer = u"" + self.atcr = False + + def seek(self, offset, whence): + """ Set the input stream's current position. + + Resets the codec buffers used for keeping state. + """ + self.reset() + self.stream.seek(offset, whence) def next(self): diff --git a/Lib/encodings/utf_16.py b/Lib/encodings/utf_16.py index a33581c58b..95abb05624 100644 --- a/Lib/encodings/utf_16.py +++ b/Lib/encodings/utf_16.py @@ -31,6 +31,13 @@ class StreamWriter(codecs.StreamWriter): class StreamReader(codecs.StreamReader): + def reset(self): + codecs.StreamReader.reset(self) + try: + del self.decode + except AttributeError: + pass + def decode(self, input, errors='strict'): (object, consumed, byteorder) = \ codecs.utf_16_ex_decode(input, errors, 0, False) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index da6891f85d..c8d99fea79 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -24,6 +24,17 @@ class Queue(object): return s class ReadTest(unittest.TestCase): + def test_seek(self): + # all codecs should be able to encode these + s = u"%s\n%s\n" % (100*u"abc123", 100*u"def456") + encoding = self.encoding + reader = codecs.getreader(encoding)(StringIO.StringIO(s.encode(encoding))) + for t in xrange(5): + # Test that calling seek resets the internal codec state and buffers + reader.seek(0, 0) + line = reader.readline() + self.assertEqual(s[:len(line)], line) + def check_partial(self, input, partialresults): # get a StreamReader for the encoding and feed the bytestring version # of input to the reader byte by byte. Read every available from |