1 ! Copyright (C) 2023 John Benediktsson
2 ! See https://factorcode.org/license.txt for BSD license
4 USING: byte-vectors combinators.short-circuit io
5 io.streams.byte-array kernel math namespaces sequences ;
13 :: (write-uleb128) ( n quot: ( b -- ) -- )
14 n assert-non-negative [
15 [ -7 shift dup ] [ 0x7f bitand ] bi :> ( i b )
16 dup zero? [ f b ] [ t b 0x80 bitor ] if
22 : stream-write-uleb128 ( n stream -- )
23 '[ _ stream-write1 ] (write-uleb128) ;
25 : write-uleb128 ( n -- )
26 output-stream get stream-write-uleb128 ;
28 : >uleb128 ( n -- byte-array )
29 16 <byte-vector> clone [
30 '[ _ push ] (write-uleb128)
33 :: stream-read-uleb128 ( stream -- n )
35 stream stream-read1 :> ( i b )
36 b 0x7f bitand i 7 * shift +
40 : read-uleb128 ( -- n )
41 input-stream get stream-read-uleb128 ;
43 : uleb128> ( byte-array -- n )
44 0 byte-reader boa stream-read-uleb128 ;
50 :: (write-leb128) ( n quot: ( b -- ) -- )
52 [ -7 shift dup ] [ 0x7f bitand ] bi :> ( i b )
54 [ i zero? b 6 bit? not and ]
55 [ i -1 = b 6 bit? and ]
56 } 0|| [ f b ] [ t b 0x80 bitor ] if
62 : stream-write-leb128 ( n stream -- )
63 '[ _ stream-write1 ] (write-leb128) ;
65 : write-leb128 ( n -- )
66 output-stream get stream-write-leb128 ;
68 : >leb128 ( n -- byte-array )
69 16 <byte-vector> clone [
70 '[ _ push ] (write-leb128)
73 :: stream-read-leb128 ( stream -- n )
75 stream stream-read1 :> ( i b )
76 b 0x7f bitand i 7 * shift +
79 [ [ 7 * 2^ neg bitor ] keep ] dip
84 : read-leb128 ( -- n )
85 input-stream get stream-read-leb128 ;
87 : leb128> ( byte-array -- n )
88 0 byte-reader boa stream-read-leb128 ;