@@ -284,7 +284,7 @@ unsafe impl<'a> Searcher<'a> for CharSearcher<'a> {
284284 #[ inline]
285285 fn next ( & mut self ) -> SearchStep {
286286 let old_finger = self . finger ;
287- let slice = unsafe { self . haystack . get_unchecked ( old_finger..self . haystack . len ( ) ) } ;
287+ let slice = unsafe { self . haystack . get_unchecked ( old_finger..self . finger_back ) } ;
288288 let mut iter = slice. chars ( ) ;
289289 let old_len = iter. iter . len ( ) ;
290290 if let Some ( ch) = iter. next ( ) {
@@ -304,7 +304,8 @@ unsafe impl<'a> Searcher<'a> for CharSearcher<'a> {
304304 fn next_match ( & mut self ) -> Option < ( usize , usize ) > {
305305 loop {
306306 // get the haystack after the last character found
307- let bytes = if let Some ( slice) = self . haystack . as_bytes ( ) . get ( self . finger ..) {
307+ let bytes = if let Some ( slice) = self . haystack . as_bytes ( )
308+ . get ( self . finger ..self . finger_back ) {
308309 slice
309310 } else {
310311 return None ;
@@ -340,7 +341,7 @@ unsafe impl<'a> Searcher<'a> for CharSearcher<'a> {
340341 }
341342 } else {
342343 // found nothing, exit
343- self . finger = self . haystack . len ( ) ;
344+ self . finger = self . finger_back ;
344345 return None ;
345346 }
346347 }
@@ -353,7 +354,7 @@ unsafe impl<'a> ReverseSearcher<'a> for CharSearcher<'a> {
353354 #[ inline]
354355 fn next_back ( & mut self ) -> SearchStep {
355356 let old_finger = self . finger_back ;
356- let slice = unsafe { self . haystack . slice_unchecked ( 0 , old_finger) } ;
357+ let slice = unsafe { self . haystack . slice_unchecked ( self . finger , old_finger) } ;
357358 let mut iter = slice. chars ( ) ;
358359 let old_len = iter. iter . len ( ) ;
359360 if let Some ( ch) = iter. next_back ( ) {
@@ -374,14 +375,17 @@ unsafe impl<'a> ReverseSearcher<'a> for CharSearcher<'a> {
374375 let haystack = self . haystack . as_bytes ( ) ;
375376 loop {
376377 // get the haystack up to but not including the last character searched
377- let bytes = if let Some ( slice) = haystack. get ( ..self . finger_back ) {
378+ let bytes = if let Some ( slice) = haystack. get ( self . finger ..self . finger_back ) {
378379 slice
379380 } else {
380381 return None ;
381382 } ;
382383 // the last byte of the utf8 encoded needle
383384 let last_byte = unsafe { * self . utf8_encoded . get_unchecked ( self . utf8_size - 1 ) } ;
384385 if let Some ( index) = memchr:: memrchr ( last_byte, bytes) {
386+ // we searched a slice that was offset by self.finger,
387+ // add self.finger to recoup the original index
388+ let index = self . finger + index;
385389 // memrchr will return the index of the byte we wish to
386390 // find. In case of an ASCII character, this is indeed
387391 // were we wish our new finger to be ("after" the found
@@ -412,7 +416,7 @@ unsafe impl<'a> ReverseSearcher<'a> for CharSearcher<'a> {
412416 // found the last byte when searching in reverse.
413417 self . finger_back = index;
414418 } else {
415- self . finger_back = 0 ;
419+ self . finger_back = self . finger ;
416420 // found nothing, exit
417421 return None ;
418422 }
0 commit comments