12
12
13
13
use std:: str;
14
14
15
+ macro_rules! if_ok( ( $e: expr) => (
16
+ match $e { Ok ( e) => e, Err ( e) => { self . last_error = Err ( e) ; return } }
17
+ ) )
18
+
15
19
// Simple Extensible Binary Markup Language (ebml) reader and writer on a
16
20
// cursor model. See the specification here:
17
21
// http://www.matroska.org/technical/specs/rfc/index.html
@@ -595,9 +599,15 @@ pub mod writer {
595
599
596
600
// ebml writing
597
601
pub struct Encoder < ' a > {
598
- // FIXME(#5665): this should take a trait object
602
+ // FIXME(#5665): this should take a trait object. Note that if you
603
+ // delete this comment you should consider removing the
604
+ // unwrap()'s below of the results of the calls to
605
+ // write(). We're guaranteed that writing into a MemWriter
606
+ // won't fail, but this is not true for all I/O streams in
607
+ // general.
599
608
writer : & ' a mut MemWriter ,
600
609
priv size_positions : ~[ uint ] ,
610
+ last_error : io:: IoResult < ( ) > ,
601
611
}
602
612
603
613
fn write_sized_vuint ( w : & mut MemWriter , n : uint , size : uint ) {
@@ -609,7 +619,7 @@ pub mod writer {
609
619
4 u => w. write ( & [ 0x10u8 | ( ( n >> 24_ u) as u8 ) , ( n >> 16_ u) as u8 ,
610
620
( n >> 8_ u) as u8 , n as u8 ] ) ,
611
621
_ => fail ! ( "vint to write too big: {}" , n)
612
- } ;
622
+ } . unwrap ( )
613
623
}
614
624
615
625
fn write_vuint ( w : & mut MemWriter , n : uint ) {
@@ -624,7 +634,8 @@ pub mod writer {
624
634
let size_positions: ~[ uint ] = ~[ ] ;
625
635
Encoder {
626
636
writer : w,
627
- size_positions : size_positions
637
+ size_positions : size_positions,
638
+ last_error : Ok ( ( ) ) ,
628
639
}
629
640
}
630
641
@@ -635,6 +646,7 @@ pub mod writer {
635
646
Encoder {
636
647
writer : cast:: transmute_copy ( & self . writer ) ,
637
648
size_positions : self . size_positions . clone ( ) ,
649
+ last_error : Ok ( ( ) ) ,
638
650
}
639
651
}
640
652
@@ -645,18 +657,18 @@ pub mod writer {
645
657
write_vuint ( self . writer , tag_id) ;
646
658
647
659
// Write a placeholder four-byte size.
648
- self . size_positions . push ( self . writer . tell ( ) as uint ) ;
660
+ self . size_positions . push ( if_ok ! ( self . writer. tell( ) ) as uint ) ;
649
661
let zeroes: & [ u8 ] = & [ 0u8 , 0u8 , 0u8 , 0u8 ] ;
650
- self . writer . write ( zeroes) ;
662
+ if_ok ! ( self . writer. write( zeroes) ) ;
651
663
}
652
664
653
665
pub fn end_tag ( & mut self ) {
654
666
let last_size_pos = self . size_positions . pop ( ) . unwrap ( ) ;
655
- let cur_pos = self . writer . tell ( ) ;
656
- self . writer . seek ( last_size_pos as i64 , io:: SeekSet ) ;
667
+ let cur_pos = if_ok ! ( self . writer. tell( ) ) ;
668
+ if_ok ! ( self . writer. seek( last_size_pos as i64 , io:: SeekSet ) ) ;
657
669
let size = ( cur_pos as uint - last_size_pos - 4 ) ;
658
670
write_sized_vuint ( self . writer , size, 4 u) ;
659
- self . writer . seek ( cur_pos as i64 , io:: SeekSet ) ;
671
+ if_ok ! ( self . writer. seek( cur_pos as i64 , io:: SeekSet ) ) ;
660
672
661
673
debug ! ( "End tag (size = {})" , size) ;
662
674
}
@@ -670,7 +682,7 @@ pub mod writer {
670
682
pub fn wr_tagged_bytes ( & mut self , tag_id : uint , b : & [ u8 ] ) {
671
683
write_vuint ( self . writer , tag_id) ;
672
684
write_vuint ( self . writer , b. len ( ) ) ;
673
- self . writer . write ( b) ;
685
+ self . writer . write ( b) . unwrap ( ) ;
674
686
}
675
687
676
688
pub fn wr_tagged_u64 ( & mut self , tag_id : uint , v : u64 ) {
@@ -723,12 +735,12 @@ pub mod writer {
723
735
724
736
pub fn wr_bytes ( & mut self , b : & [ u8 ] ) {
725
737
debug ! ( "Write {} bytes" , b. len( ) ) ;
726
- self . writer . write ( b) ;
738
+ self . writer . write ( b) . unwrap ( ) ;
727
739
}
728
740
729
741
pub fn wr_str ( & mut self , s : & str ) {
730
742
debug ! ( "Write str: {}" , s) ;
731
- self . writer . write ( s. as_bytes ( ) ) ;
743
+ self . writer . write ( s. as_bytes ( ) ) . unwrap ( ) ;
732
744
}
733
745
}
734
746
0 commit comments