class: EncodedStream
authorStefan Vogel <sv@exept.de>
Wed, 21 Aug 2013 16:07:18 +0200
changeset 15664 1b91431394a5
parent 15663 60a2fefee8a4
child 15665 eb289b107887
class: EncodedStream comment/format in: #documentation changed: #decodedStreamFor: #nextChunk Fix encode checking for FilteringStreams
EncodedStream.st
--- a/EncodedStream.st	Wed Aug 21 16:01:32 2013 +0200
+++ b/EncodedStream.st	Wed Aug 21 16:07:18 2013 +0200
@@ -36,10 +36,10 @@
 
 documentation
 "
-        a stream which transparently decodes from an external decoding,
-        looking for '---- Encoding: xxx' near the beginning of the file.
+    a stream which transparently decodes from an external decoding,
+    looking for '{ Encoding: xxx' near the beginning of the file.
 
-        especially targeted towards reading ST/X source files.
+    especially targeted towards reading ST/X source files.
 "
 ! !
 
@@ -59,21 +59,21 @@
 
     |encodingSymbol decoder decodedStream|
 
-    aStream isPositionable ifTrue:[
-        encodingSymbol := CharacterEncoder guessEncodingOfStream:aStream.
+    aStream inputStream isPositionable ifTrue:[
+        encodingSymbol := CharacterEncoder guessEncodingOfStream:aStream inputStream.
         decoder := self encoderFor:encodingSymbol.
         decoder isNil ifTrue:[
             "/ ascii or iso8895-1
             ^ aStream
         ].
+        decodedStream := self stream:aStream encoder:decoder.
+        decodedStream skipEncodingChunk.
     ] ifFalse:[
         "/ setup for no-encoding; 
         "/ switch to a real encoder later,
-        "/ whenever an encoding pragma is encountered later.
-        decoder := CharacterEncoder nullEncoderInstance.
+        "/ whenever an encoding pragma is encountered later by #nextChunk.
+        decodedStream := self stream:aStream encoder:CharacterEncoder nullEncoderInstance.
     ].
-    decodedStream := self stream:aStream encoder:decoder.
-    decodedStream skipEncodingChunk.
     ^ decodedStream
 !
 
@@ -192,25 +192,27 @@
 
 nextChunk
     "as a side effect, check for an encoding chunk"
-
-    |prevEncoder chunk enc|
+    
+    |prevEncoder chunk|
 
     chunk := stream nextChunk.
-    chunk isNil ifTrue:[^ chunk].
-
+    chunk isNil ifTrue:[
+        ^ nil
+    ].
     prevEncoder := encoder.
-    stream isPositionable ifFalse:[
+    (prevEncoder isNullEncoder and:[stream isPositionable not]) ifTrue:[
         "/ not already checked
-        encoder isNullEncoder ifTrue:[
-            "/ check if we need lazy setup of the encoder
-            "/ (used with non-positionable streams)
-            (chunk includesString:'---- Encoding:') ifTrue:[
-                enc := self class encoderFor:(CharacterEncoder guessEncodingOfBuffer:chunk).
-                encoder := enc ? encoder.
-            ]
-        ].
+        "/ check if we need lazy setup of the encoder
+        "/ (used with non-positionable streams)
+        (chunk includesString:'{ Encoding:') ifTrue:[
+            |enc|
+
+            enc := self class encoderFor:(CharacterEncoder guessEncodingOfBuffer:chunk).
+            enc notNil ifTrue:[
+                prevEncoder := encoder := enc.
+            ].
+        ]
     ].
-
     ^ prevEncoder decodeString:chunk
 !
 
@@ -370,11 +372,11 @@
 !EncodedStream class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/EncodedStream.st,v 1.33 2013-08-10 11:31:31 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/EncodedStream.st,v 1.34 2013-08-21 14:07:18 stefan Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic/EncodedStream.st,v 1.33 2013-08-10 11:31:31 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/EncodedStream.st,v 1.34 2013-08-21 14:07:18 stefan Exp $'
 !
 
 version_SVN