#REFACTORING by cg
authorClaus Gittinger <cg@exept.de>
Sun, 10 Apr 2016 17:33:57 +0200
changeset 19564 658d55f2a71d
parent 19563 7255172dc813
child 19565 81ebff6f3a0d
#REFACTORING by cg class: Stream added: #nextNumber:put:MSB: changed: #nextNumber:put:
Stream.st
--- 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"
 !