@@ -35,52 +35,27 @@ impl Display for StringView<'_, '_> {
3535impl StringView < ' _ , ' _ > {
3636 pub fn matches ( & self , search : & [ Vec < & [ u8 ] > ] ) -> Result < bool , IxxError > {
3737 let mut self_parts_start = 0 ;
38- // byte offset into self.parts[self_parts_start] to resume from
3938 let mut self_parts_start_str_idx = 0 ;
40- // single-part matches leave self_parts_start on the matched label,
41- // a subsequent multi-part segment needs to start at the next label
42- let mut prev_was_single_part = false ;
4339
4440 for segment in search {
45- // for eg: "programs.vim" each dot-component matches a full label exactly
46- if segment. len ( ) > 1 {
47- if prev_was_single_part {
48- self_parts_start += 1 ;
49- self_parts_start_str_idx = 0 ;
50-
51- prev_was_single_part = false ;
52- }
53- for part in segment {
54- if self_parts_start >= self . parts . len ( ) {
55- return Ok ( false ) ;
56- }
57- let self_part = self . index . resolve_reference ( self . parts [ self_parts_start] ) ?;
58- if !eq_ignore_ascii_case ( & self_part. data , part) {
59- return Ok ( false ) ;
60- }
61- self_parts_start += 1 ;
62- }
63- } else {
64- // bare word or trailing wildcard: substring should match across remaining labels
65- let part = & segment[ 0 ] ;
41+ for part in segment {
6642 ' outer: {
6743 for ( self_part_idx, self_part) in self . parts [ self_parts_start..] . iter ( ) . enumerate ( ) {
6844 let self_part = self . index . resolve_reference ( * self_part) ?;
6945
7046 if let Some ( idx) = ascii_ignore_case_find ( & self_part. data [ self_parts_start_str_idx..] , part) {
7147 self_parts_start += self_part_idx;
72- self_parts_start_str_idx = if self_part_idx == 0 {
73- self_parts_start_str_idx + idx
48+ if self_part_idx == 0 {
49+ self_parts_start_str_idx += idx;
7450 } else {
75- idx
76- } ;
51+ self_parts_start_str_idx = 0 ;
52+ }
7753 break ' outer;
7854 }
7955 self_parts_start_str_idx = 0 ;
8056 }
8157 return Ok ( false ) ;
8258 }
83- prev_was_single_part = true ;
8459 }
8560 }
8661
0 commit comments