@@ -242,6 +242,10 @@ fn new_byte_buf_reader(buf: [u8]) -> buf_reader {
242
242
ret byte_buf_reader ( @{ buf: buf, mutable pos: 0 u} ) ;
243
243
}
244
244
245
+ fn bytes_reader ( bytes : [ u8 ] ) -> reader {
246
+ ret new_reader ( new_byte_buf_reader ( bytes) ) ;
247
+ }
248
+
245
249
fn string_reader ( s : str ) -> reader {
246
250
ret new_reader ( new_byte_buf_reader ( str:: bytes ( s) ) ) ;
247
251
}
@@ -256,15 +260,15 @@ type buf_writer =
256
260
// FIXME: eventually u64
257
261
258
262
obj {
259
- fn write ( [ u8 ] ) ;
263
+ fn write ( [ const u8 ] ) ;
260
264
fn seek ( int , seek_style ) ;
261
265
fn tell ( ) -> uint ;
262
266
fn flush ( ) -> int ;
263
267
fn fsync ( level : fsync:: level ) -> int ;
264
268
} ;
265
269
266
270
obj FILE_writer ( f: os:: libc:: FILE , res: option:: t<@FILE_res >) {
267
- fn write ( v : [ u8 ] ) unsafe {
271
+ fn write ( v : [ const u8 ] ) unsafe {
268
272
let len = vec:: len :: < u8 > ( v) ;
269
273
let vbuf = vec:: unsafe:: to_ptr :: < u8 > ( v) ;
270
274
let nout = os:: libc:: fwrite ( vbuf, len, 1 u, f) ;
@@ -283,7 +287,7 @@ obj FILE_writer(f: os::libc::FILE, res: option::t<@FILE_res>) {
283
287
resource fd_res( fd: fd_t) { os:: libc:: close ( fd) ; }
284
288
285
289
obj fd_buf_writer( fd: fd_t, res: option:: t<@fd_res>) {
286
- fn write ( v : [ u8 ] ) unsafe {
290
+ fn write ( v : [ const u8 ] ) unsafe {
287
291
let len = vec:: len :: < u8 > ( v) ;
288
292
let count = 0 u;
289
293
let vbuf;
@@ -351,7 +355,7 @@ type writer =
351
355
fn write_char ( char ) ;
352
356
fn write_int ( int ) ;
353
357
fn write_uint ( uint ) ;
354
- fn write_bytes ( [ u8 ] ) ;
358
+ fn write_bytes ( [ const u8 ] ) ;
355
359
fn write_le_uint ( uint , uint ) ;
356
360
fn write_le_int ( int , uint ) ;
357
361
fn write_be_uint ( uint , uint ) ;
@@ -384,7 +388,7 @@ obj new_writer(out: buf_writer) {
384
388
}
385
389
fn write_int ( n : int ) { out. write ( str:: bytes ( int:: to_str ( n, 10 u) ) ) ; }
386
390
fn write_uint ( n : uint ) { out. write ( str:: bytes ( uint:: to_str ( n, 10 u) ) ) ; }
387
- fn write_bytes ( bytes : [ u8 ] ) { out. write ( bytes) ; }
391
+ fn write_bytes ( bytes : [ const u8 ] ) { out. write ( bytes) ; }
388
392
fn write_le_uint ( n : uint , size : uint ) {
389
393
out. write ( uint_to_le_bytes ( n, size) ) ;
390
394
}
@@ -426,6 +430,12 @@ fn stderr() -> writer { ret new_writer(fd_buf_writer(2i32, option::none)); }
426
430
fn print ( s : str ) { stdout ( ) . write_str ( s) ; }
427
431
fn println ( s : str ) { stdout ( ) . write_str ( s + "\n " ) ; }
428
432
433
+ type bytes_writer =
434
+ obj {
435
+ fn get_writer ( ) -> writer ;
436
+ fn get_bytes ( ) -> [ mutable u8] ;
437
+ } ;
438
+
429
439
type str_writer =
430
440
obj {
431
441
fn get_writer ( ) -> writer ;
@@ -435,7 +445,7 @@ type str_writer =
435
445
type mutable_byte_buf = @{ mutable buf: [ mutable u8] , mutable pos: uint } ;
436
446
437
447
obj byte_buf_writer ( buf: mutable_byte_buf) {
438
- fn write ( v : [ u8 ] ) {
448
+ fn write ( v : [ const u8 ] ) {
439
449
// Fast path.
440
450
441
451
if buf. pos == vec:: len ( buf. buf ) {
@@ -466,17 +476,26 @@ obj byte_buf_writer(buf: mutable_byte_buf) {
466
476
fn fsync ( _level : fsync:: level ) -> int { ret 0 ; }
467
477
}
468
478
469
- fn string_writer ( ) -> str_writer {
479
+ fn bytes_writer ( ) -> bytes_writer {
470
480
// FIXME: yikes, this is bad. Needs fixing of mutable syntax.
471
481
472
482
let b: [ mutable u8] = [ mutable 0u8 ] ;
473
483
vec:: pop ( b) ;
474
- let buf: mutable_byte_buf = @{ mutable buf: b, mutable pos: 0 u} ;
475
- obj str_writer_wrap ( wr: writer, buf: mutable_byte_buf) {
484
+ let buf = @{ mutable buf: b, mutable pos: 0 u} ;
485
+ obj byte_buf_writer_wrap ( wr: writer, buf: mutable_byte_buf) {
476
486
fn get_writer ( ) -> writer { ret wr; }
477
- fn get_str ( ) -> str { ret str:: unsafe_from_bytes ( buf. buf ) ; }
487
+ fn get_bytes ( ) -> [ mutable u8] { ret buf. buf ; }
488
+ }
489
+ ret byte_buf_writer_wrap ( new_writer ( byte_buf_writer ( buf) ) , buf) ;
490
+ }
491
+
492
+ fn string_writer ( ) -> str_writer {
493
+ let writer = bytes_writer ( ) ;
494
+ obj str_writer_wrap ( wr: bytes_writer) {
495
+ fn get_writer ( ) -> writer { wr. get_writer ( ) }
496
+ fn get_str ( ) -> str { str:: unsafe_from_bytes ( wr. get_bytes ( ) ) }
478
497
}
479
- ret str_writer_wrap ( new_writer ( byte_buf_writer ( buf ) ) , buf ) ;
498
+ str_writer_wrap ( writer )
480
499
}
481
500
482
501
0 commit comments