@@ -191,9 +191,38 @@ fn file_reader(str path) -> reader {
191
191
192
192
// Byte buffer readers
193
193
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
+ }
197
226
198
227
199
228
// Writing
@@ -377,9 +406,9 @@ type str_writer =
377
406
fn get_str ( ) -> str ;
378
407
} ;
379
408
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) ;
381
410
382
- state obj byte_buf_writer ( byte_buf buf) {
411
+ state obj byte_buf_writer ( mutable_byte_buf buf) {
383
412
fn write ( vec[ u8] v ) {
384
413
// FIXME: optimize
385
414
auto vlen = _vec. len [ u8] ( v) ;
@@ -397,21 +426,9 @@ state obj byte_buf_writer(byte_buf buf) {
397
426
}
398
427
399
428
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) ;
415
432
}
416
433
417
434
fn tell ( ) -> uint { ret buf. pos ; }
@@ -422,14 +439,36 @@ fn string_writer() -> str_writer {
422
439
let vec[ mutable u8] b = vec ( mutable 0u8 ) ;
423
440
_vec. pop [ mutable u8] ( b) ;
424
441
425
- let byte_buf buf = @rec ( mutable buf = b, mutable pos = 0 u) ;
426
- state obj str_writer_wrap ( writer wr, byte_buf buf) {
442
+ let mutable_byte_buf buf = @rec ( mutable buf = b, mutable pos = 0 u) ;
443
+ state obj str_writer_wrap ( writer wr, mutable_byte_buf buf) {
427
444
fn get_writer ( ) -> writer { ret wr; }
428
445
fn get_str ( ) -> str { ret _str. unsafe_from_mutable_bytes ( buf. buf ) ; }
429
446
}
430
447
ret str_writer_wrap ( new_writer ( byte_buf_writer ( buf) ) , buf) ;
431
448
}
432
449
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
+
433
472
//
434
473
// Local Variables:
435
474
// mode: rust
0 commit comments