diff options
| author | Tycho Sci <tychosci@gmail.com> | 2012-10-18 22:11:03 +0900 |
|---|---|---|
| committer | Tycho Sci <tychosci@gmail.com> | 2012-10-18 23:27:55 +0900 |
| commit | c0cee3ebe47d4fca73cdab23889322c5e47f12e5 (patch) | |
| tree | 5c121f365ae71f52b631cba8309c0dbb45be3b76 | |
| parent | e28a161b720e267c837905e5f1b0760f71ebee14 (diff) | |
| download | rust-c0cee3ebe47d4fca73cdab23889322c5e47f12e5.tar.gz rust-c0cee3ebe47d4fca73cdab23889322c5e47f12e5.zip | |
libcore: Make run::program_output UTF-8 safe
| -rw-r--r-- | src/libcore/run.rs | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/src/libcore/run.rs b/src/libcore/run.rs index 06b86930630..cb6a7f737f9 100644 --- a/src/libcore/run.rs +++ b/src/libcore/run.rs @@ -248,12 +248,14 @@ pub fn start_program(prog: &str, args: &[~str]) -> Program { } fn read_all(rd: io::Reader) -> ~str { - let mut buf = ~""; - while !rd.eof() { - let bytes = rd.read_bytes(4096u); - buf += str::from_bytes(bytes); - } - move buf + let buf = io::with_bytes_writer(|wr| { + let mut bytes = [mut 0, ..4096]; + while !rd.eof() { + let nread = rd.read(bytes, bytes.len()); + wr.write(bytes.view(0, nread)); + } + }); + str::from_bytes(buf) } /** @@ -341,13 +343,15 @@ fn writeclose(fd: c_int, s: ~str) { fn readclose(fd: c_int) -> ~str { let file = os::fdopen(fd); let reader = io::FILE_reader(file, false); - let mut buf = ~""; - while !reader.eof() { - let bytes = reader.read_bytes(4096u); - buf += str::from_bytes(bytes); - } + let buf = io::with_bytes_writer(|writer| { + let mut bytes = [mut 0, ..4096]; + while !reader.eof() { + let nread = reader.read(bytes, bytes.len()); + writer.write(bytes.view(0, nread)); + } + }); os::fclose(file); - move buf + str::from_bytes(buf) } /// Waits for a process to exit and returns the exit code |
