@@ -30,7 +30,7 @@ use std::io::fs::{mod, PathExtensions};
30
30
use std:: path:: is_sep;
31
31
use std:: string:: String ;
32
32
33
- use PatternToken :: { Char , AnyChar , AnySequence , AnyWithin , AnyExcept } ;
33
+ use PatternToken :: { Char , AnyChar , AnySequence , AnyRecursiveSequence , AnyWithin , AnyExcept } ;
34
34
use CharSpecifier :: { SingleChar , CharRange } ;
35
35
use MatchResult :: { Match , SubPatternDoesntMatch , EntirePatternDoesntMatch } ;
36
36
@@ -192,7 +192,8 @@ pub struct Pattern {
192
192
enum PatternToken {
193
193
Char ( char ) ,
194
194
AnyChar ,
195
- AnySequence ( bool ) ,
195
+ AnySequence ,
196
+ AnyRecursiveSequence ,
196
197
AnyWithin ( Vec < CharSpecifier > ) ,
197
198
AnyExcept ( Vec < CharSpecifier > )
198
199
}
@@ -248,23 +249,23 @@ impl Pattern {
248
249
i += 1 ;
249
250
}
250
251
'*' => {
251
- let old = i;
252
+ let old = i;
252
253
253
- while i < chars. len ( ) && chars[ i] == '*' {
254
- i += 1 ;
255
- }
254
+ while i < chars. len ( ) && chars[ i] == '*' {
255
+ i += 1 ;
256
+ }
256
257
257
- let count = i - old;
258
+ let count = i - old;
258
259
259
- if count > 2 {
260
- for _ in range ( 0 u, count) {
261
- tokens. push ( Char ( '*' ) ) ;
260
+ if count > 2 {
261
+ for _ in range ( 0 u, count) {
262
+ tokens. push ( Char ( '*' ) ) ;
263
+ }
264
+ } else if count == 2 {
265
+ tokens. push ( AnyRecursiveSequence ) ;
266
+ } else {
267
+ tokens. push ( AnySequence ) ;
262
268
}
263
- } else if count == 2 {
264
- tokens. push ( AnySequence ( true ) ) ;
265
- } else {
266
- tokens. push ( AnySequence ( false ) ) ;
267
- }
268
269
}
269
270
'[' => {
270
271
@@ -382,7 +383,7 @@ impl Pattern {
382
383
383
384
for ( ti, token) in self . tokens . slice_from ( i) . iter ( ) . enumerate ( ) {
384
385
match * token {
385
- AnySequence ( recursive ) => {
386
+ AnySequence | AnyRecursiveSequence => {
386
387
loop {
387
388
match self . matches_from ( prev_char. get ( ) , file, i + ti + 1 , options) {
388
389
SubPatternDoesntMatch => ( ) , // keep trying
@@ -394,9 +395,12 @@ impl Pattern {
394
395
Some ( pair) => pair
395
396
} ;
396
397
397
- if !recursive && require_literal ( c) {
398
- return SubPatternDoesntMatch ;
398
+ if let AnySequence = * token {
399
+ if require_literal ( c) {
400
+ return SubPatternDoesntMatch ;
401
+ }
399
402
}
403
+
400
404
prev_char. set ( Some ( c) ) ;
401
405
file = next;
402
406
}
@@ -426,7 +430,7 @@ impl Pattern {
426
430
Char ( c2) => {
427
431
chars_eq ( c, c2, options. case_sensitive )
428
432
}
429
- AnySequence ( _ ) => {
433
+ AnySequence | AnyRecursiveSequence => {
430
434
unreachable ! ( )
431
435
}
432
436
} ;
0 commit comments