13
13
use prelude:: v1:: * ;
14
14
use io:: prelude:: * ;
15
15
16
+ use cmp;
16
17
use io:: { self , Cursor } ;
17
18
use ptr;
18
19
use str;
@@ -69,19 +70,13 @@ fn write(out: &Output, data: &[u8]) -> io::Result<usize> {
69
70
// [1]: https://tahoe-lafs.org/trac/tahoe-lafs/ticket/1232
70
71
// [2]: http://www.mail-archive.com/[email protected] /msg00661.html
71
72
const OUT_MAX : usize = 8192 ;
72
- let ( utf16, data_len) = match str:: from_utf8 ( data) . ok ( ) {
73
- Some ( mut utf8) => {
74
- if utf8. len ( ) > OUT_MAX {
75
- let mut new_len = OUT_MAX ;
76
- while !utf8. is_char_boundary ( new_len) {
77
- new_len -= 1 ;
78
- }
79
- utf8 = & utf8[ ..new_len] ;
80
- }
81
- ( utf8. encode_utf16 ( ) . collect :: < Vec < u16 > > ( ) , utf8. len ( ) )
82
- }
83
- None => return Err ( invalid_encoding ( ) ) ,
73
+ let len = cmp:: min ( data. len ( ) , OUT_MAX ) ;
74
+ let utf8 = match str:: from_utf8 ( & data[ ..len] ) {
75
+ Ok ( s) => s,
76
+ Err ( ref e) if e. valid_up_to ( ) == 0 => return Err ( invalid_encoding ( ) ) ,
77
+ Err ( e) => str:: from_utf8 ( & data[ ..e. valid_up_to ( ) ] ) . unwrap ( ) ,
84
78
} ;
79
+ let utf16 = utf8. encode_utf16 ( ) . collect :: < Vec < u16 > > ( ) ;
85
80
let mut written = 0 ;
86
81
try!( cvt ( unsafe {
87
82
c:: WriteConsoleW ( handle,
@@ -94,7 +89,7 @@ fn write(out: &Output, data: &[u8]) -> io::Result<usize> {
94
89
// FIXME if this only partially writes the utf16 buffer then we need to
95
90
// figure out how many bytes of `data` were actually written
96
91
assert_eq ! ( written as usize , utf16. len( ) ) ;
97
- Ok ( data_len )
92
+ Ok ( utf8 . len ( ) )
98
93
}
99
94
100
95
impl Stdin {
0 commit comments