@@ -103,21 +103,51 @@ macro_rules! expect {
103103 } )
104104}
105105
106+ const QU : u8 = 1 ; // quote
107+ const BS : u8 = 2 ; // backslash
108+ const CT : u8 = 4 ; // control character
109+
110+ static CHARCODES : [ u8 ; 256 ] = [
111+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
112+ CT , CT , CT , CT , CT , CT , CT , CT , CT , CT , CT , CT , CT , CT , CT , CT , // 0
113+ CT , CT , CT , CT , CT , CT , CT , CT , CT , CT , CT , CT , CT , CT , CT , CT , // 1
114+ 0 , 0 , QU , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // 2
115+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // 3
116+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // 4
117+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , BS , 0 , 0 , 0 , // 5
118+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // 6
119+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , CT , // 7
120+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // 8
121+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // 9
122+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // A
123+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // B
124+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // C
125+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // D
126+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // E
127+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // F
128+ ] ;
129+
106130macro_rules! expect_string {
107131 ( $parser: ident) => ( {
108132 let result: String ; // = unsafe { mem::uninitialized() };
109133 let start = $parser. index;
110134
111135 loop {
112136 let ch = next_byte!( $parser) ;
137+ let code = CHARCODES [ ch as usize ] ;
138+ if code == 0 {
139+ continue ;
140+ }
113141 if ch == b'"' {
114142 result = ( & $parser. source[ start .. $parser. index - 1 ] ) . into( ) ;
115143 break ;
116- } ;
144+ }
117145 if ch == b'\\' {
118146 result = try!( $parser. read_complex_string( start) ) ;
119147 break ;
120148 }
149+
150+ return $parser. unexpected_character( ch) ;
121151 }
122152
123153 result
@@ -351,6 +381,12 @@ impl<'a> Parser<'a> {
351381 buffer. extend_from_slice ( self . source [ start .. self . index - 1 ] . as_bytes ( ) ) ;
352382
353383 loop {
384+ let code = CHARCODES [ ch as usize ] ;
385+ if code == 0 {
386+ buffer. push ( ch) ;
387+ ch = next_byte ! ( self ) ;
388+ continue ;
389+ }
354390 match ch {
355391 b'"' => break ,
356392 b'\\' => {
@@ -373,7 +409,7 @@ impl<'a> Parser<'a> {
373409 } ;
374410 buffer. push ( escaped) ;
375411 } ,
376- _ => buffer . push ( ch)
412+ _ => return self . unexpected_character ( ch)
377413 }
378414 ch = next_byte ! ( self ) ;
379415 }
0 commit comments