mirror of
https://github.com/ergochat/ergo.git
synced 2024-11-11 06:29:29 +01:00
58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
|
package ircmatch
|
||
|
|
||
|
import enfa "github.com/goshuirc/e-nfa"
|
||
|
|
||
|
// Matcher represents an object that can match IRC strings.
|
||
|
type Matcher struct {
|
||
|
internalENFA *enfa.ENFA
|
||
|
}
|
||
|
|
||
|
// MakeMatch creates a Matcher.
|
||
|
func MakeMatch(globTemplate string) Matcher {
|
||
|
var newmatch Matcher
|
||
|
|
||
|
// assemble internal enfa
|
||
|
newmatch.internalENFA = enfa.NewENFA(0, false)
|
||
|
|
||
|
var currentState int
|
||
|
var lastWasStar bool
|
||
|
for _, char := range globTemplate {
|
||
|
if char == '*' {
|
||
|
if lastWasStar {
|
||
|
continue
|
||
|
}
|
||
|
newmatch.internalENFA.AddTransition(currentState, "*", currentState)
|
||
|
lastWasStar = true
|
||
|
continue
|
||
|
} else if char == '?' {
|
||
|
newmatch.internalENFA.AddState(currentState+1, false)
|
||
|
newmatch.internalENFA.AddTransition(currentState, "?", currentState+1)
|
||
|
currentState++
|
||
|
} else {
|
||
|
newmatch.internalENFA.AddState(currentState+1, false)
|
||
|
newmatch.internalENFA.AddTransition(currentState, string(char), currentState+1)
|
||
|
currentState++
|
||
|
}
|
||
|
|
||
|
lastWasStar = false
|
||
|
}
|
||
|
|
||
|
// create end state
|
||
|
newmatch.internalENFA.AddState(currentState+1, true)
|
||
|
newmatch.internalENFA.AddTransition(currentState, "", currentState+1)
|
||
|
|
||
|
return newmatch
|
||
|
}
|
||
|
|
||
|
// Match returns true if the given string matches this glob.
|
||
|
func (menfa *Matcher) Match(search string) bool {
|
||
|
var searchChars []string
|
||
|
for _, char := range search {
|
||
|
searchChars = append(searchChars, string(char))
|
||
|
}
|
||
|
|
||
|
isMatch := menfa.internalENFA.VerifyInputs(searchChars)
|
||
|
menfa.internalENFA.Reset()
|
||
|
return isMatch
|
||
|
}
|