@@ -256,21 +256,37 @@ fn io_error_to_error(io: io::IoError) -> ParserError {
256
256
pub type EncodeResult = io:: IoResult < ( ) > ;
257
257
pub type DecodeResult < T > = Result < T , DecoderError > ;
258
258
259
- fn escape_bytes ( writer : & mut io:: Writer , s : & [ u8 ] ) -> Result < ( ) , io:: IoError > {
260
- try!( writer. write_str ( "\" " ) ) ;
261
- for byte in s. iter ( ) {
262
- match * byte {
263
- b'"' => try!( writer. write_str ( "\\ \" " ) ) ,
264
- b'\\' => try!( writer. write_str ( "\\ \\ " ) ) ,
265
- b'\x08' => try!( writer. write_str ( "\\ b" ) ) ,
266
- b'\x0c' => try!( writer. write_str ( "\\ f" ) ) ,
267
- b'\n' => try!( writer. write_str ( "\\ n" ) ) ,
268
- b'\r' => try!( writer. write_str ( "\\ r" ) ) ,
269
- b'\t' => try!( writer. write_str ( "\\ t" ) ) ,
270
- _ => try!( writer. write_u8 ( * byte) ) ,
271
- }
272
- }
273
- writer. write_str ( "\" " )
259
+ pub fn escape_bytes ( wr : & mut io:: Writer , bytes : & [ u8 ] ) -> Result < ( ) , io:: IoError > {
260
+ try!( wr. write_str ( "\" " ) ) ;
261
+
262
+ let mut start = 0 ;
263
+
264
+ for ( i, byte) in bytes. iter ( ) . enumerate ( ) {
265
+ let escaped = match * byte {
266
+ b'"' => "\\ \" " ,
267
+ b'\\' => "\\ \\ " ,
268
+ b'\x08' => "\\ b" ,
269
+ b'\x0c' => "\\ f" ,
270
+ b'\n' => "\\ n" ,
271
+ b'\r' => "\\ r" ,
272
+ b'\t' => "\\ t" ,
273
+ _ => { continue ; }
274
+ } ;
275
+
276
+ if start < i {
277
+ try!( wr. write ( bytes. slice ( start, i) ) ) ;
278
+ }
279
+
280
+ try!( wr. write_str ( escaped) ) ;
281
+
282
+ start = i + 1 ;
283
+ }
284
+
285
+ if start != bytes. len ( ) {
286
+ try!( wr. write ( bytes. slice_from ( start) ) ) ;
287
+ }
288
+
289
+ wr. write_str ( "\" " )
274
290
}
275
291
276
292
fn escape_str ( writer : & mut io:: Writer , v : & str ) -> Result < ( ) , io:: IoError > {
0 commit comments