@@ -284,7 +284,7 @@ unsafe impl<'a> Searcher<'a> for CharSearcher<'a> {
284
284
#[ inline]
285
285
fn next ( & mut self ) -> SearchStep {
286
286
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 ) } ;
288
288
let mut iter = slice. chars ( ) ;
289
289
let old_len = iter. iter . len ( ) ;
290
290
if let Some ( ch) = iter. next ( ) {
@@ -304,7 +304,8 @@ unsafe impl<'a> Searcher<'a> for CharSearcher<'a> {
304
304
fn next_match ( & mut self ) -> Option < ( usize , usize ) > {
305
305
loop {
306
306
// 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 ) {
308
309
slice
309
310
} else {
310
311
return None ;
@@ -340,7 +341,7 @@ unsafe impl<'a> Searcher<'a> for CharSearcher<'a> {
340
341
}
341
342
} else {
342
343
// found nothing, exit
343
- self . finger = self . haystack . len ( ) ;
344
+ self . finger = self . finger_back ;
344
345
return None ;
345
346
}
346
347
}
@@ -353,7 +354,7 @@ unsafe impl<'a> ReverseSearcher<'a> for CharSearcher<'a> {
353
354
#[ inline]
354
355
fn next_back ( & mut self ) -> SearchStep {
355
356
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) } ;
357
358
let mut iter = slice. chars ( ) ;
358
359
let old_len = iter. iter . len ( ) ;
359
360
if let Some ( ch) = iter. next_back ( ) {
@@ -374,14 +375,17 @@ unsafe impl<'a> ReverseSearcher<'a> for CharSearcher<'a> {
374
375
let haystack = self . haystack . as_bytes ( ) ;
375
376
loop {
376
377
// 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 ) {
378
379
slice
379
380
} else {
380
381
return None ;
381
382
} ;
382
383
// the last byte of the utf8 encoded needle
383
384
let last_byte = unsafe { * self . utf8_encoded . get_unchecked ( self . utf8_size - 1 ) } ;
384
385
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;
385
389
// memrchr will return the index of the byte we wish to
386
390
// find. In case of an ASCII character, this is indeed
387
391
// were we wish our new finger to be ("after" the found
@@ -412,7 +416,7 @@ unsafe impl<'a> ReverseSearcher<'a> for CharSearcher<'a> {
412
416
// found the last byte when searching in reverse.
413
417
self . finger_back = index;
414
418
} else {
415
- self . finger_back = 0 ;
419
+ self . finger_back = self . finger ;
416
420
// found nothing, exit
417
421
return None ;
418
422
}
0 commit comments