Paste: bitreader (original)
Author: | mrjbq7 |
Mode: | factor |
Date: | Thu, 11 Dec 2014 01:24:42 |
Plain Text |
USING: kernel locals accessors math sequences math.bitwise ;
TUPLE: bitreader bytearray curpos curbit ;
: <bitreader> 0 0 bitreader boa ;
: advance 0 >>curbit [ 1 + ] change-curpos ;
: check-advance dup curbit>> 8 = [ advance ] when ;
:: readsinglevalue reader curpos>> reader bytearray>> nth
reader curbit>> dup bits 1 - + swap bit-range
reader [ bits + ] change-curbit check-advance drop ;
: bitsleft curbit>> 8 swap - ;
DEFER: readbits
:: readmultivalue reader bitsleft :> bitsextra
bitsextra reader readsinglevalue
bits bitsextra - reader readbits
bitsextra shift + ;
:: readbits reader curbit>> bits + 8 < [ bits reader readsinglevalue ] [ bits reader readmultivalue ] if ;
Author: | mrjbq7 |
Mode: | factor |
Date: | Thu, 11 Dec 2014 01:24:57 |
Plain Text |
TUPLE: bitreader bytearray curpos curbit ;
: <bitreader> 0 0 bitreader boa ;
: advance
0 >>curbit [ 1 + ] change-curpos ;
: check-advance
dup curbit>> 8 = [ advance ] when ;
:: readsinglevalue
reader curpos>> reader bytearray>> nth
reader curbit>> dup bits 1 - + swap bit-range
reader [ bits + ] change-curbit check-advance drop ;
: bitsleft
curbit>> 8 swap - ;
DEFER: readbits
:: readmultivalue
reader bitsleft :> bitsextra
bitsextra reader readsinglevalue
bits bitsextra - reader readbits
bitsextra shift + ;
:: readbits
reader curbit>> bits + 8 < [
bits reader readsinglevalue
] [
bits reader readmultivalue
] if ;
Author: | mrjbq7 |
Mode: | factor |
Date: | Thu, 11 Dec 2014 01:27:42 |
Plain Text |
USING: kernel locals accessors math sequences math.bitwise ;
TUPLE: bit-reader byte-array current-pos current-bit ;
: <bit-reader> 0 0 bit-reader boa ;
: advance
0 >>current-bit [ 1 + ] change-current-pos ;
: check-advance
dup current-bit>> 8 = [ advance ] when ;
:: read-single-value
reader current-pos>> reader byte-array>> nth
reader current-bit>> dup bits 1 - + swap bit-range
reader [ bits + ] change-current-bit check-advance drop ;
: bits-left
current-bit>> 8 swap - ;
DEFER: read-bits
:: read-multi-value
reader bits-left :> extra-bits
extra-bits reader read-single-value
bits extra-bits - reader read-bits
extra-bits shift + ;
:: read-bits
reader current-bit>> bits + 8 < [
bits reader read-single-value
] [
bits reader read-multi-value
] if ;
Author: | mrjbq7 |
Mode: | factor |
Date: | Thu, 11 Dec 2014 01:35:28 |
Plain Text |
USING: kernel locals accessors math sequences math.bitwise ;
TUPLE: bit-reader byte-array current-pos current-bit ;
: <bit-reader> 0 0 bit-reader boa ;
: advance
0 >>current-bit [ 1 + ] change-current-pos ;
: ?advance
dup current-bit>> 8 = [ advance ] when ;
:: read-single-value
reader current-pos>> reader byte-array>> nth
reader current-bit>> [ bits 1 - + ] keep bit-range
reader [ bits + ] change-current-bit ?advance drop ;
: bits-left
current-bit>> 8 swap - ;
DEFER: read-bits
:: read-multi-value
reader bits-left :> extra-bits
extra-bits reader read-single-value
bits extra-bits - reader read-bits
extra-bits shift + ;
: read-bits
2dup current-bit>> + 8 < [
read-single-value
] [
read-multi-value
] if ;
New Annotation