@@ -58,53 +58,50 @@ pub fn read_unsigned_leb128(data: &[u8], start_position: usize) -> (u128, usize)
58
58
}
59
59
60
60
61
- pub fn write_signed_leb128 ( out : & mut Vec < u8 > , start_position : usize , value : i128 ) -> usize {
62
- write_unsigned_leb128 ( out, start_position, value as u128 )
63
- // let mut position = start_position;
64
- // loop {
65
- // let mut byte = (value & 0x7f) as u8;
66
- // value >>= 7;
67
- // let more = !((((value == 0) && ((byte & 0x40) == 0)) ||
68
- // ((value == -1) && ((byte & 0x40) != 0))));
69
- // if more {
70
- // byte |= 0x80; // Mark this byte to show that more bytes will follow.
71
- // }
72
-
73
- // write_to_vec(out, &mut position, byte);
74
-
75
- // if !more {
76
- // break;
77
- // }
78
- // }
79
-
80
- // return position - start_position;
61
+ pub fn write_signed_leb128 ( out : & mut Vec < u8 > , start_position : usize , mut value : i128 ) -> usize {
62
+ let mut position = start_position;
63
+ loop {
64
+ let mut byte = ( value & 0x7f ) as u8 ;
65
+ value >>= 7 ;
66
+ let more = !( ( ( ( value == 0 ) && ( ( byte & 0x40 ) == 0 ) ) ||
67
+ ( ( value == !0 ) && ( ( byte & 0x40 ) != 0 ) ) ) ) ;
68
+ if more {
69
+ byte |= 0x80 ; // Mark this byte to show that more bytes will follow.
70
+ }
71
+
72
+ write_to_vec ( out, & mut position, byte) ;
73
+
74
+ if !more {
75
+ break ;
76
+ }
77
+ }
78
+
79
+ return position - start_position;
81
80
}
82
81
83
82
pub fn read_signed_leb128 ( data : & [ u8 ] , start_position : usize ) -> ( i128 , usize ) {
84
- let ( l, r) = read_unsigned_leb128 ( data, start_position) ;
85
- ( l as i128 , r)
86
- // let mut result = 0;
87
- // let mut shift = 0;
88
- // let mut position = start_position;
89
- // let mut byte;
90
-
91
- // loop {
92
- // byte = data[position];
93
- // position += 1;
94
- // result |= ((byte & 0x7F) as i128) << shift;
95
- // shift += 7;
96
-
97
- // if (byte & 0x80) == 0 {
98
- // break;
99
- // }
100
- // }
101
-
102
- // if (shift < 64) && ((byte & 0x40) != 0) {
103
- // // sign extend
104
- // result |= -(1 << shift);
105
- // }
106
-
107
- // (result, position - start_position)
83
+ let mut result = 0 ;
84
+ let mut shift = 0 ;
85
+ let mut position = start_position;
86
+ let mut byte;
87
+
88
+ loop {
89
+ byte = data[ position] ;
90
+ position += 1 ;
91
+ result |= ( ( byte & 0x7F ) as i128 ) << shift;
92
+ shift += 7 ;
93
+
94
+ if ( byte & 0x80 ) == 0 {
95
+ break ;
96
+ }
97
+ }
98
+
99
+ if ( shift < 64 ) && ( ( byte & 0x40 ) != 0 ) {
100
+ // sign extend
101
+ result |= -( 1 << shift) ;
102
+ }
103
+
104
+ ( result, position - start_position)
108
105
}
109
106
110
107
#[ test]
0 commit comments