@@ -242,6 +242,10 @@ fn new_byte_buf_reader(buf: [u8]) -> buf_reader {
242242 ret byte_buf_reader ( @{ buf: buf, mutable pos: 0 u} ) ;
243243}
244244
245+ fn bytes_reader ( bytes : [ u8 ] ) -> reader {
246+ ret new_reader ( new_byte_buf_reader ( bytes) ) ;
247+ }
248+
245249fn string_reader ( s : str ) -> reader {
246250 ret new_reader ( new_byte_buf_reader ( str:: bytes ( s) ) ) ;
247251}
@@ -256,15 +260,15 @@ type buf_writer =
256260 // FIXME: eventually u64
257261
258262 obj {
259- fn write ( [ u8 ] ) ;
263+ fn write ( [ const u8 ] ) ;
260264 fn seek ( int , seek_style ) ;
261265 fn tell ( ) -> uint ;
262266 fn flush ( ) -> int ;
263267 fn fsync ( level : fsync:: level ) -> int ;
264268 } ;
265269
266270obj FILE_writer ( f: os:: libc:: FILE , res: option:: t<@FILE_res >) {
267- fn write ( v : [ u8 ] ) unsafe {
271+ fn write ( v : [ const u8 ] ) unsafe {
268272 let len = vec:: len :: < u8 > ( v) ;
269273 let vbuf = vec:: unsafe:: to_ptr :: < u8 > ( v) ;
270274 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>) {
283287resource fd_res( fd: fd_t) { os:: libc:: close ( fd) ; }
284288
285289obj fd_buf_writer( fd: fd_t, res: option:: t<@fd_res>) {
286- fn write ( v : [ u8 ] ) unsafe {
290+ fn write ( v : [ const u8 ] ) unsafe {
287291 let len = vec:: len :: < u8 > ( v) ;
288292 let count = 0 u;
289293 let vbuf;
@@ -351,7 +355,7 @@ type writer =
351355 fn write_char ( char ) ;
352356 fn write_int ( int ) ;
353357 fn write_uint ( uint ) ;
354- fn write_bytes ( [ u8 ] ) ;
358+ fn write_bytes ( [ const u8 ] ) ;
355359 fn write_le_uint ( uint , uint ) ;
356360 fn write_le_int ( int , uint ) ;
357361 fn write_be_uint ( uint , uint ) ;
@@ -384,7 +388,7 @@ obj new_writer(out: buf_writer) {
384388 }
385389 fn write_int ( n : int ) { out. write ( str:: bytes ( int:: to_str ( n, 10 u) ) ) ; }
386390 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) ; }
388392 fn write_le_uint ( n : uint , size : uint ) {
389393 out. write ( uint_to_le_bytes ( n, size) ) ;
390394 }
@@ -426,6 +430,12 @@ fn stderr() -> writer { ret new_writer(fd_buf_writer(2i32, option::none)); }
426430fn print ( s : str ) { stdout ( ) . write_str ( s) ; }
427431fn println ( s : str ) { stdout ( ) . write_str ( s + "\n " ) ; }
428432
433+ type bytes_writer =
434+ obj {
435+ fn get_writer ( ) -> writer ;
436+ fn get_bytes ( ) -> [ mutable u8] ;
437+ } ;
438+
429439type str_writer =
430440 obj {
431441 fn get_writer ( ) -> writer ;
@@ -435,7 +445,7 @@ type str_writer =
435445type mutable_byte_buf = @{ mutable buf: [ mutable u8] , mutable pos: uint } ;
436446
437447obj byte_buf_writer ( buf: mutable_byte_buf) {
438- fn write ( v : [ u8 ] ) {
448+ fn write ( v : [ const u8 ] ) {
439449 // Fast path.
440450
441451 if buf. pos == vec:: len ( buf. buf ) {
@@ -466,17 +476,26 @@ obj byte_buf_writer(buf: mutable_byte_buf) {
466476 fn fsync ( _level : fsync:: level ) -> int { ret 0 ; }
467477}
468478
469- fn string_writer ( ) -> str_writer {
479+ fn bytes_writer ( ) -> bytes_writer {
470480 // FIXME: yikes, this is bad. Needs fixing of mutable syntax.
471481
472482 let b: [ mutable u8] = [ mutable 0u8 ] ;
473483 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) {
476486 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 ( ) ) }
478497 }
479- ret str_writer_wrap ( new_writer ( byte_buf_writer ( buf ) ) , buf ) ;
498+ str_writer_wrap ( writer )
480499}
481500
482501
0 commit comments