@@ -278,20 +278,29 @@ impl<'a> BufWriter<'a> {
278
278
279
279
impl < ' a > Writer for BufWriter < ' a > {
280
280
#[ inline]
281
- fn write ( & mut self , buf : & [ u8 ] ) -> IoResult < ( ) > {
282
- // return an error if the entire write does not fit in the buffer
283
- let cap = if self . pos >= self . buf . len ( ) { 0 } else { self . buf . len ( ) - self . pos } ;
284
- if buf. len ( ) > cap {
285
- return Err ( IoError {
286
- kind : io:: OtherIoError ,
287
- desc : "Trying to write past end of buffer" ,
288
- detail : None
289
- } )
281
+ fn write ( & mut self , src : & [ u8 ] ) -> IoResult < ( ) > {
282
+ let dst = self . buf [ mut self . pos ..] ;
283
+ let dst_len = dst. len ( ) ;
284
+
285
+ if dst_len == 0 {
286
+ return Err ( io:: standard_error ( io:: EndOfFile ) ) ;
290
287
}
291
288
292
- slice:: bytes:: copy_memory ( self . buf [ mut self . pos ..] , buf) ;
293
- self . pos += buf. len ( ) ;
294
- Ok ( ( ) )
289
+ let src_len = src. len ( ) ;
290
+
291
+ if dst_len >= src_len {
292
+ slice:: bytes:: copy_memory ( dst, src) ;
293
+
294
+ self . pos += src_len;
295
+
296
+ Ok ( ( ) )
297
+ } else {
298
+ slice:: bytes:: copy_memory ( dst, src[ ..dst_len] ) ;
299
+
300
+ self . pos += dst_len;
301
+
302
+ Err ( io:: standard_error ( io:: ShortWrite ( dst_len) ) )
303
+ }
295
304
}
296
305
}
297
306
@@ -302,7 +311,7 @@ impl<'a> Seek for BufWriter<'a> {
302
311
#[ inline]
303
312
fn seek ( & mut self , pos : i64 , style : SeekStyle ) -> IoResult < ( ) > {
304
313
let new = try!( combine ( style, self . pos , self . buf . len ( ) , pos) ) ;
305
- self . pos = new as uint ;
314
+ self . pos = min ( new as uint , self . buf . len ( ) ) ;
306
315
Ok ( ( ) )
307
316
}
308
317
}
@@ -419,7 +428,7 @@ mod test {
419
428
420
429
#[ test]
421
430
fn test_buf_writer ( ) {
422
- let mut buf = [ 0 as u8 , ..8 ] ;
431
+ let mut buf = [ 0 as u8 , ..9 ] ;
423
432
{
424
433
let mut writer = BufWriter :: new ( & mut buf) ;
425
434
assert_eq ! ( writer. tell( ) , Ok ( 0 ) ) ;
@@ -431,9 +440,10 @@ mod test {
431
440
writer. write ( & [ ] ) . unwrap ( ) ;
432
441
assert_eq ! ( writer. tell( ) , Ok ( 8 ) ) ;
433
442
434
- assert ! ( writer. write( & [ 1 ] ) . is_err( ) ) ;
443
+ assert_eq ! ( writer. write( & [ 8 , 9 ] ) . unwrap_err( ) . kind, io:: ShortWrite ( 1 ) ) ;
444
+ assert_eq ! ( writer. write( & [ 10 ] ) . unwrap_err( ) . kind, io:: EndOfFile ) ;
435
445
}
436
- let b: & [ _ ] = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ;
446
+ let b: & [ _ ] = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] ;
437
447
assert_eq ! ( buf. as_slice( ) , b) ;
438
448
}
439
449
@@ -474,7 +484,7 @@ mod test {
474
484
475
485
match writer. write ( & [ 0 , 0 ] ) {
476
486
Ok ( ..) => panic ! ( ) ,
477
- Err ( e) => assert_eq ! ( e. kind, io:: OtherIoError ) ,
487
+ Err ( e) => assert_eq ! ( e. kind, io:: ShortWrite ( 1 ) ) ,
478
488
}
479
489
}
480
490
0 commit comments