diff options
| author | Graydon Hoare <[email protected]> | 2010-07-13 14:24:47 -0700 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-07-13 14:24:47 -0700 |
| commit | 15ef6c12d9bdbbd41db7c3df8fb6c3efd8e84493 (patch) | |
| tree | 7c05956f3e3ad16445fb7d2d8b1103c3d9dd731b /src/lib/_io.rs | |
| parent | Add differently-typed refcount synonyms to _str and _vec. (diff) | |
| download | rust-15ef6c12d9bdbbd41db7c3df8fb6c3efd8e84493.tar.xz rust-15ef6c12d9bdbbd41db7c3df8fb6c3efd8e84493.zip | |
Modify _io's fd_buf_reader to do something slightly more useful: produce multiple buffers on demand.
Diffstat (limited to 'src/lib/_io.rs')
| -rw-r--r-- | src/lib/_io.rs | 46 |
1 files changed, 33 insertions, 13 deletions
diff --git a/src/lib/_io.rs b/src/lib/_io.rs index 1f01c3b3..d41ab132 100644 --- a/src/lib/_io.rs +++ b/src/lib/_io.rs @@ -1,26 +1,46 @@ -type buf_reader = obj { - fn read(vec[u8] buf) -> uint; +type buf_reader = unsafe obj { + fn read() -> vec[u8]; }; -type buf_writer = obj { - fn write(vec[u8] buf) -> uint; -}; +fn default_bufsz() -> uint { + ret uint(4096); +} + +fn new_buf() -> vec[u8] { + let vec[u8] v = vec(); + let uint i = default_bufsz(); + while (i > uint(0)) { + i -= uint(1); + v += vec(u8(0)); + } + // FIXME (issue #93): should be: + // ret _vec.alloc[u8](default_bufsz()); +} + +fn new_buf_reader(str s) -> buf_reader { -fn mk_buf_reader(str s) -> buf_reader { + unsafe obj fd_buf_reader(int fd, mutable vec[u8] buf) { + + fn read() -> vec[u8] { + + // Ensure our buf is singly-referenced. + if (_vec.rustrt.refcount[u8](buf) != uint(1)) { + buf = new_buf(); + } + + auto len = _vec.len[u8](buf); + auto vbuf = _vec.buf[u8](buf); + auto count = os.libc.read(fd, vbuf, len); - obj fd_reader(int fd) { - fn read(vec[u8] v) -> uint { - auto len = _vec.len[u8](v); - auto buf = _vec.buf[u8](v); - auto count = os.libc.read(fd, buf, len); if (count < 0) { log "error filling buffer"; log sys.rustrt.last_os_error(); fail; } else { - ret uint(count); + ret buf; } } + drop { os.libc.close(fd); } @@ -32,5 +52,5 @@ fn mk_buf_reader(str s) -> buf_reader { log sys.rustrt.last_os_error(); fail; } - ret fd_reader(fd); + ret fd_buf_reader(fd, new_buf()); } |