diff options
| author | Erick Tryzelaar <erick.tryzelaar@gmail.com> | 2011-12-28 00:30:04 -0800 |
|---|---|---|
| committer | Erick Tryzelaar <erick.tryzelaar@gmail.com> | 2011-12-28 11:19:41 -0800 |
| commit | b6cecdd4de2824b3f07c2c7126300479037f0b3b (patch) | |
| tree | 2bf9aef00c49aa44e6ac95736f69b5b9f66283b9 /src/libstd | |
| parent | 1f0757c684b11d56519ffe006ce7be891b3eb940 (diff) | |
| download | rust-b6cecdd4de2824b3f07c2c7126300479037f0b3b.tar.gz rust-b6cecdd4de2824b3f07c2c7126300479037f0b3b.zip | |
libstd: add bytes_reader and bytes_writer
This parallels nicely with string_reader and string_writer, but working with raw byte strings. I'm not quite sure if the return type for bytes_writer.get_bytes should be [u8] or [mutable u8] though, so I'm arbitrarily picking mutable for now.
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/io.rs | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/src/libstd/io.rs b/src/libstd/io.rs index df9135101e0..1928cd4b3d7 100644 --- a/src/libstd/io.rs +++ b/src/libstd/io.rs @@ -242,6 +242,10 @@ fn new_byte_buf_reader(buf: [u8]) -> buf_reader { ret byte_buf_reader(@{buf: buf, mutable pos: 0u}); } +fn bytes_reader(bytes: [u8]) -> reader { + ret new_reader(new_byte_buf_reader(bytes)); +} + fn string_reader(s: str) -> reader { ret new_reader(new_byte_buf_reader(str::bytes(s))); } @@ -426,6 +430,12 @@ fn stderr() -> writer { ret new_writer(fd_buf_writer(2i32, option::none)); } fn print(s: str) { stdout().write_str(s); } fn println(s: str) { stdout().write_str(s + "\n"); } +type bytes_writer = + obj { + fn get_writer() -> writer; + fn get_bytes() -> [mutable u8]; + }; + type str_writer = obj { fn get_writer() -> writer; @@ -466,17 +476,26 @@ obj byte_buf_writer(buf: mutable_byte_buf) { fn fsync(_level: fsync::level) -> int { ret 0; } } -fn string_writer() -> str_writer { +fn bytes_writer() -> bytes_writer { // FIXME: yikes, this is bad. Needs fixing of mutable syntax. let b: [mutable u8] = [mutable 0u8]; vec::pop(b); - let buf: mutable_byte_buf = @{mutable buf: b, mutable pos: 0u}; - obj str_writer_wrap(wr: writer, buf: mutable_byte_buf) { + let buf = @{mutable buf: b, mutable pos: 0u}; + obj byte_buf_writer_wrap(wr: writer, buf: mutable_byte_buf) { fn get_writer() -> writer { ret wr; } - fn get_str() -> str { ret str::unsafe_from_bytes(buf.buf); } + fn get_bytes() -> [mutable u8] { ret buf.buf; } + } + ret byte_buf_writer_wrap(new_writer(byte_buf_writer(buf)), buf); +} + +fn string_writer() -> str_writer { + let writer = bytes_writer(); + obj str_writer_wrap(wr: bytes_writer) { + fn get_writer() -> writer { wr.get_writer() } + fn get_str() -> str { str::unsafe_from_bytes(wr.get_bytes()) } } - ret str_writer_wrap(new_writer(byte_buf_writer(buf)), buf); + str_writer_wrap(writer) } |
