#REFACTORING by stefan
class: Stream
comment/format in: #nextPutUtf16Bytes:MSB:
changed:
#nextPutAllUtf16:
#nextPutAllUtf8:
#nextPutUtf8:
--- 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'!