aboutsummaryrefslogtreecommitdiff
path: root/internal/cond/eval.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/cond/eval.go')
-rw-r--r--internal/cond/eval.go30
1 files changed, 23 insertions, 7 deletions
diff --git a/internal/cond/eval.go b/internal/cond/eval.go
index b0ee828..f241504 100644
--- a/internal/cond/eval.go
+++ b/internal/cond/eval.go
@@ -164,17 +164,33 @@ func (c *Cond) evalLeaf(n *node, f Facts) (ok bool, reason, warn string, caps []
subj = f.Rel()
word = "path"
}
- subj = norm.Name(subj, c.opt.Fold)
+ if n.kind == kPath {
+ subj = norm.Name(subj, c.opt.Fold)
+ for _, p := range n.patterns {
+ if p.re.MatchString(subj) {
+ return true, word + ` "` + p.src + `"`, "", nil
+ }
+ }
+ return false, "", "", nil
+ }
+ // A name test matches the folded name, but its captures are read
+ // back from the original, so {1} keeps the name's diacritics.
+ folded := norm.Folded{Text: subj}
+ if c.opt.Fold {
+ folded = norm.FoldMapped(subj)
+ }
for _, p := range n.patterns {
- m := p.re.FindStringSubmatch(subj)
- if m == nil {
+ loc := p.re.FindStringSubmatchIndex(folded.Text)
+ if loc == nil {
continue
}
- reason = word + ` "` + p.src + `"`
- if n.kind == kName {
- return true, reason, "", m
+ caps := make([]string, len(loc)/2)
+ for g := range caps {
+ if loc[2*g] >= 0 {
+ caps[g] = folded.Source(loc[2*g], loc[2*g+1])
+ }
}
- return true, reason, "", nil
+ return true, word + ` "` + p.src + `"`, "", caps
}
return false, "", "", nil