aboutsummaryrefslogtreecommitdiff
path: root/src/lib/_io.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/_io.rs')
-rw-r--r--src/lib/_io.rs76
1 files changed, 64 insertions, 12 deletions
diff --git a/src/lib/_io.rs b/src/lib/_io.rs
index 94021aa6..142f808a 100644
--- a/src/lib/_io.rs
+++ b/src/lib/_io.rs
@@ -2,23 +2,19 @@ type buf_reader = unsafe obj {
fn read() -> vec[u8];
};
+type buf_writer = unsafe obj {
+ fn write(vec[u8] v);
+};
+
fn default_bufsz() -> uint {
ret 4096u;
}
fn new_buf() -> vec[u8] {
- let vec[u8] v = vec();
- let uint i = default_bufsz();
- while (i > 0u) {
- i -= 1u;
- v += vec(0u8);
- }
- // FIXME (issue #93): should be:
- // ret _vec.alloc[u8](default_bufsz());
- ret v;
+ ret _vec.alloc[u8](default_bufsz());
}
-fn new_buf_reader(str s) -> buf_reader {
+fn new_buf_reader(str path) -> buf_reader {
unsafe obj fd_buf_reader(int fd, mutable vec[u8] buf) {
@@ -47,11 +43,67 @@ fn new_buf_reader(str s) -> buf_reader {
}
}
- auto fd = os.libc.open(_str.buf(s), 0);
+ auto fd = os.libc.open(_str.buf(path),
+ os.libc_constants.O_RDONLY() |
+ os.libc_constants.O_BINARY(),
+ 0u);
+
if (fd < 0) {
- log "error opening file";
+ log "error opening file for reading";
log sys.rustrt.last_os_error();
fail;
}
ret fd_buf_reader(fd, new_buf());
}
+
+type fileflag = tag(append(), create(), truncate());
+
+fn new_buf_writer(str path, vec[fileflag] flags) -> buf_writer {
+
+ unsafe obj fd_buf_writer(int fd) {
+
+ fn write(vec[u8] v) {
+ auto len = _vec.len[u8](v);
+ auto count = 0u;
+ auto vbuf;
+ while (count < len) {
+ vbuf = _vec.buf_off[u8](v, count);
+ auto nout = os.libc.write(fd, vbuf, len);
+ if (nout < 0) {
+ log "error dumping buffer";
+ log sys.rustrt.last_os_error();
+ fail;
+ }
+ count += nout as uint;
+ }
+ }
+
+ drop {
+ os.libc.close(fd);
+ }
+ }
+
+ let int fflags =
+ os.libc_constants.O_WRONLY() |
+ os.libc_constants.O_BINARY();
+
+ for (fileflag f in flags) {
+ alt (f) {
+ case (append()) { fflags |= os.libc_constants.O_APPEND(); }
+ case (create()) { fflags |= os.libc_constants.O_CREAT(); }
+ case (truncate()) { fflags |= os.libc_constants.O_TRUNC(); }
+ }
+ }
+
+ auto fd = os.libc.open(_str.buf(path),
+ fflags,
+ os.libc_constants.S_IRUSR() |
+ os.libc_constants.S_IWUSR());
+
+ if (fd < 0) {
+ log "error opening file for writing";
+ log sys.rustrt.last_os_error();
+ fail;
+ }
+ ret fd_buf_writer(fd);
+}