#REFACTORING by stefan
authorStefan Vogel <sv@exept.de>
Thu, 16 Feb 2017 20:31:42 +0100
changeset 21467 f4cefe65731e
parent 21466 17c794d37c87
child 21468 10849f037322
#REFACTORING by stefan class: Stream comment/format in: #nextPutUtf16Bytes:MSB: changed: #nextPutAllUtf16: #nextPutAllUtf8: #nextPutUtf8:
Stream.st
--- a/Stream.st	Thu Feb 16 20:16:11 2017 +0100
+++ b/Stream.st	Thu Feb 16 20:31:42 2017 +0100
@@ -1,3 +1,5 @@
+"{ Encoding: utf8 }"
+
 "
  COPYRIGHT (c) 1989 by Claus Gittinger
 	      All Rights Reserved
@@ -220,6 +222,7 @@
     ^ self == Stream
 ! !
 
+
 !Stream methodsFor:'Compatibility-Dolphin'!
 
 display:someObject
@@ -2015,18 +2018,11 @@
 !
 
 nextPutAllUtf16:aString
-    "write a string as UTF-16 characters.
-     Notice: this writes characters - not bytes.
-     The underlying stream must be a stream which can deal with characters,
-     eg. OrderedCollectionStream, TwoByteCharacterStream, etc.
-     Also notice, that characters above 16rFFFF are escaped according UTF16 sepcifications."
-
-    |sz "{Class: SmallInteger}"|
-
-    sz := aString size.
-    1 to:sz do:[:idx|
-        self nextPutUtf16:(aString at:idx).
-    ].
+    "write a string as UTF-16BE characters."
+
+    self nextPutAllUtf16Bytes:aString MSB:true
+
+    "Modified (comment): / 16-02-2017 / 17:04:37 / stefan"
 !
 
 nextPutAllUtf16Bytes:aString MSB:msb
@@ -2042,21 +2038,54 @@
 
     "
         (#[] writeStream
-            nextPutAllUtf16Bytes:'BÄxxx' MSB:true;
+            nextPutAllUtf16Bytes:'BÄxxx' MSB:true;
             nextPutUtf16:(Character codePoint:16r10CCCC) MSB:true;
             contents)
    "
 !
 
 nextPutAllUtf8:aString
-    "normal streams can not handle multi-byte characters, so convert them to utf8"
-
-    |sz "{Class: SmallInteger}"|
-
-    sz := aString size.
-    1 to:sz do:[:idx|
-        self nextPutUtf8:(aString at:idx).
+    "write the UTF-8 representation of aString to myself."
+
+    |string 
+     stringSize "{ Class: SmallInteger }"|
+
+    string := aString string.
+
+    "/ avoid creation of new strings if possible
+    string containsNon7BitAscii ifFalse:[
+        self nextPutAll:string asSingleByteString.
+        ^ self.
+    ].
+
+    stringSize := string size.
+    1 to:stringSize do:[:idx |
+        self nextPutUtf8:(string at:idx).
     ].
+
+    "
+        String streamContents:[:s|
+            s nextPutAllUtf8:'hallo'
+        ].
+
+        ByteArray streamContents:[:s|
+            s nextPutAllUtf8:'hallo'
+        ].
+
+        String streamContents:[:s|
+            s nextPutAllUtf8:'abcdeäöüß' asUnicode32String
+        ].
+.
+        ByteArray streamContents:[:s|
+            s nextPutAllUtf8:'abcdeäöüß' asUnicode32String
+        ].
+
+        '/tmp/bytes' asFilename writingFileDo:[:s|
+            s nextPutAllUtf8:'abcdeäöüß'
+        ].
+    "
+
+    "Modified (format): / 16-02-2017 / 20:28:52 / stefan"
 !
 
 nextPutByte:aByteValue
@@ -2463,7 +2492,7 @@
     "
         ((WriteStream on:Unicode16String new)
             nextPutUtf16:$B;
-            nextPutUtf16:$Ä; 
+            nextPutUtf16:$Ä; 
             nextPutUtf16:(Character codePoint:16r10CCCC)
             yourself) contents
     "
@@ -2498,18 +2527,27 @@
 
     "
         (#[] writeStream
-            nextPutUtf16:$B MSB:true;
-            nextPutUtf16:$Ä MSB:true;
-            nextPutUtf16:(Character codePoint:16r10CCCC) MSB:true;
+            nextPutUtf16Bytes:$B MSB:true;
+            nextPutUtf16Bytes:$Ä MSB:true;
+            nextPutUtf16Bytes:(Character codePoint:16r10CCCC) MSB:true;
+            contents)
+
+        ('' writeStream
+            nextPutUtf16Bytes:$B MSB:true;
+            nextPutUtf16Bytes:$Ä MSB:true;
+            nextPutUtf16Bytes:(Character codePoint:16r10CCCC) MSB:true;
             contents)
 
         (FileStream newTemporary
-            nextPutUtf16:$B MSB:false;
-            nextPutUtf16:$Ä MSB:false;
-            nextPutUtf16:(Character codePoint:16r10CCCC) MSB:false;
+            nextPutUtf16Bytes:$B MSB:false;
+            nextPutUtf16Bytes:$Ä MSB:false;
+            nextPutUtf16Bytes:(Character codePoint:16r10CCCC) MSB:false;
             reset;
             binary;
-            contents)"
+            contents)
+    "
+
+    "Modified (comment): / 16-02-2017 / 17:02:55 / stefan"
 !
 
 nextPutUtf8:aCharacter
