@@ -2,6 +2,8 @@ use std::io::Write;
22use std:: num:: FpCategory ;
33use JsonValue ;
44
5+ extern crate itoa;
6+
57pub trait Generator {
68 fn get_buffer ( & mut self ) -> & mut Vec < u8 > ;
79
@@ -27,10 +29,10 @@ pub trait Generator {
2729
2830 fn dedent ( & mut self ) { }
2931
30- fn write_string ( & mut self , string : & str ) {
31- self . write_char ( b'"' ) ;
32+ fn write_string_complex ( & mut self , string : & str , from : usize ) {
33+ self . write ( string [ 0 .. from ] . as_bytes ( ) ) ;
3234
33- for ch in string. bytes ( ) {
35+ for ch in string. bytes ( ) . skip ( from ) {
3436 match ch {
3537 b'\\' | b'"' => {
3638 self . write_char ( b'\\' ) ;
@@ -41,20 +43,33 @@ pub trait Generator {
4143 b'\t' => self . write ( b"\\ t" ) ,
4244 0xC => self . write ( b"\\ f" ) ,
4345 0x8 => self . write ( b"\\ b" ) ,
44- _ => self . write_char ( ch)
46+ _ => self . write_char ( ch) ,
4547 }
4648 }
4749
4850 self . write_char ( b'"' ) ;
4951 }
5052
51- fn write_digits_from_u64 ( & mut self , mut num : u64 ) {
52- let digit = ( num % 10 ) as u8 ;
53- if num > 9 {
54- num /= 10 ;
55- self . write_digits_from_u64 ( num) ;
53+ fn write_string ( & mut self , string : & str ) {
54+ self . write_char ( b'"' ) ;
55+
56+ for ( index, ch) in string. bytes ( ) . enumerate ( ) {
57+ match ch {
58+ b'\\' |
59+ b'"' |
60+ b'\n' |
61+ b'\r' |
62+ b'\t' |
63+ 0xC |
64+ 0x8 => {
65+ return self . write_string_complex ( string, index)
66+ } ,
67+ _ => { }
68+ }
5669 }
57- self . write_char ( digit + b'0' ) ;
70+
71+ self . write ( string. as_bytes ( ) ) ;
72+ self . write_char ( b'"' ) ;
5873 }
5974
6075 fn write_number ( & mut self , mut num : f64 ) {
@@ -92,7 +107,7 @@ pub trait Generator {
92107 return ;
93108 }
94109
95- self . write_digits_from_u64 ( num as u64 ) ;
110+ itoa :: write ( self . get_buffer ( ) , num as u64 ) . unwrap ( ) ;
96111 }
97112
98113 fn write_json ( & mut self , json : & JsonValue ) {
0 commit comments