#REFACTORING by cg
class: Stream
added: #nextNumber:put:MSB:
changed: #nextNumber:put:
--- a/Stream.st Sun Apr 10 13:33:42 2016 +0200
+++ b/Stream.st Sun Apr 10 17:33:57 2016 +0200
@@ -1774,8 +1774,19 @@
Possibly pad with leading zeros.
The receiver must support writing of binary bytes."
+ self nextNumber:n put:v MSB:true
+!
+
+nextNumber:n put:v MSB:msb
+ "Append to the receiver the argument, v, which is a positive Integer,
+ as the next n bytes.
+ Bytes are written in the specified byte order.
+ Possibly pad with leading zeros (trailing zeros, if lsb).
+ The receiver must support writing of binary bytes."
+
|vlen "{ Class: SmallInteger }"
- i "{ Class: SmallInteger }"|
+ i "{ Class: SmallInteger }"
+ bl bm bh bml bmh|
"claus: this method is central in binaryStorage -
therefore it has been tuned a bit (and needs even more tuning)"
@@ -1789,24 +1800,50 @@
].
n == 2 ifTrue:[
(v between:0 and:16rFFFF) ifTrue:[
- self nextPutByte:(v bitShift:-8); nextPutByte:(v bitAnd:16rFF).
+ bl := (v bitAnd:16rFF).
+ bh := (v bitShift:-8) bitAnd:16rFF.
+ msb ifTrue:[
+ self nextPutByte:bh; nextPutByte:bl.
+ ] ifFalse:[
+ self nextPutByte:bl; nextPutByte:bh.
+ ].
^ self
].
].
n == 3 ifTrue:[
(v between:0 and:16rFFFFFF) ifTrue:[
- self nextPutByte:((v bitShift:-16) bitAnd:16rFF).
- self nextPutByte:((v bitShift:-8) bitAnd:16rFF).
- self nextPutByte:(v bitAnd:16rFF).
+ bl := (v bitAnd:16rFF).
+ bm := (v bitShift:-8) bitAnd:16rFF.
+ bh := (v bitShift:-16) bitAnd:16rFF.
+ msb ifTrue:[
+ self nextPutByte:bh.
+ self nextPutByte:bm.
+ self nextPutByte:bl.
+ ] ifFalse:[
+ self nextPutByte:bl.
+ self nextPutByte:bm.
+ self nextPutByte:bh.
+ ].
^ self
].
].
n == 4 ifTrue:[
- (v >= 0) ifTrue:[
- self nextPutByte:((v bitShift:-24) bitAnd:16rFF).
- self nextPutByte:((v bitShift:-16) bitAnd:16rFF).
- self nextPutByte:((v bitShift:-8) bitAnd:16rFF).
- self nextPutByte:(v bitAnd:16rFF).
+ (v between:0 and:16rFFFFFFFF) ifTrue:[
+ bl := (v bitAnd:16rFF).
+ bml := (v bitShift:-8) bitAnd:16rFF.
+ bmh := (v bitShift:-16) bitAnd:16rFF.
+ bh := (v bitShift:-24) bitAnd:16rFF.
+ msb ifTrue:[
+ self nextPutByte:bh.
+ self nextPutByte:bmh.
+ self nextPutByte:bml.
+ self nextPutByte:bl.
+ ] ifFalse:[
+ self nextPutByte:bl.
+ self nextPutByte:bml.
+ self nextPutByte:bmh.
+ self nextPutByte:bh.
+ ].
^ self
].
].
@@ -1822,21 +1859,31 @@
self error:'number too big'
].
- "pad with leading zeros"
- i := n.
- [i > vlen] whileTrue:[
- self nextPutByte:0.
- i := i - 1
- ].
-
- i == 1 ifTrue:[
- ^ self nextPutByte:v
- ].
-
- [i > 0] whileTrue:[
- self nextPutByte:(v digitAt:i).
- i := i - 1
- ]
+ msb ifTrue:[
+ "pad with leading zeros"
+ i := n.
+ [i > vlen] whileTrue:[
+ self nextPutByte:0.
+ i := i - 1
+ ].
+
+ i == 1 ifTrue:[
+ ^ self nextPutByte:v
+ ].
+
+ [i > 0] whileTrue:[
+ self nextPutByte:(v digitAt:i).
+ i := i - 1
+ ]
+ ] ifFalse:[
+ 1 to:vlen do:[:i |
+ self nextPutByte:(v digitAt:i).
+ ].
+ "pad with trailing zeros"
+ vlen+1 to:n do:[:i |
+ self nextPutByte:0.
+ ].
+ ].
"Modified: / 22-06-2006 / 11:31:13 / fm"
!