]> granicus.if.org Git - python/commitdiff
Reset internal buffers when seek() is called. This fixes SF bug #1156259.
authorWalter Dörwald <walter@livinglogic.de>
Mon, 14 Mar 2005 19:06:30 +0000 (19:06 +0000)
committerWalter Dörwald <walter@livinglogic.de>
Mon, 14 Mar 2005 19:06:30 +0000 (19:06 +0000)
Lib/codecs.py
Lib/encodings/utf_16.py
Lib/test/test_codecs.py

index b4103fb6e465ccbccd1b000a74ae1c71b23cbe89..092da0c7d7598c3704d723c0878d71482574d75b 100644 (file)
@@ -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):
 
index a33581c58be24de4f8401bb14e64853374a29ba2..95abb056248af8ba1a90cc6232d42d6af24735c7 100644 (file)
@@ -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)
index 01d8955f442fca32748034b5f9692bcb0e3c0dc9..e6dba3454950eadbee57dc0a14d9bb71a6868427 100644 (file)
@@ -755,6 +755,21 @@ class BasicUnicodeTest(unittest.TestCase):
                     decodedresult += reader.read()
                 self.assertEqual(decodedresult, s, "%r != %r (encoding=%r)" % (decodedresult, s, encoding))
 
+    def test_seek(self):
+        # all codecs should be able to encode these
+        s = u"%s\n%s\n" % (100*u"abc123", 100*u"def456")
+        for encoding in all_unicode_encodings:
+            if encoding == "idna": # FIXME: See SF bug #1163178
+                continue
+            if encoding in broken_unicode_with_streams:
+                continue
+            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)
+
 class BasicStrTest(unittest.TestCase):
     def test_basics(self):
         s = "abc123"