aboutsummaryrefslogtreecommitdiff
path: root/internal/engine/facts.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/engine/facts.go')
-rw-r--r--internal/engine/facts.go19
1 files changed, 19 insertions, 0 deletions
diff --git a/internal/engine/facts.go b/internal/engine/facts.go
index 6540fdd..d20a34d 100644
--- a/internal/engine/facts.go
+++ b/internal/engine/facts.go
@@ -179,6 +179,10 @@ type facts struct {
// absolute, for a front end that offers to act on the other copy.
dupOriginal string
+ // folded memoises the folded form of this file's name and path, which
+ // every name test of every rule would otherwise recompute.
+ folded map[string]norm.Folded
+
contentDone bool // extraction was attempted
contentErr error // why it failed
partialErr error // extract.ErrPartial: a keyword not found may be in the unread part
@@ -192,6 +196,21 @@ func newFacts(run *matchRun, file scan.File) *facts {
return &facts{run: run, file: file}
}
+// Folded is the file's name or path folded for comparison, worked out once
+// however many name tests ask for it. facts belongs to one file and one
+// goroutine, so no lock is needed.
+func (f *facts) Folded(subj string) norm.Folded {
+ if v, ok := f.folded[subj]; ok {
+ return v
+ }
+ v := norm.FoldMapped(subj)
+ if f.folded == nil {
+ f.folded = make(map[string]norm.Folded, 2)
+ }
+ f.folded[subj] = v
+ return v
+}
+
func (f *facts) Name() string { return f.file.Name }
func (f *facts) Rel() string { return f.file.Rel }
func (f *facts) Size() int64 { return f.file.Size }