@@ -478,6 +478,7 @@ impl Reader {
478
478
#[ cfg( test) ]
479
479
mod tests {
480
480
use super :: * ;
481
+ use std:: { mem, slice} ;
481
482
482
483
#[ test]
483
484
fn no_tags ( ) {
@@ -1481,4 +1482,70 @@ mod tests {
1481
1482
fn consumer < E : core:: error:: Error > ( _e : E ) { }
1482
1483
consumer ( MbiLoadError :: IllegalAddress )
1483
1484
}
1485
+
1486
+ fn custom_tag ( ) {
1487
+ const CUSTOM_TAG_ID : u32 = 0x1337 ;
1488
+
1489
+ #[ repr( C , align( 8 ) ) ]
1490
+ struct Bytes ( [ u8 ; 32 ] ) ;
1491
+ let bytes: Bytes = Bytes ( [
1492
+ 32 ,
1493
+ 0 ,
1494
+ 0 ,
1495
+ 0 , // total_size
1496
+ 0 ,
1497
+ 0 ,
1498
+ 0 ,
1499
+ 0 , // reserved
1500
+ // my custom tag
1501
+ CUSTOM_TAG_ID . to_ne_bytes ( ) [ 0 ] ,
1502
+ CUSTOM_TAG_ID . to_ne_bytes ( ) [ 1 ] ,
1503
+ CUSTOM_TAG_ID . to_ne_bytes ( ) [ 2 ] ,
1504
+ CUSTOM_TAG_ID . to_ne_bytes ( ) [ 3 ] ,
1505
+ 13 ,
1506
+ 0 ,
1507
+ 0 ,
1508
+ 0 , // tag size
1509
+ 110 ,
1510
+ 97 ,
1511
+ 109 ,
1512
+ 101 , // ASCII string 'name'
1513
+ 0 ,
1514
+ 0 ,
1515
+ 0 ,
1516
+ 0 , // null byte + padding
1517
+ 0 ,
1518
+ 0 ,
1519
+ 0 ,
1520
+ 0 , // end tag type
1521
+ 8 ,
1522
+ 0 ,
1523
+ 0 ,
1524
+ 0 , // end tag size
1525
+ ] ) ;
1526
+ let addr = bytes. 0 . as_ptr ( ) as usize ;
1527
+ let bi = unsafe { load ( addr) } ;
1528
+ let bi = bi. unwrap ( ) ;
1529
+ assert_eq ! ( addr, bi. start_address( ) ) ;
1530
+ assert_eq ! ( addr + bytes. 0 . len( ) , bi. end_address( ) ) ;
1531
+ assert_eq ! ( bytes. 0 . len( ) , bi. total_size( ) ) ;
1532
+
1533
+ #[ repr( C , align( 8 ) ) ]
1534
+ struct CustomTag {
1535
+ tag : TagTypeId ,
1536
+ size : u32 ,
1537
+ name : u8 ,
1538
+ }
1539
+
1540
+ let tag = bi
1541
+ . get_tag ( CUSTOM_TAG_ID . into ( ) )
1542
+ . unwrap ( )
1543
+ . cast_tag :: < CustomTag > ( ) ;
1544
+
1545
+ // strlen without null byte
1546
+ let strlen = tag. size as usize - mem:: size_of :: < CommandLineTag > ( ) ;
1547
+ let bytes = unsafe { slice:: from_raw_parts ( ( & tag. name ) as * const u8 , strlen) } ;
1548
+ let name = core:: str:: from_utf8 ( bytes) . unwrap ( ) ;
1549
+ assert_eq ! ( name, "name" ) ;
1550
+ }
1484
1551
}
0 commit comments