@@ -24,32 +24,31 @@ const fn backslash<const N: usize>(a: ascii::Char) -> ([ascii::Char; N], Range<u
2424const fn escape_ascii < const N : usize > ( byte : u8 ) -> ( [ ascii:: Char ; N ] , Range < u8 > ) {
2525 const { assert ! ( N >= 4 ) } ;
2626
27- match byte {
28- b'\t' => backslash ( ascii:: Char :: SmallT ) ,
29- b'\r' => backslash ( ascii:: Char :: SmallR ) ,
30- b'\n' => backslash ( ascii:: Char :: SmallN ) ,
31- b'\\' => backslash ( ascii:: Char :: ReverseSolidus ) ,
32- b'\'' => backslash ( ascii:: Char :: Apostrophe ) ,
33- b'\"' => backslash ( ascii:: Char :: QuotationMark ) ,
34- byte => {
35- let mut output = [ ascii:: Char :: Null ; N ] ;
36-
37- if let Some ( c) = byte. as_ascii ( )
38- && !byte. is_ascii_control ( )
39- {
40- output[ 0 ] = c;
41- ( output, 0 ..1 )
42- } else {
43- let hi = HEX_DIGITS [ ( byte >> 4 ) as usize ] ;
44- let lo = HEX_DIGITS [ ( byte & 0xf ) as usize ] ;
45-
46- output[ 0 ] = ascii:: Char :: ReverseSolidus ;
47- output[ 1 ] = ascii:: Char :: SmallX ;
48- output[ 2 ] = hi;
49- output[ 3 ] = lo;
50-
51- ( output, 0 ..4 )
52- }
27+ let mut output = [ ascii:: Char :: Null ; N ] ;
28+
29+ match byte. as_ascii ( ) {
30+ Some ( ascii:: Char :: CharacterTabulation ) => backslash ( ascii:: Char :: SmallT ) ,
31+ Some ( ascii:: Char :: CarriageReturn ) => backslash ( ascii:: Char :: SmallR ) ,
32+ Some ( ascii:: Char :: LineFeed ) => backslash ( ascii:: Char :: SmallN ) ,
33+ Some (
34+ c @ ascii:: Char :: ReverseSolidus
35+ | c @ ascii:: Char :: Apostrophe
36+ | c @ ascii:: Char :: QuotationMark ,
37+ ) => backslash ( c) ,
38+ Some ( c) if !byte. is_ascii_control ( ) => {
39+ output[ 0 ] = c;
40+ ( output, 0 ..1 )
41+ }
42+ _ => {
43+ let hi = HEX_DIGITS [ ( byte >> 4 ) as usize ] ;
44+ let lo = HEX_DIGITS [ ( byte & 0xf ) as usize ] ;
45+
46+ output[ 0 ] = ascii:: Char :: ReverseSolidus ;
47+ output[ 1 ] = ascii:: Char :: SmallX ;
48+ output[ 2 ] = hi;
49+ output[ 3 ] = lo;
50+
51+ ( output, 0 ..4 )
5352 }
5453 }
5554}
0 commit comments