@@ -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