This commit is contained in:
Shivaram Lingamneni
2020-05-13 03:41:00 -04:00
parent 21958768d8
commit be0dedf260
12 changed files with 199 additions and 437 deletions
+38 -6
View File
@@ -11,21 +11,53 @@ import (
// yet another glob implementation in Go
func CompileGlob(glob string) (result *regexp.Regexp, err error) {
var buf bytes.Buffer
buf.WriteByte('^')
func addRegexp(buf *bytes.Buffer, glob string, submatch bool) (err error) {
for _, r := range glob {
switch r {
case '*':
buf.WriteString("(.*)")
if submatch {
buf.WriteString("(.*)")
} else {
buf.WriteString(".*")
}
case '?':
buf.WriteString("(.)")
if submatch {
buf.WriteString("(.)")
} else {
buf.WriteString(".")
}
case 0xFFFD:
return nil, &syntax.Error{Code: syntax.ErrInvalidUTF8, Expr: glob}
return &syntax.Error{Code: syntax.ErrInvalidUTF8, Expr: glob}
default:
buf.WriteString(regexp.QuoteMeta(string(r)))
}
}
return
}
func CompileGlob(glob string, submatch bool) (result *regexp.Regexp, err error) {
var buf bytes.Buffer
buf.WriteByte('^')
err = addRegexp(&buf, glob, submatch)
if err != nil {
return
}
buf.WriteByte('$')
return regexp.Compile(buf.String())
}
func CompileMasks(masks []string) (result *regexp.Regexp, err error) {
var buf bytes.Buffer
buf.WriteString("^(")
for i, mask := range masks {
err = addRegexp(&buf, mask, false)
if err != nil {
return
}
if i != len(masks)-1 {
buf.WriteByte('|')
}
}
buf.WriteString(")$")
return regexp.Compile(buf.String())
}