@@ -126,6 +126,26 @@ impl<'a> Debug for LineReader<'a> {
126126 }
127127}
128128
129+ fn is_digit ( c : & & u8 ) -> bool {
130+ * * c >= b'0' && * * c <= b'9'
131+ }
132+
133+ fn is_octal_digit ( c : & & u8 ) -> bool {
134+ * * c >= b'0' && * * c <= b'7'
135+ }
136+
137+ fn decimal_reducer_usize ( r : usize , c : & u8 ) -> usize {
138+ r * 10 + usize:: from ( * c - b'0' )
139+ }
140+
141+ fn decimal_reducer_u32 ( r : u32 , c : & u8 ) -> u32 {
142+ r * 10 + u32:: from ( * c - b'0' )
143+ }
144+
145+ fn octal_reducer_u32 ( r : u32 , c : & u8 ) -> u32 {
146+ r * 8 + u32:: from ( * c - b'0' )
147+ }
148+
129149impl < ' a > LineReader < ' a > {
130150 fn is_empty ( & self ) -> bool {
131151 self . buf . is_empty ( )
@@ -188,15 +208,15 @@ impl<'a> LineReader<'a> {
188208 // NUMS_PAT = re.compile(r'^@@ -([0-9]+),?([0-9]+)? \+([0-9]+),?([0-9]+)? @@')
189209 let iter = & mut buf. iter ( ) ;
190210 let old_start = iter
191- . take_while ( | & & c| c >= b'0' && c <= b'9' )
192- . fold ( 0 , |r , & c| r * 10 + u32 :: from ( c - b'0' ) ) ;
211+ . take_while ( is_digit )
212+ . fold ( 0 , decimal_reducer_u32 ) ;
193213
194214 let c = * iter
195215 . next ( )
196216 . ok_or_else ( || ParsepatchError :: InvalidHunkHeader ( self . get_line ( ) ) ) ?;
197- let old_lines = if c >= b'0' && c <= b'9' {
198- iter. take_while ( | & & c| c >= b'0' && c <= b'9' )
199- . fold ( u32:: from ( c - b'0' ) , |r , & c| r * 10 + u32 :: from ( c - b'0' ) )
217+ let old_lines = if is_digit ( & & c ) {
218+ iter. take_while ( is_digit )
219+ . fold ( u32:: from ( c - b'0' ) , decimal_reducer_u32 )
200220 } else {
201221 1
202222 } ;
@@ -206,15 +226,15 @@ impl<'a> LineReader<'a> {
206226 }
207227
208228 let new_start = iter
209- . take_while ( | & & c| c >= b'0' && c <= b'9' )
210- . fold ( 0 , |r , & c| r * 10 + u32 :: from ( c - b'0' ) ) ;
229+ . take_while ( is_digit )
230+ . fold ( 0 , decimal_reducer_u32 ) ;
211231
212232 let c = * iter
213233 . next ( )
214234 . ok_or_else ( || ParsepatchError :: InvalidHunkHeader ( self . get_line ( ) ) ) ?;
215- let new_lines = if c >= b'0' && c <= b'9' {
216- iter. take_while ( | & & c| c >= b'0' && c <= b'9' )
217- . fold ( u32:: from ( c - b'0' ) , |r , & c| r * 10 + u32 :: from ( c - b'0' ) )
235+ let new_lines = if is_digit ( & & c ) {
236+ iter. take_while ( is_digit )
237+ . fold ( u32:: from ( c - b'0' ) , decimal_reducer_u32 )
218238 } else {
219239 1
220240 } ;
@@ -290,8 +310,8 @@ impl<'a> LineReader<'a> {
290310 // the following number is an octal number with 6 digits (so max is 8^6 - 1)
291311 let buf = unsafe { self . buf . get_unchecked ( start. len ( ) ..) } ;
292312 buf. iter ( )
293- . take_while ( | & & c| c >= b'0' && c <= b'7' )
294- . fold ( 0 , |r , & c| r * 8 + u32 :: from ( c - b'0' ) )
313+ . take_while ( is_octal_digit )
314+ . fold ( 0 , octal_reducer_u32 )
295315 }
296316}
297317
@@ -659,8 +679,8 @@ impl<'a> PatchReader<'a> {
659679
660680 fn parse_usize ( buf : & [ u8 ] ) -> usize {
661681 buf. iter ( )
662- . take_while ( | & & c| c >= b'0' && c <= b'9' )
663- . fold ( 0 , |r , & c| r * 10 + usize :: from ( c - b'0' ) )
682+ . take_while ( is_digit )
683+ . fold ( 0 , decimal_reducer_usize )
664684 }
665685
666686 fn skip_binary ( & mut self ) -> Vec < BinaryHunk > {
0 commit comments