Skip to content

Commit 8ba7a12

Browse files
committed
---
yaml --- r: 1870 b: refs/heads/master c: 864e2ab h: refs/heads/master v: v3
1 parent 8e5bd74 commit 8ba7a12

File tree

2 files changed

+62
-23
lines changed

2 files changed

+62
-23
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 3712ee68add470947c4d42bd42ca04c9320e629c
2+
refs/heads/master: 864e2ab24e98544dcde794995f5b1d66c4f047c6

trunk/src/lib/io.rs

Lines changed: 61 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,38 @@ fn file_reader(str path) -> reader {
191191

192192
// Byte buffer readers
193193

194-
//state obj byte_buf_reader(vec[mutable? u8] buf) {
195-
// fn read(
196-
//}
194+
// TODO: mutable? u8, but this fails with rustboot.
195+
type byte_buf = @rec(vec[u8] buf, mutable uint pos);
196+
197+
state obj byte_buf_reader(byte_buf bbuf) {
198+
impure fn read(uint len) -> vec[u8] {
199+
auto rest = _vec.len[u8](bbuf.buf) - bbuf.pos;
200+
auto to_read = len;
201+
if (rest < to_read) {
202+
to_read = rest;
203+
}
204+
auto range = _vec.slice[u8](bbuf.buf, bbuf.pos, bbuf.pos + to_read);
205+
bbuf.pos += to_read;
206+
ret range;
207+
}
208+
209+
impure fn unread_byte(int byte) {
210+
log "TODO: unread_byte";
211+
fail;
212+
}
213+
214+
impure fn eof() -> bool {
215+
ret bbuf.pos == _vec.len[u8](bbuf.buf);
216+
}
217+
218+
impure fn seek(int offset, seek_style whence) {
219+
auto pos = bbuf.pos;
220+
auto len = _vec.len[u8](bbuf.buf);
221+
bbuf.pos = seek_in_buf(offset, pos, len, whence);
222+
}
223+
224+
impure fn tell() -> uint { ret bbuf.pos; }
225+
}
197226

198227

199228
// Writing
@@ -377,9 +406,9 @@ type str_writer =
377406
fn get_str() -> str;
378407
};
379408

380-
type byte_buf = @rec(mutable vec[mutable u8] buf, mutable uint pos);
409+
type mutable_byte_buf = @rec(mutable vec[mutable u8] buf, mutable uint pos);
381410

382-
state obj byte_buf_writer(byte_buf buf) {
411+
state obj byte_buf_writer(mutable_byte_buf buf) {
383412
fn write(vec[u8] v) {
384413
// FIXME: optimize
385414
auto vlen = _vec.len[u8](v);
@@ -397,21 +426,9 @@ state obj byte_buf_writer(byte_buf buf) {
397426
}
398427

399428
fn seek(int offset, seek_style whence) {
400-
auto pos = buf.pos as int;
401-
auto len = _vec.len[mutable u8](buf.buf) as int;
402-
alt (whence) {
403-
case (seek_set) { pos = offset; }
404-
case (seek_cur) { pos += offset; }
405-
case (seek_end) { pos = len + offset; }
406-
}
407-
408-
if (pos < 0) {
409-
pos = 0;
410-
} else if (pos > len) {
411-
pos = len;
412-
}
413-
414-
buf.pos = pos as uint;
429+
auto pos = buf.pos;
430+
auto len = _vec.len[mutable u8](buf.buf);
431+
buf.pos = seek_in_buf(offset, pos, len, whence);
415432
}
416433

417434
fn tell() -> uint { ret buf.pos; }
@@ -422,14 +439,36 @@ fn string_writer() -> str_writer {
422439
let vec[mutable u8] b = vec(mutable 0u8);
423440
_vec.pop[mutable u8](b);
424441

425-
let byte_buf buf = @rec(mutable buf = b, mutable pos = 0u);
426-
state obj str_writer_wrap(writer wr, byte_buf buf) {
442+
let mutable_byte_buf buf = @rec(mutable buf = b, mutable pos = 0u);
443+
state obj str_writer_wrap(writer wr, mutable_byte_buf buf) {
427444
fn get_writer() -> writer {ret wr;}
428445
fn get_str() -> str {ret _str.unsafe_from_mutable_bytes(buf.buf);}
429446
}
430447
ret str_writer_wrap(new_writer(byte_buf_writer(buf)), buf);
431448
}
432449

450+
451+
// Utility functions
452+
453+
fn seek_in_buf(int offset, uint pos, uint len, seek_style whence) -> uint {
454+
auto bpos = pos as int;
455+
auto blen = len as int;
456+
alt (whence) {
457+
case (seek_set) { bpos = offset; }
458+
case (seek_cur) { bpos += offset; }
459+
case (seek_end) { bpos = blen + offset; }
460+
}
461+
462+
if (bpos < 0) {
463+
bpos = 0;
464+
} else if (bpos > blen) {
465+
bpos = blen;
466+
}
467+
468+
ret bpos as uint;
469+
}
470+
471+
433472
//
434473
// Local Variables:
435474
// mode: rust

0 commit comments

Comments
 (0)