@@ -227,41 +227,58 @@ fn file_reader(path: str) -> result::t<reader, str> {
227
227
// Byte buffer readers
228
228
229
229
// TODO: const u8, but this fails with rustboot.
230
- type byte_buf = { buf : [ u8 ] , mutable pos: uint } ;
230
+ type byte_buf = { buf : [ u8 ] , mutable pos: uint , len : uint } ;
231
231
232
232
impl of reader for byte_buf {
233
233
fn read_bytes ( len : uint ) -> [ u8 ] {
234
- let rest = vec :: len ( self . buf ) - self . pos ;
234
+ let rest = self . len - self . pos ;
235
235
let to_read = len;
236
236
if rest < to_read { to_read = rest; }
237
237
let range = vec:: slice ( self . buf , self . pos , self . pos + to_read) ;
238
238
self . pos += to_read;
239
239
ret range;
240
240
}
241
241
fn read_byte ( ) -> int {
242
- if self . pos == vec :: len ( self . buf ) { ret -1 ; }
242
+ if self . pos == self . len { ret -1 ; }
243
243
let b = self . buf [ self . pos ] ;
244
244
self . pos += 1 u;
245
245
ret b as int ;
246
246
}
247
247
fn unread_byte ( _byte : int ) { #error ( "TODO: unread_byte" ) ; fail; }
248
- fn eof ( ) -> bool { self . pos == vec :: len ( self . buf ) }
248
+ fn eof ( ) -> bool { self . pos == self . len }
249
249
fn seek ( offset : int , whence : seek_style ) {
250
250
let pos = self . pos ;
251
- let len = vec:: len ( self . buf ) ;
252
- self . pos = seek_in_buf ( offset, pos, len, whence) ;
251
+ self . pos = seek_in_buf ( offset, pos, self . len , whence) ;
253
252
}
254
253
fn tell ( ) -> uint { self . pos }
255
254
}
256
255
257
256
fn bytes_reader ( bytes : [ u8 ] ) -> reader {
258
- { buf: bytes, mutable pos: 0 u} as reader
257
+ bytes_reader_between ( bytes, 0 u, vec:: len ( bytes) )
258
+ }
259
+
260
+ fn bytes_reader_between ( bytes : [ u8 ] , start : uint , end : uint ) -> reader {
261
+ { buf: bytes, mutable pos: start, len: end} as reader
262
+ }
263
+
264
+ fn with_bytes_reader < t > ( bytes : [ u8 ] , f : fn ( reader ) -> t ) -> t {
265
+ f ( bytes_reader ( bytes) )
266
+ }
267
+
268
+ fn with_bytes_reader_between < t > ( bytes : [ u8 ] , start : uint , end : uint ,
269
+ f : fn ( reader ) -> t ) -> t {
270
+ f ( bytes_reader_between ( bytes, start, end) )
259
271
}
260
272
261
273
fn string_reader ( s : str ) -> reader {
262
274
bytes_reader ( str:: bytes ( s) )
263
275
}
264
276
277
+ fn with_str_reader < T > ( s : str , f : fn ( reader ) -> T ) -> T {
278
+ str:: as_bytes ( s) { |bytes|
279
+ with_bytes_reader_between ( bytes, 0 u, str:: len ( s) , f)
280
+ }
281
+ }
265
282
266
283
// Writing
267
284
enum fileflag { append, create, truncate, no_flag, }
0 commit comments