@@ -6,6 +6,7 @@ Basic input/output
6
6
7
7
import result:: result;
8
8
9
+ import dvec :: { dvec, extensions} ;
9
10
import libc :: { c_int, c_uint, c_void, size_t, ssize_t} ;
10
11
import libc:: consts:: os:: posix88:: * ;
11
12
import libc:: consts:: os:: extra:: * ;
@@ -574,46 +575,45 @@ fn stderr() -> writer { fd_writer(libc::STDERR_FILENO as c_int, false) }
574
575
fn print ( s : str ) { stdout ( ) . write_str ( s) ; }
575
576
fn println ( s : str ) { stdout ( ) . write_line ( s) ; }
576
577
577
- type mem_buffer = @{ mut buf : [ mut u8] ,
578
- mut pos : uint } ;
578
+ type mem_buffer = @{ buf : dvec < u8 > , mut pos : uint } ;
579
579
580
580
impl of writer for mem_buffer {
581
581
fn write ( v : [ const u8 ] /& ) {
582
582
// Fast path.
583
- if self . pos == vec:: len ( self . buf ) {
584
- for vec:: each( v) { |b| self . buf += [ mut b] ; }
585
- self . pos += vec:: len ( v) ;
583
+ let vlen = vec:: len ( v) ;
584
+ let buf_len = self . buf . len ( ) ;
585
+ if self . pos == buf_len {
586
+ self . buf . push_all ( v) ;
587
+ self . pos += vlen;
586
588
ret;
587
589
}
588
- // FIXME: Optimize: These should be unique pointers. // #2004
589
- let vlen = vec:: len ( v) ;
590
- let mut vpos = 0 u;
591
- while vpos < vlen {
592
- let b = v[ vpos] ;
593
- if self . pos == vec:: len ( self . buf ) {
594
- self . buf += [ mut b] ;
595
- } else { self . buf [ self . pos ] = b; }
596
- self . pos += 1 u;
590
+
591
+ // FIXME #2004--use memcpy here?
592
+ let mut pos = self . pos , vpos = 0 u;
593
+ while vpos < vlen && pos < buf_len {
594
+ self . buf . set_elt ( pos, v[ vpos] ) ;
595
+ pos += 1 u;
597
596
vpos += 1 u;
598
597
}
598
+ self . buf . push_slice ( v, vpos, vlen) ;
599
+ self . pos += vlen;
599
600
}
600
601
fn seek ( offset : int , whence : seek_style ) {
601
602
let pos = self . pos ;
602
- let len = vec :: len ( self . buf ) ;
603
+ let len = self . buf . len ( ) ;
603
604
self . pos = seek_in_buf ( offset, pos, len, whence) ;
604
605
}
605
606
fn tell ( ) -> uint { self . pos }
606
607
fn flush ( ) -> int { 0 }
607
608
}
608
609
609
610
fn mem_buffer ( ) -> mem_buffer {
610
- @{ mut buf: [ mut ] , mut pos: 0 u}
611
+ @{ buf: dvec ( ) , mut pos: 0 u}
611
612
}
612
613
fn mem_buffer_writer ( b : mem_buffer ) -> writer { b as writer }
613
- fn mem_buffer_buf ( b : mem_buffer ) -> [ u8 ] { vec :: from_mut ( b. buf ) }
614
+ fn mem_buffer_buf ( b : mem_buffer ) -> [ u8 ] { b. buf . get ( ) }
614
615
fn mem_buffer_str ( b : mem_buffer ) -> str {
615
- let b_ = vec:: from_mut ( b. buf ) ;
616
- str:: from_bytes ( b_)
616
+ str:: from_bytes ( b. buf . get ( ) )
617
617
}
618
618
619
619
fn with_str_writer ( f : fn ( writer ) ) -> str {
@@ -827,6 +827,21 @@ mod tests {
827
827
result:: ok ( _) { fail; }
828
828
}
829
829
}
830
+
831
+ #[ test]
832
+ fn mem_buffer_overwrite ( ) {
833
+ let mbuf = mem_buffer ( ) ;
834
+ mbuf. write ( [ 0u8 , 1u8 , 2u8 , 3u8 ] ) ;
835
+ assert mem_buffer_buf ( mbuf) == [ 0u8 , 1u8 , 2u8 , 3u8 ] ;
836
+ mbuf. seek ( -2 , seek_cur) ;
837
+ mbuf. write ( [ 4u8 , 5u8 , 6u8 , 7u8 ] ) ;
838
+ assert mem_buffer_buf ( mbuf) == [ 0u8 , 1u8 , 4u8 , 5u8 , 6u8 , 7u8 ] ;
839
+ mbuf. seek ( -2 , seek_end) ;
840
+ mbuf. write ( [ 8u8 ] ) ;
841
+ mbuf. seek ( 1 , seek_set) ;
842
+ mbuf. write ( [ 9u8 ] ) ;
843
+ assert mem_buffer_buf( mbuf) == [ 0u8 , 9u8 , 4u8 , 5u8 , 8u8 , 7u8 ] ;
844
+ }
830
845
}
831
846
832
847
//
0 commit comments