Stream.st
branchjv
changeset 21387 e3865533e6a6
parent 21242 19fabe339f8b
parent 21321 6d9d1c27a9ce
child 21784 d58698c455c1
--- a/Stream.st	Sun Jan 29 11:04:01 2017 +0000
+++ b/Stream.st	Wed Feb 01 11:28:48 2017 +0000
@@ -2525,45 +2525,91 @@
     codePoint := aCharacter codePoint.
 
     codePoint <= 16r7F ifTrue:[
+        "/ 7 bits - 1 byte    
         self nextPut:aCharacter.
         ^ self.
     ].
-
-    b1 := Character codePoint:((codePoint bitAnd:16r3F) bitOr:2r10000000).
-    v := codePoint bitShift:-6.
-    v <= 16r1F ifTrue:[
-        self nextPut:(Character value:(v bitOr:2r11000000)).
-        self nextPut:b1.
+    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)).
+        ^ 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)).
         ^ self.
     ].
-    b2 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000).
-    v := v bitShift:-6.
-    v <= 16r0F ifTrue:[
-        self nextPut:(Character value:(v bitOr:2r11100000)).
-        self nextPut:b2; nextPut:b1.
+    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)).
+        ^ 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)).
         ^ self.
     ].
-    b3 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000).
-    v := v bitShift:-6.
-    v <= 16r07 ifTrue:[
-        self nextPut:(Character value:(v bitOr:2r11110000)).
-        self nextPut:b3; nextPut:b2; nextPut:b1.
+    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)).
         ^ self.
     ].
-    b4 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000).
-    v := v bitShift:-6.
-    v <= 16r03 ifTrue:[
-        self nextPut:(Character value:(v bitOr:2r11111000)).
-        self nextPut:b4; nextPut:b3; nextPut:b2; nextPut:b1.
-        ^ self.
-    ].
-    b5 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000).
-    v := v bitShift:-6.
-    v <= 16r01 ifTrue:[
-        self nextPut:(Character value:(v bitOr:2r11111100)).
-        self nextPut:b5; nextPut:b4; nextPut:b3; nextPut:b2; nextPut:b1.
-        ^ self.
-    ].
+
+"/    b1 := Character codePoint:((codePoint bitAnd:16r3F) bitOr:2r10000000).
+"/    v := codePoint bitShift:-6.
+"/    v <= 16r1F ifTrue:[
+"/        self nextPut:(Character value:(v bitOr:2r11000000)).
+"/        self nextPut:b1.
+"/        ^ self.
+"/    ].
+"/    b2 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000).
+"/    v := v bitShift:-6.
+"/    v <= 16r0F ifTrue:[
+"/        self nextPut:(Character value:(v bitOr:2r11100000)).
+"/        self nextPut:b2; nextPut:b1.
+"/        ^ self.
+"/    ].
+"/    b3 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000).
+"/    v := v bitShift:-6.
+"/    v <= 16r07 ifTrue:[
+"/        self nextPut:(Character value:(v bitOr:2r11110000)).
+"/        self nextPut:b3; nextPut:b2; nextPut:b1.
+"/        ^ self.
+"/    ].
+"/    b4 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000).
+"/    v := v bitShift:-6.
+"/    v <= 16r03 ifTrue:[
+"/        self nextPut:(Character value:(v bitOr:2r11111000)).
+"/        self nextPut:b4; nextPut:b3; nextPut:b2; nextPut:b1.
+"/        ^ self.
+"/    ].
+"/    b5 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000).
+"/    v := v bitShift:-6.
+"/    v <= 16r01 ifTrue:[
+"/        self nextPut:(Character value:(v bitOr:2r11111100)).
+"/        self nextPut:b5; nextPut:b4; nextPut:b3; nextPut:b2; nextPut:b1.
+"/        ^ self.
+"/    ].
 
     EncodingError raiseWith:aCharacter errorString:'codePoint > 31bit in #nextPutUtf8:'.