@@ -2518,60 +2556,58 @@
      Up to 31 bits can be encoded in up to 6 bytes.
      However, currently, characters are limited to 31 bits."
 
-    |codePoint "{Class: SmallInteger}"
-     v "{Class: SmallInteger}"
-     b1 b2 b3 b4 b5|
+    |codePoint "{Class: SmallInteger}"|
 
     codePoint := aCharacter codePoint.
 
     codePoint <= 16r7F ifTrue:[
         "/ 7 bits - 1 byte    
-        self nextPut:aCharacter.
+        self nextPutByte:codePoint.
         ^ self.
     ].
     codePoint <= 16r7FF ifTrue:[
         "/ 11 bits - 2 byte sequence 5+6   
         self 
-            nextPut:(Character value:(((codePoint bitShift:-6) bitAnd:16r1F) bitOr:16rC0));
-            nextPut:(Character value:((codePoint bitAnd:16r3F) bitOr:16r80)).
+            nextPutByte:(((codePoint bitShift:-6) bitAnd:16r1F) bitOr:16rC0);
+            nextPutByte:((codePoint bitAnd:16r3F) bitOr:16r80).
         ^ self.
     ].
     codePoint <= 16rFFFF ifTrue:[
         "/ 16 bits - 3 byte sequence 4+6+6  
         self 
-            nextPut:(Character value:(((codePoint bitShift:-12) bitAnd:16r0F) bitOr:16rE0));
-            nextPut:(Character value:(((codePoint bitShift:-6) bitAnd:16r3F) bitOr:16r80));
-            nextPut:(Character value:((codePoint bitAnd:16r3F) bitOr:16r80)).
+            nextPutByte:(((codePoint bitShift:-12) bitAnd:16r0F) bitOr:16rE0);
+            nextPutByte:(((codePoint bitShift:-6) bitAnd:16r3F) bitOr:16r80);
+            nextPutByte:((codePoint bitAnd:16r3F) bitOr:16r80).
         ^ self.
     ].
     codePoint <= 16r1FFFFF ifTrue:[
         "/ 21 bits - 4 byte sequence 3+6+6+6  
         self 
-            nextPut:(Character value:(((codePoint bitShift:-18) bitAnd:16r07) bitOr:16rF0));
-            nextPut:(Character value:(((codePoint bitShift:-12) bitAnd:16r3F) bitOr:16r80));
-            nextPut:(Character value:(((codePoint bitShift:-6) bitAnd:16r3F) bitOr:16r80));
-            nextPut:(Character value:((codePoint bitAnd:16r3F) bitOr:16r80)).
+            nextPutByte:(((codePoint bitShift:-18) bitAnd:16r07) bitOr:16rF0);
+            nextPutByte:(((codePoint bitShift:-12) bitAnd:16r3F) bitOr:16r80);
+            nextPutByte:(((codePoint bitShift:-6) bitAnd:16r3F) bitOr:16r80);
+            nextPutByte:((codePoint bitAnd:16r3F) bitOr:16r80).
         ^ self.
     ].
     codePoint <= 16r1FFFFF ifTrue:[
         "/ 26 bits - 5 byte sequence 2+6+6+6+6  
         self 
-            nextPut:(Character value:(((codePoint bitShift:-24) bitAnd:16r03) bitOr:16rF8));
-            nextPut:(Character value:(((codePoint bitShift:-18) bitAnd:16r3F) bitOr:16r80));
-            nextPut:(Character value:(((codePoint bitShift:-12) bitAnd:16r3F) bitOr:16r80));
-            nextPut:(Character value:(((codePoint bitShift:-6) bitAnd:16r3F) bitOr:16r80));
-            nextPut:(Character value:((codePoint bitAnd:16r3F) bitOr:16r80)).
+            nextPutByte:(((codePoint bitShift:-24) bitAnd:16r03) bitOr:16rF8);
+            nextPutByte:(((codePoint bitShift:-18) bitAnd:16r3F) bitOr:16r80);
+            nextPutByte:(((codePoint bitShift:-12) bitAnd:16r3F) bitOr:16r80);
+            nextPutByte:(((codePoint bitShift:-6) bitAnd:16r3F) bitOr:16r80);
+            nextPutByte:((codePoint bitAnd:16r3F) bitOr:16r80).
         ^ self.
     ].
     codePoint <= 16r3FFFFFF ifTrue:[
         "/ 31 bits - 6 byte sequence 1+6+6+6+6+6  
         self 
-            nextPut:(Character value:(((codePoint bitShift:-30) bitAnd:16r01) bitOr:16rFC));
-            nextPut:(Character value:(((codePoint bitShift:-24) bitAnd:16r3F) bitOr:16r80));
-            nextPut:(Character value:(((codePoint bitShift:-18) bitAnd:16r3F) bitOr:16r80));
-            nextPut:(Character value:(((codePoint bitShift:-12) bitAnd:16r3F) bitOr:16r80));
-            nextPut:(Character value:(((codePoint bitShift:-6) bitAnd:16r3F) bitOr:16r80));
-            nextPut:(Character value:((codePoint bitAnd:16r3F) bitOr:16r80)).
+            nextPutByte:(((codePoint bitShift:-30) bitAnd:16r01) bitOr:16rFC);
+            nextPutByte:(((codePoint bitShift:-24) bitAnd:16r3F) bitOr:16r80);
+            nextPutByte:(((codePoint bitShift:-18) bitAnd:16r3F) bitOr:16r80);
+            nextPutByte:(((codePoint bitShift:-12) bitAnd:16r3F) bitOr:16r80);
+            nextPutByte:(((codePoint bitShift:-6) bitAnd:16r3F) bitOr:16r80);
+            nextPutByte:((codePoint bitAnd:16r3F) bitOr:16r80).
         ^ self.
     ].
 
@@ -2616,7 +2652,7 @@
     "
       (String streamContents:[:s|
             s nextPutUtf8:$a.
-            s nextPutUtf8:$ü.
+            s nextPutUtf8:$ü.
             s nextPutUtf8: (Character value:16r1fff).
             s nextPutUtf8: (Character value:16rffff).
             s nextPutUtf8: (Character value:16r1ffffff).
@@ -2625,6 +2661,8 @@
             asByteArray
 
     "
+
+    "Modified: / 16-02-2017 / 17:25:48 / stefan"
 ! !
 
 !Stream methodsFor:'non homogenous writing - obsolete'!