@@ -159,16 +159,16 @@ pub static stringnames: &[&str] = &[ "cbt", "_", "cr", "csr", "tbc", "clear",
159
159
160
160
fn read_le_u16 ( r : & mut dyn io:: Read ) -> io:: Result < u16 > {
161
161
let mut b = [ 0 ; 2 ] ;
162
- let mut amt = 0 ;
163
- while amt < b. len ( ) {
164
- match r. read ( & mut b[ amt..] ) ? {
165
- 0 => return Err ( io:: Error :: new ( io:: ErrorKind :: Other , "end of file" ) ) ,
166
- n => amt += n,
167
- }
168
- }
162
+ r. read_exact ( & mut b) ?;
169
163
Ok ( ( b[ 0 ] as u16 ) | ( ( b[ 1 ] as u16 ) << 8 ) )
170
164
}
171
165
166
+ fn read_le_u32 ( r : & mut dyn io:: Read ) -> io:: Result < u32 > {
167
+ let mut b = [ 0 ; 4 ] ;
168
+ r. read_exact ( & mut b) ?;
169
+ Ok ( ( b[ 0 ] as u32 ) | ( ( b[ 1 ] as u32 ) << 8 ) | ( ( b[ 2 ] as u32 ) << 16 ) | ( ( b[ 3 ] as u32 ) << 24 ) )
170
+ }
171
+
172
172
fn read_byte ( r : & mut dyn io:: Read ) -> io:: Result < u8 > {
173
173
match r. bytes ( ) . next ( ) {
174
174
Some ( s) => s,
@@ -194,9 +194,12 @@ pub fn parse(file: &mut dyn io::Read, longnames: bool) -> Result<TermInfo, Strin
194
194
195
195
// Check magic number
196
196
let magic = t ! ( read_le_u16( file) ) ;
197
- if magic != 0x011A {
198
- return Err ( format ! ( "invalid magic number: expected {:x}, found {:x}" , 0x011A , magic) ) ;
199
- }
197
+
198
+ let extended = match magic {
199
+ 0o0432 => false ,
200
+ 0o01036 => true ,
201
+ _ => return Err ( format ! ( "invalid magic number, found {:o}" , magic) ) ,
202
+ } ;
200
203
201
204
// According to the spec, these fields must be >= -1 where -1 means that the feature is not
202
205
// supported. Using 0 instead of -1 works because we skip sections with length 0.
@@ -258,11 +261,15 @@ pub fn parse(file: &mut dyn io::Read, longnames: bool) -> Result<TermInfo, Strin
258
261
t ! ( read_byte( file) ) ; // compensate for padding
259
262
}
260
263
261
- let numbers_map: HashMap < String , u16 > = t ! {
262
- ( 0 ..numbers_count) . filter_map( |i| match read_le_u16( file) {
263
- Ok ( 0xFFFF ) => None ,
264
- Ok ( n) => Some ( Ok ( ( nnames[ i] . to_string( ) , n) ) ) ,
265
- Err ( e) => Some ( Err ( e) )
264
+ let numbers_map: HashMap < String , u32 > = t ! {
265
+ ( 0 ..numbers_count) . filter_map( |i| {
266
+ let number = if extended { read_le_u32( file) } else { read_le_u16( file) . map( Into :: into) } ;
267
+
268
+ match number {
269
+ Ok ( 0xFFFF ) => None ,
270
+ Ok ( n) => Some ( Ok ( ( nnames[ i] . to_string( ) , n) ) ) ,
271
+ Err ( e) => Some ( Err ( e) )
272
+ }
266
273
} ) . collect( )
267
274
} ;
268
275
@@ -318,7 +325,7 @@ pub fn msys_terminfo() -> TermInfo {
318
325
strings. insert ( "setab" . to_string ( ) , b"\x1B [4%p1%dm" . to_vec ( ) ) ;
319
326
320
327
let mut numbers = HashMap :: new ( ) ;
321
- numbers. insert ( "colors" . to_string ( ) , 8u16 ) ;
328
+ numbers. insert ( "colors" . to_string ( ) , 8 ) ;
322
329
323
330
TermInfo {
324
331
names : vec ! [ "cygwin" . to_string( ) ] , // msys is a fork of an older cygwin version
0 commit comments