You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ircmatch.go 1.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package ircmatch
  2. import enfa "github.com/goshuirc/e-nfa"
  3. // Matcher represents an object that can match IRC strings.
  4. type Matcher struct {
  5. internalENFA *enfa.ENFA
  6. }
  7. // MakeMatch creates a Matcher.
  8. func MakeMatch(globTemplate string) Matcher {
  9. var newmatch Matcher
  10. // assemble internal enfa
  11. newmatch.internalENFA = enfa.NewENFA(0, false)
  12. var currentState int
  13. var lastWasStar bool
  14. for _, char := range globTemplate {
  15. if char == '*' {
  16. if lastWasStar {
  17. continue
  18. }
  19. newmatch.internalENFA.AddTransition(currentState, "*", currentState)
  20. lastWasStar = true
  21. continue
  22. } else if char == '?' {
  23. newmatch.internalENFA.AddState(currentState+1, false)
  24. newmatch.internalENFA.AddTransition(currentState, "?", currentState+1)
  25. currentState++
  26. } else {
  27. newmatch.internalENFA.AddState(currentState+1, false)
  28. newmatch.internalENFA.AddTransition(currentState, string(char), currentState+1)
  29. currentState++
  30. }
  31. lastWasStar = false
  32. }
  33. // create end state
  34. newmatch.internalENFA.AddState(currentState+1, true)
  35. newmatch.internalENFA.AddTransition(currentState, "", currentState+1)
  36. return newmatch
  37. }
  38. // Match returns true if the given string matches this glob.
  39. func (menfa *Matcher) Match(search string) bool {
  40. var searchChars []string
  41. for _, char := range search {
  42. searchChars = append(searchChars, string(char))
  43. }
  44. isMatch := menfa.internalENFA.VerifyInputs(searchChars)
  45. menfa.internalENFA.Reset()
  46. return isMatch
  47. }