about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorErick Tryzelaar <erick.tryzelaar@gmail.com>2011-12-28 00:30:04 -0800
committerErick Tryzelaar <erick.tryzelaar@gmail.com>2011-12-28 11:19:41 -0800
commitb6cecdd4de2824b3f07c2c7126300479037f0b3b (patch)
tree2bf9aef00c49aa44e6ac95736f69b5b9f66283b9 /src/libstd
parent1f0757c684b11d56519ffe006ce7be891b3eb940 (diff)
downloadrust-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.rs29
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)
 }