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.

glob.go 1.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Copyright (c) 2020 Shivaram Lingamneni <slingamn@cs.stanford.edu>
  2. // released under the MIT license
  3. package utils
  4. import (
  5. "bytes"
  6. "regexp"
  7. "regexp/syntax"
  8. )
  9. // yet another glob implementation in Go
  10. func addRegexp(buf *bytes.Buffer, glob string, submatch bool) (err error) {
  11. for _, r := range glob {
  12. switch r {
  13. case '*':
  14. if submatch {
  15. buf.WriteString("(.*)")
  16. } else {
  17. buf.WriteString(".*")
  18. }
  19. case '?':
  20. if submatch {
  21. buf.WriteString("(.)")
  22. } else {
  23. buf.WriteString(".")
  24. }
  25. case 0xFFFD:
  26. return &syntax.Error{Code: syntax.ErrInvalidUTF8, Expr: glob}
  27. default:
  28. buf.WriteString(regexp.QuoteMeta(string(r)))
  29. }
  30. }
  31. return
  32. }
  33. func CompileGlob(glob string, submatch bool) (result *regexp.Regexp, err error) {
  34. var buf bytes.Buffer
  35. buf.WriteByte('^')
  36. err = addRegexp(&buf, glob, submatch)
  37. if err != nil {
  38. return
  39. }
  40. buf.WriteByte('$')
  41. return regexp.Compile(buf.String())
  42. }
  43. func CompileMasks(masks []string) (result *regexp.Regexp, err error) {
  44. var buf bytes.Buffer
  45. buf.WriteString("^(")
  46. for i, mask := range masks {
  47. err = addRegexp(&buf, mask, false)
  48. if err != nil {
  49. return
  50. }
  51. if i != len(masks)-1 {
  52. buf.WriteByte('|')
  53. }
  54. }
  55. buf.WriteString(")$")
  56. return regexp.Compile(buf.String())
  57. }