diff -r 1c4f9355fba3 -r e3865533e6a6 Stream.st --- 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:'.